From 94cfda5062c222254f0395f61ffd1e447de65aa7 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 13 Jun 2007 08:28:44 +0000 Subject: [PATCH] --- build/linux/JUCE.make | 2194 ++ build/linux/Makefile | 25 + build/linux/juce_premake.lua | 138 + .../juce_linux_Audio.cpp | 962 + .../juce_linux_AudioCDReader.cpp | 110 + .../juce_linux_FileChooser.cpp | 60 + .../juce_linux_Files.cpp | 603 + .../juce_linux_Fonts.cpp | 627 + .../juce_linux_Messaging.cpp | 399 + .../juce_linux_Midi.cpp | 453 + .../juce_linux_NamedPipe.cpp | 33 + .../juce_linux_Network.cpp | 59 + .../juce_linux_SystemStats.cpp | 402 + .../juce_linux_Threads.cpp | 457 + .../juce_linux_Windowing.cpp | 3076 +++ .../platform_specific_code/linuxincludes.h | 54 + build/linux/runpremake | 1 + build/macosx/Juce.xcodeproj/project.pbxproj | 3187 +++ build/macosx/juce.xcconfig.tortoise.removed | 6 + .../juce_mac_CoreAudio.cpp | 1165 + .../juce_mac_CoreMidi.cpp | 594 + .../juce_mac_FileChooser.cpp | 299 + .../platform_specific_code/juce_mac_Files.cpp | 977 + .../platform_specific_code/juce_mac_Fonts.cpp | 529 + .../juce_mac_HTTPStream.h | 394 + .../juce_mac_Messaging.cpp | 342 + .../juce_mac_NamedPipe.cpp | 237 + .../juce_mac_Network.cpp | 138 + .../juce_mac_SystemStats.cpp | 297 + .../juce_mac_Threads.cpp | 364 + .../juce_mac_Windowing.cpp | 3061 +++ build/win32/devcpp/Makefile.win | 979 + build/win32/devcpp/juce.dev | 6759 +++++ .../juce_win32_ASIO.cpp | 1947 ++ .../juce_win32_AudioCDReader.cpp | 2114 ++ .../juce_win32_DirectSound.cpp | 1754 ++ .../juce_win32_DynamicLibraryLoader.cpp | 57 + .../juce_win32_DynamicLibraryLoader.h | 68 + .../juce_win32_FileChooser.cpp | 492 + .../juce_win32_Files.cpp | 960 + .../juce_win32_Fonts.cpp | 662 + .../juce_win32_Messaging.cpp | 247 + .../juce_win32_Midi.cpp | 656 + .../juce_win32_Misc.cpp | 120 + .../juce_win32_Network.cpp | 339 + .../juce_win32_PlatformUtils.cpp | 291 + .../juce_win32_SystemStats.cpp | 605 + .../juce_win32_Threads.cpp | 390 + .../juce_win32_Windowing.cpp | 3536 +++ .../platform_specific_code/win32_headers.h | 76 + build/win32/vc6/JUCE.dsp | 2901 +++ build/win32/vc8/JUCE.vcproj | 6086 +++++ docs/JUCE changelist.txt | 683 + docs/JUCE readme.html | 273 + docs/gpl.txt | 340 + docs/images/rms_logo.gif | Bin 0 -> 3515 bytes docs/rawmat.css | 193 + .../How to use this framework.txt | 265 + .../demo/build/AudioUnit/Info-JuceAU.plist | 28 + .../demo/build/AudioUnit/JuceAU.exp | 9 + .../JuceDemoAU.xcodeproj/project.pbxproj | 609 + .../demo/build/RTAS_Mac/Info.plist | 32 + .../juce_RTASDemo.xcodeproj/project.pbxproj | 414 + .../demo/build/RTAS_Win32/juce_RTAS.sln | 49 + .../demo/build/RTAS_Win32/juce_RTAS.vcproj | 649 + .../demo/build/RTAS_Win32/juce_RTASDemo.rc | 112 + .../demo/build/RTAS_Win32/resource.h | 14 + .../demo/build/VST_Mac/Info.plist | 28 + .../demo/build/VST_Mac/JuceVST-Info.plist | 22 + .../VST_Mac/JuceVST.xcodeproj/project.pbxproj | 301 + .../demo/build/VST_Mac/version.plist | 16 + .../demo/build/VST_Win32/juce_vst.sln | 39 + .../demo/build/VST_Win32/juce_vst.vcproj | 288 + .../demo/src/DemoEditorComponent.cpp | 210 + .../demo/src/DemoEditorComponent.h | 99 + .../audio plugins/demo/src/DemoJuceFilter.cpp | 254 + .../audio plugins/demo/src/DemoJuceFilter.h | 111 + .../demo/src/JucePluginCharacteristics.h | 274 + .../AudioUnit/juce_AudioUnitWrapper.cpp | 827 + .../formats/AudioUnit/juce_AudioUnitWrapper.r | 70 + .../wrapper/formats/RTAS/DefaultResourceFile | Bin 0 -> 3198 bytes .../wrapper/formats/RTAS/DummyResourceFile.r | 4 + .../formats/RTAS/juce_RTASCompileFlags.h | 63 + .../formats/RTAS/juce_RTASUtilities.cpp | 131 + .../wrapper/formats/RTAS/juce_RTASWrapper.cpp | 1011 + .../formats/RTAS/juce_RTAS_dlldefs.def | 5 + .../wrappers/juce_Wrapper_CEffectGroup.cpp | 44 + .../juce_Wrapper_CEffectGroupMIDI.cpp | 44 + .../juce_Wrapper_CEffectMIDIUtils.cpp | 44 + .../wrappers/juce_Wrapper_CEffectProcess.cpp | 44 + .../juce_Wrapper_CEffectProcessAS.cpp | 44 + .../juce_Wrapper_CEffectProcessMIDI.cpp | 44 + .../wrappers/juce_Wrapper_CEffectType.cpp | 44 + .../wrappers/juce_Wrapper_CEffectTypeRTAS.cpp | 44 + .../wrappers/juce_Wrapper_ChunkDataParser.cpp | 44 + .../RTAS/wrappers/juce_Wrapper_DLLMain.cpp | 46 + .../wrappers/juce_Wrapper_DefaultSwap.cpp | 46 + .../RTAS/wrappers/juce_Wrapper_Dispatcher.cpp | 40 + .../RTAS/wrappers/juce_Wrapper_Header.h | 45 + .../wrappers/juce_Wrapper_PlugInUtils.cpp | 44 + .../juce_Wrapper_PluginInitialize.cpp | 40 + .../Standalone/juce_AudioFilterStreamer.cpp | 179 + .../Standalone/juce_AudioFilterStreamer.h | 129 + .../juce_StandaloneFilterWindow.cpp | 295 + .../Standalone/juce_StandaloneFilterWindow.h | 96 + .../wrapper/formats/VST/juce_VstWrapper.cpp | 1290 + .../wrapper/juce_AudioFilterBase.cpp | 173 + .../wrapper/juce_AudioFilterBase.h | 536 + .../wrapper/juce_AudioFilterEditor.cpp | 49 + .../wrapper/juce_AudioFilterEditor.h | 79 + .../wrapper/juce_IncludeCharacteristics.h | 98 + extras/binarybuilder/BinaryBuilder.cpp | 222 + extras/binarybuilder/vc8/BinaryBuilder.sln | 39 + extras/binarybuilder/vc8/BinaryBuilder.vcproj | 122 + extras/example projects/common/Main.cpp | 160 + .../English.lproj/InfoPlist.strings | Bin 0 -> 274 bytes .../example_project_for_Mac/Info.plist | 24 + .../project.pbxproj | 276 + .../example_project_for_Mac/version.plist | 16 + .../juce_application.dsp | 107 + .../juce_application.dsw | 44 + .../juce_application.sln | 49 + .../juce_application.vcproj | 233 + extras/example projects/readme.txt | 5 + extras/juce demo/build/linux/JuceDemo.make | 147 + extras/juce demo/build/linux/Makefile | 25 + .../build/linux/jucedemo_premake.lua | 49 + extras/juce demo/build/linux/runpremake | 1 + .../macosx/English.lproj/InfoPlist.strings | Bin 0 -> 512 bytes extras/juce demo/build/macosx/Info.plist | 24 + .../macosx/jucedemo.xcodeproj/project.pbxproj | 387 + extras/juce demo/build/macosx/version.plist | 16 + .../juce demo/build/win32_devcpp/JuceDemo.dev | 209 + .../juce demo/build/win32_devcpp/Makefile.win | 66 + extras/juce demo/build/win32_vc6/jucedemo.dsp | 168 + extras/juce demo/build/win32_vc6/jucedemo.dsw | 44 + extras/juce demo/build/win32_vc8/jucedemo.sln | 39 + .../juce demo/build/win32_vc8/jucedemo.vcproj | 453 + extras/juce demo/src/ApplicationStartup.cpp | 178 + extras/juce demo/src/BinaryData.cpp | 7816 ++++++ extras/juce demo/src/BinaryData.h | 61 + extras/juce demo/src/MainDemoWindow.cpp | 607 + extras/juce demo/src/MainDemoWindow.h | 56 + extras/juce demo/src/binarydata/AudioDemo.cpp | 640 + .../src/binarydata/DragAndDropDemo.cpp | 239 + .../src/binarydata/FontsAndTextDemo.cpp | 215 + .../src/binarydata/InterprocessCommsDemo.cpp | 334 + .../juce demo/src/binarydata/OpenGLDemo.cpp | 257 + .../src/binarydata/PathsAndTransformsDemo.cpp | 384 + .../src/binarydata/QuickTimeDemo.cpp | 129 + .../README - what this directory is for.txt | 7 + extras/juce demo/src/binarydata/TableDemo.cpp | 329 + .../src/binarydata/ThreadingDemo.cpp | 354 + .../juce demo/src/binarydata/TreeViewDemo.cpp | 184 + .../juce demo/src/binarydata/WidgetsDemo.cpp | 1335 + extras/juce demo/src/binarydata/cello.wav | Bin 0 -> 46348 bytes .../src/binarydata/demo table data.xml | 49 + extras/juce demo/src/binarydata/icons.zip | Bin 0 -> 83876 bytes extras/juce demo/src/binarydata/juce.png | Bin 0 -> 15290 bytes extras/juce demo/src/binarydata/treedemo.xml | 50 + extras/juce demo/src/demos/AudioDemo.cpp | 640 + .../juce demo/src/demos/DragAndDropDemo.cpp | 239 + .../juce demo/src/demos/FontsAndTextDemo.cpp | 215 + .../src/demos/InterprocessCommsDemo.cpp | 334 + extras/juce demo/src/demos/OpenGLDemo.cpp | 257 + .../src/demos/PathsAndTransformsDemo.cpp | 384 + extras/juce demo/src/demos/QuickTimeDemo.cpp | 129 + extras/juce demo/src/demos/TableDemo.cpp | 329 + extras/juce demo/src/demos/ThreadingDemo.cpp | 354 + extras/juce demo/src/demos/TreeViewDemo.cpp | 184 + extras/juce demo/src/demos/WidgetsDemo.cpp | 1335 + extras/juce demo/src/jucedemo_headers.h | 62 + extras/the jucer/Jucer To Do list.txt | 28 + extras/the jucer/build/linux/Jucer.make | 255 + extras/the jucer/build/linux/Makefile | 25 + .../the jucer/build/linux/jucer_premake.lua | 61 + extras/the jucer/build/linux/runpremake | 1 + .../build/mac/English.lproj/InfoPlist.strings | Bin 0 -> 212 bytes extras/the jucer/build/mac/Info.plist | 26 + .../build/mac/Jucer.xcodeproj/project.pbxproj | 642 + extras/the jucer/build/mac/jucer_icon.icns | Bin 0 -> 44212 bytes extras/the jucer/build/mac/version.plist | 16 + extras/the jucer/build/vc6/Jucer.dsp | 549 + extras/the jucer/build/vc6/Jucer.dsw | 44 + extras/the jucer/build/vc6/jucer.rc | 2 + extras/the jucer/build/vc6/jucer_icon.ico | Bin 0 -> 15086 bytes extras/the jucer/build/vc8/jucer.rc | 2 + extras/the jucer/build/vc8/jucer.sln | 39 + extras/the jucer/build/vc8/jucer.vcproj | 699 + extras/the jucer/build/vc8/jucer_icon.ico | Bin 0 -> 15086 bytes extras/the jucer/src/BinaryData.cpp | 914 + extras/the jucer/src/BinaryData.h | 22 + extras/the jucer/src/binarydata/jules.jpg | Bin 0 -> 24218 bytes .../the jucer/src/binarydata/prefs_about.png | Bin 0 -> 1819 bytes .../the jucer/src/binarydata/prefs_keys.png | Bin 0 -> 3794 bytes .../the jucer/src/binarydata/prefs_misc.png | Bin 0 -> 6162 bytes extras/the jucer/src/jucer_Headers.h | 67 + extras/the jucer/src/jucer_Main.cpp | 118 + .../model/components/jucer_ButtonHandler.h | 406 + .../model/components/jucer_ComboBoxHandler.h | 455 + .../components/jucer_ComponentNameProperty.h | 225 + .../components/jucer_ComponentTypeHandler.cpp | 541 + .../components/jucer_ComponentTypeHandler.h | 153 + .../jucer_ComponentUndoableAction.h | 100 + .../jucer_GenericComponentHandler.h | 259 + .../components/jucer_GroupComponentHandler.h | 248 + .../components/jucer_HyperlinkButtonHandler.h | 169 + .../components/jucer_JucerComponentHandler.h | 295 + .../src/model/components/jucer_LabelHandler.h | 668 + .../model/components/jucer_SliderHandler.h | 679 + .../components/jucer_TabbedComponentHandler.h | 1166 + .../components/jucer_TextButtonHandler.h | 109 + .../components/jucer_TextEditorHandler.h | 452 + .../components/jucer_ToggleButtonHandler.h | 161 + .../model/components/jucer_TreeViewHandler.h | 282 + .../model/components/jucer_ViewportHandler.h | 689 + .../model/documents/jucer_ButtonDocument.cpp | 442 + .../model/documents/jucer_ButtonDocument.h | 90 + .../documents/jucer_ComponentDocument.cpp | 178 + .../model/documents/jucer_ComponentDocument.h | 77 + .../src/model/jucer_BinaryResources.cpp | 359 + .../src/model/jucer_BinaryResources.h | 113 + .../src/model/jucer_ComponentLayout.cpp | 866 + .../src/model/jucer_ComponentLayout.h | 139 + .../src/model/jucer_GeneratedCode.cpp | 383 + .../the jucer/src/model/jucer_GeneratedCode.h | 109 + .../src/model/jucer_JucerDocument.cpp | 664 + .../the jucer/src/model/jucer_JucerDocument.h | 210 + .../the jucer/src/model/jucer_ObjectTypes.cpp | 282 + .../the jucer/src/model/jucer_ObjectTypes.h | 76 + .../src/model/jucer_PaintRoutine.cpp | 638 + .../the jucer/src/model/jucer_PaintRoutine.h | 126 + .../paintelements/jucer_ColouredElement.cpp | 1050 + .../paintelements/jucer_ColouredElement.h | 95 + .../jucer_ElementSiblingComponent.h | 70 + .../model/paintelements/jucer_FillType.cpp | 363 + .../src/model/paintelements/jucer_FillType.h | 94 + .../jucer_GradientPointComponent.h | 120 + .../jucer_ImageResourceProperty.h | 105 + .../paintelements/jucer_PaintElement.cpp | 485 + .../model/paintelements/jucer_PaintElement.h | 143 + .../paintelements/jucer_PaintElementEllipse.h | 182 + .../paintelements/jucer_PaintElementGroup.h | 268 + .../paintelements/jucer_PaintElementImage.h | 536 + .../paintelements/jucer_PaintElementPath.cpp | 1703 ++ .../paintelements/jucer_PaintElementPath.h | 207 + .../jucer_PaintElementRectangle.h | 190 + .../jucer_PaintElementRoundedRectangle.h | 277 + .../paintelements/jucer_PaintElementText.h | 578 + .../jucer_PaintElementUndoableAction.h | 160 + .../paintelements/jucer_PointComponent.h | 128 + .../model/paintelements/jucer_StrokeType.cpp | 206 + .../model/paintelements/jucer_StrokeType.h | 72 + .../jucer_ColourPropertyComponent.h | 102 + .../jucer_ComponentBooleanProperty.h | 72 + .../jucer_ComponentChoiceProperty.h | 70 + .../jucer_ComponentColourProperty.h | 188 + .../properties/jucer_ComponentTextProperty.h | 72 + .../jucer_FilePropertyComponent.cpp | 69 + .../properties/jucer_FilePropertyComponent.h | 68 + .../jucer_FontPropertyComponent.cpp | 153 + .../properties/jucer_FontPropertyComponent.h | 72 + .../properties/jucer_JustificationProperty.h | 118 + .../properties/jucer_PositionPropertyBase.h | 478 + .../src/templates/jucer_ComponentTemplate.cpp | 70 + .../src/templates/jucer_ComponentTemplate.h | 69 + extras/the jucer/src/ui/jucer_CommandIDs.h | 82 + .../src/ui/jucer_ComponentLayoutEditor.cpp | 424 + .../src/ui/jucer_ComponentLayoutEditor.h | 95 + .../src/ui/jucer_ComponentLayoutPanel.cpp | 132 + .../src/ui/jucer_ComponentLayoutPanel.h | 64 + .../ui/jucer_ComponentOverlayComponent.cpp | 267 + .../src/ui/jucer_ComponentOverlayComponent.h | 102 + .../src/ui/jucer_EditingPanelBase.cpp | 241 + .../the jucer/src/ui/jucer_EditingPanelBase.h | 86 + .../src/ui/jucer_JucerDocumentHolder.cpp | 1316 + .../src/ui/jucer_JucerDocumentHolder.h | 107 + extras/the jucer/src/ui/jucer_MainWindow.cpp | 486 + extras/the jucer/src/ui/jucer_MainWindow.h | 87 + .../src/ui/jucer_PaintRoutineEditor.cpp | 314 + .../src/ui/jucer_PaintRoutineEditor.h | 98 + .../src/ui/jucer_PaintRoutinePanel.cpp | 200 + .../src/ui/jucer_PaintRoutinePanel.h | 65 + extras/the jucer/src/ui/jucer_PrefsPanel.cpp | 195 + extras/the jucer/src/ui/jucer_PrefsPanel.h | 51 + .../src/ui/jucer_ResourceEditorPanel.cpp | 292 + .../src/ui/jucer_ResourceEditorPanel.h | 79 + .../src/ui/jucer_SnapGridPainter.cpp | 98 + .../the jucer/src/ui/jucer_SnapGridPainter.h | 65 + .../the jucer/src/ui/jucer_TestComponent.cpp | 188 + extras/the jucer/src/ui/jucer_TestComponent.h | 89 + .../src/utility/jucer_ColourEditorComponent.h | 194 + extras/the jucer/src/utility/jucer_Colours.h | 168 + .../src/utility/jucer_StoredSettings.cpp | 125 + .../src/utility/jucer_StoredSettings.h | 69 + .../src/utility/jucer_UtilityFunctions.cpp | 736 + .../src/utility/jucer_UtilityFunctions.h | 118 + juce.h | 229 + juce_Config.h | 179 + src/juce_DefineMacros.h | 69 + src/juce_WithoutMacros.h | 73 + src/juce_app_includes.h | 660 + .../application/juce_Application.cpp | 351 + .../application/juce_Application.h | 281 + .../application/juce_ApplicationCommandID.h | 89 + .../juce_ApplicationCommandInfo.cpp | 79 + .../application/juce_ApplicationCommandInfo.h | 202 + .../juce_ApplicationCommandManager.cpp | 342 + .../juce_ApplicationCommandManager.h | 373 + .../juce_ApplicationCommandTarget.cpp | 208 + .../juce_ApplicationCommandTarget.h | 270 + .../juce_ApplicationProperties.cpp | 171 + .../application/juce_ApplicationProperties.h | 157 + .../application/juce_DeletedAtShutdown.cpp | 91 + .../application/juce_DeletedAtShutdown.h | 76 + .../application/juce_PropertiesFile.cpp | 302 + .../application/juce_PropertiesFile.h | 184 + .../application/juce_SystemClipboard.h | 56 + .../audio_file_formats/flac/Flac Licence.txt | 49 + .../audio/audio_file_formats/flac/all.h | 329 + .../audio/audio_file_formats/flac/assert.h | 45 + .../audio/audio_file_formats/flac/callback.h | 184 + .../audio/audio_file_formats/flac/export.h | 87 + .../audio/audio_file_formats/flac/format.h | 985 + .../flac/libFLAC/bitbuffer.c | 2549 ++ .../audio_file_formats/flac/libFLAC/bitmath.c | 156 + .../audio_file_formats/flac/libFLAC/cpu.c | 199 + .../audio_file_formats/flac/libFLAC/crc.c | 160 + .../audio_file_formats/flac/libFLAC/fixed.c | 433 + .../audio_file_formats/flac/libFLAC/float.c | 314 + .../audio_file_formats/flac/libFLAC/format.c | 580 + .../flac/libFLAC/include/private/all.h | 48 + .../flac/libFLAC/include/private/bitbuffer.h | 151 + .../flac/libFLAC/include/private/bitmath.h | 42 + .../flac/libFLAC/include/private/cpu.h | 94 + .../flac/libFLAC/include/private/crc.h | 57 + .../flac/libFLAC/include/private/fixed.h | 97 + .../flac/libFLAC/include/private/float.h | 97 + .../flac/libFLAC/include/private/format.h | 44 + .../flac/libFLAC/include/private/lpc.h | 214 + .../flac/libFLAC/include/private/md5.h | 48 + .../flac/libFLAC/include/private/memory.h | 56 + .../flac/libFLAC/include/private/metadata.h | 45 + .../include/private/stream_encoder_framing.h | 45 + .../flac/libFLAC/include/private/window.h | 71 + .../flac/libFLAC/include/protected/all.h | 38 + .../include/protected/stream_decoder.h | 58 + .../include/protected/stream_encoder.h | 109 + .../flac/libFLAC/juce_FlacHeader.h | 42 + .../flac/libFLAC/lpc_flac.c | 462 + .../audio_file_formats/flac/libFLAC/md5.c | 320 + .../audio_file_formats/flac/libFLAC/memory.c | 201 + .../flac/libFLAC/stream_decoder.c | 3324 +++ .../flac/libFLAC/stream_encoder.c | 4721 ++++ .../flac/libFLAC/stream_encoder_framing.c | 523 + .../flac/libFLAC/window_flac.c | 231 + .../audio/audio_file_formats/flac/metadata.h | 2112 ++ .../audio/audio_file_formats/flac/ordinals.h | 80 + .../audio_file_formats/flac/stream_decoder.h | 1559 ++ .../audio_file_formats/flac/stream_encoder.h | 1756 ++ .../juce_AiffAudioFormat.cpp | 846 + .../audio_file_formats/juce_AiffAudioFormat.h | 80 + .../audio_file_formats/juce_AudioCDReader.cpp | 252 + .../audio_file_formats/juce_AudioCDReader.h | 187 + .../audio_file_formats/juce_AudioFormat.cpp | 499 + .../audio_file_formats/juce_AudioFormat.h | 178 + .../juce_AudioFormatManager.cpp | 231 + .../juce_AudioFormatManager.h | 150 + .../juce_AudioFormatReader.h | 202 + .../juce_AudioFormatWriter.h | 169 + .../juce_AudioSubsectionReader.cpp | 105 + .../juce_AudioSubsectionReader.h | 100 + .../juce_FlacAudioFormat.cpp | 536 + .../audio_file_formats/juce_FlacAudioFormat.h | 81 + .../juce_OggVorbisAudioFormat.cpp | 454 + .../juce_OggVorbisAudioFormat.h | 94 + .../juce_WavAudioFormat.cpp | 750 + .../audio_file_formats/juce_WavAudioFormat.h | 150 + .../oggvorbis/Ogg Vorbis Licence.txt | 47 + .../audio_file_formats/oggvorbis/bitwise.c | 789 + .../audio_file_formats/oggvorbis/codec.h | 239 + .../oggvorbis/config_types.h | 10 + .../audio_file_formats/oggvorbis/framing.c | 1801 ++ .../oggvorbis/juce_OggVorbisHeader.h | 40 + .../oggvorbis/libvorbis-1.1.2/AUTHORS | 3 + .../oggvorbis/libvorbis-1.1.2/COPYING | 28 + .../oggvorbis/libvorbis-1.1.2/README | 132 + .../oggvorbis/libvorbis-1.1.2/lib/analysis.c | 113 + .../oggvorbis/libvorbis-1.1.2/lib/backends.h | 144 + .../oggvorbis/libvorbis-1.1.2/lib/bitrate.c | 259 + .../oggvorbis/libvorbis-1.1.2/lib/bitrate.h | 59 + .../oggvorbis/libvorbis-1.1.2/lib/block.c | 993 + .../lib/books/coupled/res_books_stereo.h | 20988 ++++++++++++++++ .../lib/books/floor/floor_books.h | 1837 ++ .../lib/books/uncoupled/res_books_uncoupled.h | 11516 +++++++++ .../oggvorbis/libvorbis-1.1.2/lib/codebook.c | 621 + .../oggvorbis/libvorbis-1.1.2/lib/codebook.h | 160 + .../libvorbis-1.1.2/lib/codec_internal.h | 136 + .../oggvorbis/libvorbis-1.1.2/lib/envelope.c | 383 + .../oggvorbis/libvorbis-1.1.2/lib/envelope.h | 80 + .../oggvorbis/libvorbis-1.1.2/lib/floor0.c | 227 + .../oggvorbis/libvorbis-1.1.2/lib/floor1.c | 1090 + .../oggvorbis/libvorbis-1.1.2/lib/highlevel.h | 56 + .../oggvorbis/libvorbis-1.1.2/lib/info.c | 612 + .../oggvorbis/libvorbis-1.1.2/lib/lookup.c | 99 + .../oggvorbis/libvorbis-1.1.2/lib/lookup.h | 32 + .../libvorbis-1.1.2/lib/lookup_data.h | 189 + .../oggvorbis/libvorbis-1.1.2/lib/lookups.pl | 142 + .../oggvorbis/libvorbis-1.1.2/lib/lpc.c | 150 + .../oggvorbis/libvorbis-1.1.2/lib/lpc.h | 29 + .../oggvorbis/libvorbis-1.1.2/lib/lsp.c | 461 + .../oggvorbis/libvorbis-1.1.2/lib/lsp.h | 28 + .../oggvorbis/libvorbis-1.1.2/lib/mapping0.c | 848 + .../oggvorbis/libvorbis-1.1.2/lib/masking.h | 785 + .../oggvorbis/libvorbis-1.1.2/lib/mdct.c | 568 + .../oggvorbis/libvorbis-1.1.2/lib/mdct.h | 71 + .../oggvorbis/libvorbis-1.1.2/lib/misc.h | 48 + .../libvorbis-1.1.2/lib/modes/floor_all.h | 247 + .../libvorbis-1.1.2/lib/modes/psych_11.h | 50 + .../libvorbis-1.1.2/lib/modes/psych_16.h | 126 + .../libvorbis-1.1.2/lib/modes/psych_44.h | 666 + .../libvorbis-1.1.2/lib/modes/psych_8.h | 101 + .../libvorbis-1.1.2/lib/modes/residue_16.h | 163 + .../libvorbis-1.1.2/lib/modes/residue_44.h | 292 + .../libvorbis-1.1.2/lib/modes/residue_44u.h | 318 + .../libvorbis-1.1.2/lib/modes/residue_8.h | 97 + .../libvorbis-1.1.2/lib/modes/setup_11.h | 140 + .../libvorbis-1.1.2/lib/modes/setup_16.h | 149 + .../libvorbis-1.1.2/lib/modes/setup_22.h | 128 + .../libvorbis-1.1.2/lib/modes/setup_32.h | 132 + .../libvorbis-1.1.2/lib/modes/setup_44.h | 106 + .../libvorbis-1.1.2/lib/modes/setup_44u.h | 74 + .../libvorbis-1.1.2/lib/modes/setup_8.h | 145 + .../libvorbis-1.1.2/lib/modes/setup_X.h | 225 + .../oggvorbis/libvorbis-1.1.2/lib/os.h | 156 + .../oggvorbis/libvorbis-1.1.2/lib/psy.c | 1228 + .../oggvorbis/libvorbis-1.1.2/lib/psy.h | 185 + .../oggvorbis/libvorbis-1.1.2/lib/registry.c | 50 + .../oggvorbis/libvorbis-1.1.2/lib/registry.h | 32 + .../oggvorbis/libvorbis-1.1.2/lib/res0.c | 909 + .../oggvorbis/libvorbis-1.1.2/lib/scales.h | 85 + .../libvorbis-1.1.2/lib/sharedbook.c | 739 + .../oggvorbis/libvorbis-1.1.2/lib/smallft.c | 1260 + .../oggvorbis/libvorbis-1.1.2/lib/smallft.h | 34 + .../oggvorbis/libvorbis-1.1.2/lib/synthesis.c | 174 + .../oggvorbis/libvorbis-1.1.2/lib/vorbisenc.c | 1189 + .../libvorbis-1.1.2/lib/vorbisfile.c | 1988 ++ .../oggvorbis/libvorbis-1.1.2/lib/window.c | 2140 ++ .../oggvorbis/libvorbis-1.1.2/lib/window.h | 26 + .../audio/audio_file_formats/oggvorbis/ogg.h | 196 + .../audio_file_formats/oggvorbis/os_types.h | 127 + .../audio_file_formats/oggvorbis/vorbisenc.h | 110 + .../audio_file_formats/oggvorbis/vorbisfile.h | 141 + .../juce_AudioFormatReaderSource.cpp | 140 + .../juce_AudioFormatReaderSource.h | 120 + .../audio/audio_sources/juce_AudioSource.h | 141 + .../audio_sources/juce_AudioSourcePlayer.cpp | 187 + .../audio_sources/juce_AudioSourcePlayer.h | 117 + .../juce_AudioTransportSource.cpp | 307 + .../audio_sources/juce_AudioTransportSource.h | 183 + .../juce_BufferingAudioSource.cpp | 366 + .../audio_sources/juce_BufferingAudioSource.h | 118 + .../juce_ChannelRemappingAudioSource.cpp | 213 + .../juce_ChannelRemappingAudioSource.h | 161 + .../juce_IIRFilterAudioSource.cpp | 93 + .../audio_sources/juce_IIRFilterAudioSource.h | 85 + .../audio_sources/juce_MixerAudioSource.cpp | 171 + .../audio_sources/juce_MixerAudioSource.h | 132 + .../juce_PositionableAudioSource.h | 84 + .../juce_ResamplingAudioSource.cpp | 246 + .../juce_ResamplingAudioSource.h | 111 + .../juce_ToneGeneratorAudioSource.cpp | 94 + .../juce_ToneGeneratorAudioSource.h | 86 + .../audio/devices/juce_AudioDeviceManager.cpp | 591 + .../audio/devices/juce_AudioDeviceManager.h | 368 + .../audio/devices/juce_AudioIODevice.cpp | 64 + .../audio/devices/juce_AudioIODevice.h | 312 + .../audio/devices/juce_AudioIODeviceType.cpp | 69 + .../audio/devices/juce_AudioIODeviceType.h | 146 + .../audio/devices/juce_MidiInput.h | 180 + .../audio/devices/juce_MidiOutput.h | 127 + .../audio/dsp/juce_AudioDataConverters.cpp | 320 + .../audio/dsp/juce_AudioDataConverters.h | 99 + .../audio/dsp/juce_AudioSampleBuffer.cpp | 592 + .../audio/dsp/juce_AudioSampleBuffer.h | 334 + .../audio/dsp/juce_IIRFilter.cpp | 251 + .../audio/dsp/juce_IIRFilter.h | 140 + .../audio/midi/juce_MidiBuffer.cpp | 299 + .../audio/midi/juce_MidiBuffer.h | 230 + .../audio/midi/juce_MidiFile.cpp | 472 + .../audio/midi/juce_MidiFile.h | 202 + .../audio/midi/juce_MidiKeyboardState.cpp | 205 + .../audio/midi/juce_MidiKeyboardState.h | 221 + .../audio/midi/juce_MidiMessage.cpp | 1103 + .../audio/midi/juce_MidiMessage.h | 909 + .../audio/midi/juce_MidiMessageCollector.cpp | 171 + .../audio/midi/juce_MidiMessageCollector.h | 115 + .../audio/midi/juce_MidiMessageSequence.cpp | 358 + .../audio/midi/juce_MidiMessageSequence.h | 289 + .../audio/synthesisers/juce_Sampler.cpp | 255 + .../audio/synthesisers/juce_Sampler.h | 163 + .../audio/synthesisers/juce_Synthesiser.cpp | 358 + .../audio/synthesisers/juce_Synthesiser.h | 471 + .../documents/juce_FileBasedDocument.cpp | 277 + .../documents/juce_FileBasedDocument.h | 304 + .../juce_RecentlyOpenedFilesList.cpp | 151 + .../documents/juce_RecentlyOpenedFilesList.h | 166 + .../documents/juce_SelectedItemSet.h | 327 + .../documents/juce_UndoManager.cpp | 291 + .../documents/juce_UndoManager.h | 234 + .../documents/juce_UndoableAction.h | 97 + .../events/juce_ActionBroadcaster.cpp | 76 + .../events/juce_ActionBroadcaster.h | 89 + .../events/juce_ActionListener.h | 62 + .../events/juce_ActionListenerList.cpp | 118 + .../events/juce_ActionListenerList.h | 102 + .../events/juce_AsyncUpdater.cpp | 79 + .../events/juce_AsyncUpdater.h | 122 + .../events/juce_ChangeBroadcaster.cpp | 87 + .../events/juce_ChangeBroadcaster.h | 104 + .../events/juce_ChangeListener.h | 65 + .../events/juce_ChangeListenerList.cpp | 113 + .../events/juce_ChangeListenerList.h | 125 + .../events/juce_InterprocessConnection.cpp | 375 + .../events/juce_InterprocessConnection.h | 209 + .../juce_InterprocessConnectionServer.cpp | 103 + .../juce_InterprocessConnectionServer.h | 106 + src/juce_appframework/events/juce_Message.cpp | 59 + src/juce_appframework/events/juce_Message.h | 93 + .../events/juce_MessageListener.cpp | 71 + .../events/juce_MessageListener.h | 99 + .../events/juce_MessageManager.cpp | 355 + .../events/juce_MessageManager.h | 292 + .../events/juce_MultiTimer.cpp | 148 + .../events/juce_MultiTimer.h | 137 + src/juce_appframework/events/juce_Timer.cpp | 390 + src/juce_appframework/events/juce_Timer.h | 136 + .../components/buttons/juce_ArrowButton.cpp | 82 + .../gui/components/buttons/juce_ArrowButton.h | 88 + .../gui/components/buttons/juce_Button.cpp | 721 + .../gui/components/buttons/juce_Button.h | 502 + .../buttons/juce_DrawableButton.cpp | 313 + .../components/buttons/juce_DrawableButton.h | 191 + .../buttons/juce_HyperlinkButton.cpp | 121 + .../components/buttons/juce_HyperlinkButton.h | 126 + .../components/buttons/juce_ImageButton.cpp | 252 + .../gui/components/buttons/juce_ImageButton.h | 176 + .../components/buttons/juce_ShapeButton.cpp | 138 + .../gui/components/buttons/juce_ShapeButton.h | 119 + .../components/buttons/juce_TextButton.cpp | 100 + .../gui/components/buttons/juce_TextButton.h | 113 + .../components/buttons/juce_ToggleButton.cpp | 71 + .../components/buttons/juce_ToggleButton.h | 101 + .../components/buttons/juce_ToolbarButton.cpp | 99 + .../components/buttons/juce_ToolbarButton.h | 98 + .../gui/components/controls/juce_ComboBox.cpp | 592 + .../gui/components/controls/juce_ComboBox.h | 381 + .../gui/components/controls/juce_Label.cpp | 444 + .../gui/components/controls/juce_Label.h | 310 + .../gui/components/controls/juce_ListBox.cpp | 923 + .../gui/components/controls/juce_ListBox.h | 552 + .../components/controls/juce_ProgressBar.cpp | 118 + .../components/controls/juce_ProgressBar.h | 122 + .../gui/components/controls/juce_Slider.cpp | 1282 + .../gui/components/controls/juce_Slider.h | 677 + .../components/controls/juce_SliderListener.h | 84 + .../controls/juce_TableHeaderComponent.cpp | 936 + .../controls/juce_TableHeaderComponent.h | 423 + .../components/controls/juce_TableListBox.cpp | 547 + .../components/controls/juce_TableListBox.h | 317 + .../components/controls/juce_TextEditor.cpp | 2439 ++ .../gui/components/controls/juce_TextEditor.h | 605 + .../gui/components/controls/juce_Toolbar.cpp | 918 + .../gui/components/controls/juce_Toolbar.h | 317 + .../controls/juce_ToolbarItemComponent.cpp | 280 + .../controls/juce_ToolbarItemComponent.h | 219 + .../controls/juce_ToolbarItemFactory.h | 117 + .../controls/juce_ToolbarItemPalette.cpp | 134 + .../controls/juce_ToolbarItemPalette.h | 87 + .../gui/components/controls/juce_TreeView.cpp | 1270 + .../gui/components/controls/juce_TreeView.h | 582 + .../juce_DirectoryContentsList.cpp | 311 + .../filebrowser/juce_DirectoryContentsList.h | 216 + .../filebrowser/juce_FileBrowserComponent.cpp | 510 + .../filebrowser/juce_FileBrowserComponent.h | 209 + .../filebrowser/juce_FileBrowserListener.h | 63 + .../filebrowser/juce_FileChooser.cpp | 172 + .../components/filebrowser/juce_FileChooser.h | 198 + .../filebrowser/juce_FileChooserDialogBox.cpp | 191 + .../filebrowser/juce_FileChooserDialogBox.h | 156 + .../filebrowser/juce_FileFilter.cpp | 56 + .../components/filebrowser/juce_FileFilter.h | 82 + .../filebrowser/juce_FileListComponent.cpp | 395 + .../filebrowser/juce_FileListComponent.h | 131 + .../filebrowser/juce_FilePreviewComponent.h | 78 + .../filebrowser/juce_FilenameComponent.cpp | 234 + .../filebrowser/juce_FilenameComponent.h | 219 + .../juce_ImagePreviewComponent.cpp | 143 + .../filebrowser/juce_ImagePreviewComponent.h | 79 + .../filebrowser/juce_WildcardFileFilter.cpp | 80 + .../filebrowser/juce_WildcardFileFilter.h | 84 + .../gui/components/juce_Component.cpp | 3743 +++ .../gui/components/juce_Component.h | 2082 ++ .../juce_ComponentDeletionWatcher.h | 80 + .../gui/components/juce_ComponentListener.cpp | 65 + .../gui/components/juce_ComponentListener.h | 107 + .../gui/components/juce_Desktop.cpp | 307 + .../gui/components/juce_Desktop.h | 225 + .../components/keyboard/juce_KeyListener.cpp | 45 + .../components/keyboard/juce_KeyListener.h | 77 + .../juce_KeyMappingEditorComponent.cpp | 551 + .../keyboard/juce_KeyMappingEditorComponent.h | 143 + .../gui/components/keyboard/juce_KeyPress.cpp | 267 + .../gui/components/keyboard/juce_KeyPress.h | 250 + .../keyboard/juce_KeyPressMappingSet.cpp | 427 + .../keyboard/juce_KeyPressMappingSet.h | 275 + .../keyboard/juce_KeyboardFocusTraverser.cpp | 141 + .../keyboard/juce_KeyboardFocusTraverser.h | 88 + .../components/keyboard/juce_ModifierKeys.cpp | 89 + .../components/keyboard/juce_ModifierKeys.h | 182 + .../layout/juce_ComponentAnimator.cpp | 241 + .../layout/juce_ComponentAnimator.h | 137 + .../juce_ComponentBoundsConstrainer.cpp | 358 + .../layout/juce_ComponentBoundsConstrainer.h | 197 + .../layout/juce_ComponentMovementWatcher.cpp | 149 + .../layout/juce_ComponentMovementWatcher.h | 103 + .../components/layout/juce_GroupComponent.cpp | 98 + .../components/layout/juce_GroupComponent.h | 111 + .../layout/juce_MultiDocumentPanel.cpp | 544 + .../layout/juce_MultiDocumentPanel.h | 261 + .../layout/juce_ResizableBorderComponent.cpp | 235 + .../layout/juce_ResizableBorderComponent.h | 129 + .../layout/juce_ResizableCornerComponent.cpp | 120 + .../layout/juce_ResizableCornerComponent.h | 103 + .../gui/components/layout/juce_ScrollBar.cpp | 456 + .../gui/components/layout/juce_ScrollBar.h | 303 + .../layout/juce_StretchableLayoutManager.cpp | 356 + .../layout/juce_StretchableLayoutManager.h | 280 + .../juce_StretchableLayoutResizerBar.cpp | 88 + .../layout/juce_StretchableLayoutResizerBar.h | 108 + .../layout/juce_StretchableObjectResizer.cpp | 137 + .../layout/juce_StretchableObjectResizer.h | 113 + .../layout/juce_TabbedButtonBar.cpp | 545 + .../components/layout/juce_TabbedButtonBar.h | 277 + .../layout/juce_TabbedComponent.cpp | 357 + .../components/layout/juce_TabbedComponent.h | 236 + .../gui/components/layout/juce_Viewport.cpp | 333 + .../gui/components/layout/juce_Viewport.h | 249 + .../lookandfeel/juce_LookAndFeel.cpp | 2101 ++ .../components/lookandfeel/juce_LookAndFeel.h | 519 + .../lookandfeel/juce_ShinyLookAndFeel.cpp | 1085 + .../lookandfeel/juce_ShinyLookAndFeel.h | 187 + .../menus/juce_MenuBarComponent.cpp | 453 + .../components/menus/juce_MenuBarComponent.h | 130 + .../components/menus/juce_MenuBarModel.cpp | 114 + .../gui/components/menus/juce_MenuBarModel.h | 178 + .../gui/components/menus/juce_PopupMenu.cpp | 1846 ++ .../gui/components/menus/juce_PopupMenu.h | 403 + .../menus/juce_PopupMenuCustomComponent.h | 96 + .../mouse/juce_ComponentDragger.cpp | 92 + .../components/mouse/juce_ComponentDragger.h | 110 + .../mouse/juce_DragAndDropContainer.cpp | 480 + .../mouse/juce_DragAndDropContainer.h | 189 + .../components/mouse/juce_DragAndDropTarget.h | 142 + .../components/mouse/juce_LassoComponent.h | 239 + .../gui/components/mouse/juce_MouseCursor.cpp | 203 + .../gui/components/mouse/juce_MouseCursor.h | 165 + .../gui/components/mouse/juce_MouseEvent.cpp | 169 + .../gui/components/mouse/juce_MouseEvent.h | 283 + .../mouse/juce_MouseHoverDetector.cpp | 157 + .../mouse/juce_MouseHoverDetector.h | 134 + .../components/mouse/juce_MouseListener.cpp | 72 + .../gui/components/mouse/juce_MouseListener.h | 180 + .../gui/components/mouse/juce_TooltipClient.h | 92 + .../juce_BooleanPropertyComponent.cpp | 81 + .../juce_BooleanPropertyComponent.h | 89 + .../juce_ButtonPropertyComponent.cpp | 64 + .../properties/juce_ButtonPropertyComponent.h | 88 + .../juce_ChoicePropertyComponent.cpp | 88 + .../properties/juce_ChoicePropertyComponent.h | 116 + .../properties/juce_PropertyComponent.cpp | 72 + .../properties/juce_PropertyComponent.h | 127 + .../properties/juce_PropertyPanel.cpp | 421 + .../properties/juce_PropertyPanel.h | 163 + .../juce_SliderPropertyComponent.cpp | 73 + .../properties/juce_SliderPropertyComponent.h | 99 + .../properties/juce_TextPropertyComponent.cpp | 120 + .../properties/juce_TextPropertyComponent.h | 89 + .../special/juce_ActiveXControlComponent.h | 130 + .../juce_AudioDeviceSelectorComponent.cpp | 546 + .../juce_AudioDeviceSelectorComponent.h | 117 + .../special/juce_BubbleComponent.cpp | 218 + .../components/special/juce_BubbleComponent.h | 170 + .../special/juce_BubbleMessageComponent.cpp | 139 + .../special/juce_BubbleMessageComponent.h | 144 + .../special/juce_ColourSelector.cpp | 634 + .../components/special/juce_ColourSelector.h | 158 + .../components/special/juce_DropShadower.cpp | 367 + .../components/special/juce_DropShadower.h | 114 + .../special/juce_MagnifierComponent.cpp | 334 + .../special/juce_MagnifierComponent.h | 123 + .../special/juce_MidiKeyboardComponent.cpp | 875 + .../special/juce_MidiKeyboardComponent.h | 419 + .../special/juce_OpenGLComponent.cpp | 279 + .../components/special/juce_OpenGLComponent.h | 136 + .../special/juce_PreferencesPanel.cpp | 200 + .../special/juce_PreferencesPanel.h | 155 + .../special/juce_QuickTimeMovieComponent.cpp | 852 + .../special/juce_QuickTimeMovieComponent.h | 211 + .../special/juce_SystemTrayIconComponent.cpp | 54 + .../special/juce_SystemTrayIconComponent.h | 90 + .../components/windows/juce_AlertWindow.cpp | 664 + .../gui/components/windows/juce_AlertWindow.h | 360 + .../components/windows/juce_ComponentPeer.cpp | 587 + .../components/windows/juce_ComponentPeer.h | 362 + .../components/windows/juce_DialogWindow.cpp | 112 + .../components/windows/juce_DialogWindow.h | 131 + .../windows/juce_DocumentWindow.cpp | 391 + .../components/windows/juce_DocumentWindow.h | 264 + .../windows/juce_ResizableWindow.cpp | 537 + .../components/windows/juce_ResizableWindow.h | 345 + .../components/windows/juce_SplashScreen.cpp | 125 + .../components/windows/juce_SplashScreen.h | 153 + .../windows/juce_ThreadWithProgressWindow.cpp | 102 + .../windows/juce_ThreadWithProgressWindow.h | 163 + .../components/windows/juce_TooltipWindow.cpp | 173 + .../components/windows/juce_TooltipWindow.h | 120 + .../windows/juce_TopLevelWindow.cpp | 396 + .../components/windows/juce_TopLevelWindow.h | 178 + .../gui/graphics/brushes/juce_Brush.cpp | 76 + .../gui/graphics/brushes/juce_Brush.h | 106 + .../graphics/brushes/juce_GradientBrush.cpp | 109 + .../gui/graphics/brushes/juce_GradientBrush.h | 115 + .../gui/graphics/brushes/juce_ImageBrush.cpp | 227 + .../gui/graphics/brushes/juce_ImageBrush.h | 98 + .../brushes/juce_SolidColourBrush.cpp | 123 + .../graphics/brushes/juce_SolidColourBrush.h | 114 + .../gui/graphics/colour/juce_Colour.cpp | 488 + .../gui/graphics/colour/juce_Colour.h | 330 + .../graphics/colour/juce_ColourGradient.cpp | 198 + .../gui/graphics/colour/juce_ColourGradient.h | 163 + .../gui/graphics/colour/juce_Colours.cpp | 339 + .../gui/graphics/colour/juce_Colours.h | 115 + .../gui/graphics/colour/juce_PixelFormats.h | 406 + .../gui/graphics/contexts/juce_EdgeTable.cpp | 249 + .../gui/graphics/contexts/juce_EdgeTable.h | 310 + .../gui/graphics/contexts/juce_Graphics.cpp | 875 + .../gui/graphics/contexts/juce_Graphics.h | 689 + .../graphics/contexts/juce_Justification.cpp | 94 + .../graphics/contexts/juce_Justification.h | 181 + .../contexts/juce_LowLevelGraphicsContext.h | 129 + ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 632 + .../juce_LowLevelGraphicsPostScriptRenderer.h | 142 + .../juce_LowLevelGraphicsSoftwareRenderer.cpp | 2220 ++ .../juce_LowLevelGraphicsSoftwareRenderer.h | 169 + .../contexts/juce_RectanglePlacement.cpp | 146 + .../contexts/juce_RectanglePlacement.h | 165 + .../gui/graphics/drawables/juce_Drawable.cpp | 134 + .../gui/graphics/drawables/juce_Drawable.h | 162 + .../drawables/juce_DrawableComposite.cpp | 163 + .../drawables/juce_DrawableComposite.h | 159 + .../graphics/drawables/juce_DrawableImage.cpp | 170 + .../graphics/drawables/juce_DrawableImage.h | 131 + .../graphics/drawables/juce_DrawablePath.cpp | 155 + .../graphics/drawables/juce_DrawablePath.h | 138 + .../graphics/drawables/juce_DrawableText.cpp | 101 + .../graphics/drawables/juce_DrawableText.h | 99 + .../gui/graphics/drawables/juce_SVGParser.cpp | 1320 + .../effects/juce_DropShadowEffect.cpp | 123 + .../graphics/effects/juce_DropShadowEffect.h | 97 + .../gui/graphics/effects/juce_GlowEffect.cpp | 79 + .../gui/graphics/effects/juce_GlowEffect.h | 83 + .../graphics/effects/juce_ImageEffectFilter.h | 71 + .../effects/juce_ReduceOpacityEffect.cpp | 61 + .../effects/juce_ReduceOpacityEffect.h | 80 + .../gui/graphics/fonts/juce_Font.cpp | 330 + .../gui/graphics/fonts/juce_Font.h | 349 + .../graphics/fonts/juce_GlyphArrangement.cpp | 1225 + .../graphics/fonts/juce_GlyphArrangement.h | 333 + .../gui/graphics/fonts/juce_TextLayout.cpp | 397 + .../gui/graphics/fonts/juce_TextLayout.h | 156 + .../gui/graphics/fonts/juce_Typeface.cpp | 505 + .../gui/graphics/fonts/juce_Typeface.h | 304 + .../geometry/juce_AffineTransform.cpp | 260 + .../graphics/geometry/juce_AffineTransform.h | 185 + .../gui/graphics/geometry/juce_BorderSize.cpp | 147 + .../gui/graphics/geometry/juce_BorderSize.h | 130 + .../gui/graphics/geometry/juce_Line.cpp | 411 + .../gui/graphics/geometry/juce_Line.h | 265 + .../gui/graphics/geometry/juce_Path.cpp | 1545 ++ .../gui/graphics/geometry/juce_Path.h | 624 + .../graphics/geometry/juce_PathIterator.cpp | 304 + .../gui/graphics/geometry/juce_PathIterator.h | 123 + .../graphics/geometry/juce_PathStrokeType.cpp | 625 + .../graphics/geometry/juce_PathStrokeType.h | 173 + .../gui/graphics/geometry/juce_Point.cpp | 84 + .../gui/graphics/geometry/juce_Point.h | 93 + .../geometry/juce_PositionedRectangle.cpp | 399 + .../geometry/juce_PositionedRectangle.h | 352 + .../gui/graphics/geometry/juce_Rectangle.cpp | 359 + .../gui/graphics/geometry/juce_Rectangle.h | 239 + .../graphics/geometry/juce_RectangleList.cpp | 539 + .../graphics/geometry/juce_RectangleList.h | 261 + .../imaging/image_file_formats/jpglib/README | 385 + .../image_file_formats/jpglib/cderror.h | 132 + .../jpglib/changes to libjpeg for JUCE.txt | 16 + .../image_file_formats/jpglib/jcapimin.c | 280 + .../image_file_formats/jpglib/jcapistd.c | 161 + .../image_file_formats/jpglib/jccoefct.c | 449 + .../image_file_formats/jpglib/jccolor.c | 459 + .../image_file_formats/jpglib/jcdctmgr.c | 387 + .../image_file_formats/jpglib/jchuff.c | 909 + .../image_file_formats/jpglib/jchuff.h | 47 + .../image_file_formats/jpglib/jcinit.c | 72 + .../image_file_formats/jpglib/jcmainct.c | 293 + .../image_file_formats/jpglib/jcmarker.c | 664 + .../image_file_formats/jpglib/jcmaster.c | 590 + .../image_file_formats/jpglib/jcomapi.c | 106 + .../image_file_formats/jpglib/jconfig.h | 57 + .../image_file_formats/jpglib/jcparam.c | 610 + .../image_file_formats/jpglib/jcphuff.c | 833 + .../image_file_formats/jpglib/jcprepct.c | 354 + .../image_file_formats/jpglib/jcsample.c | 519 + .../image_file_formats/jpglib/jctrans.c | 388 + .../image_file_formats/jpglib/jdapimin.c | 395 + .../image_file_formats/jpglib/jdapistd.c | 275 + .../image_file_formats/jpglib/jdatasrc.c | 212 + .../image_file_formats/jpglib/jdcoefct.c | 736 + .../image_file_formats/jpglib/jdcolor.c | 396 + .../imaging/image_file_formats/jpglib/jdct.h | 176 + .../image_file_formats/jpglib/jddctmgr.c | 269 + .../image_file_formats/jpglib/jdhuff.c | 651 + .../image_file_formats/jpglib/jdhuff.h | 201 + .../image_file_formats/jpglib/jdinput.c | 381 + .../image_file_formats/jpglib/jdmainct.c | 512 + .../image_file_formats/jpglib/jdmarker.c | 1360 + .../image_file_formats/jpglib/jdmaster.c | 557 + .../image_file_formats/jpglib/jdmerge.c | 400 + .../image_file_formats/jpglib/jdphuff.c | 668 + .../image_file_formats/jpglib/jdpostct.c | 290 + .../image_file_formats/jpglib/jdsample.c | 478 + .../image_file_formats/jpglib/jdtrans.c | 143 + .../image_file_formats/jpglib/jerror.c | 252 + .../image_file_formats/jpglib/jerror.h | 291 + .../image_file_formats/jpglib/jfdctflt.c | 168 + .../image_file_formats/jpglib/jfdctfst.c | 224 + .../image_file_formats/jpglib/jfdctint.c | 283 + .../image_file_formats/jpglib/jidctflt.c | 242 + .../image_file_formats/jpglib/jidctfst.c | 368 + .../image_file_formats/jpglib/jidctint.c | 389 + .../image_file_formats/jpglib/jidctred.c | 398 + .../image_file_formats/jpglib/jinclude.h | 91 + .../image_file_formats/jpglib/jmemmgr.c | 1118 + .../image_file_formats/jpglib/jmemnobs.c | 109 + .../image_file_formats/jpglib/jmemsys.h | 198 + .../image_file_formats/jpglib/jmorecfg.h | 363 + .../image_file_formats/jpglib/jpegint.h | 392 + .../image_file_formats/jpglib/jpeglib.h | 1096 + .../image_file_formats/jpglib/jquant1.c | 856 + .../image_file_formats/jpglib/jquant2.c | 1310 + .../image_file_formats/jpglib/jutils.c | 179 + .../image_file_formats/jpglib/jversion.h | 14 + .../image_file_formats/jpglib/transupp.c | 928 + .../image_file_formats/jpglib/transupp.h | 135 + .../image_file_formats/juce_GIFLoader.cpp | 497 + .../image_file_formats/juce_GIFLoader.h | 88 + .../image_file_formats/juce_JPEGLoader.cpp | 296 + .../image_file_formats/juce_PNGLoader.cpp | 272 + .../imaging/image_file_formats/pnglib/LICENSE | 109 + .../pnglib/libpng_readme.txt | 2 + .../imaging/image_file_formats/pnglib/png.c | 828 + .../imaging/image_file_formats/pnglib/png.h | 3419 +++ .../image_file_formats/pnglib/pngconf.h | 1443 ++ .../image_file_formats/pnglib/pngerror.c | 295 + .../image_file_formats/pnglib/pnggccrd.c | 5408 ++++ .../image_file_formats/pnglib/pngget.c | 934 + .../image_file_formats/pnglib/pngmem.c | 595 + .../image_file_formats/pnglib/pngpread.c | 1573 ++ .../image_file_formats/pnglib/pngread.c | 1456 ++ .../image_file_formats/pnglib/pngrio.c | 161 + .../image_file_formats/pnglib/pngrtran.c | 4177 +++ .../image_file_formats/pnglib/pngrutil.c | 3124 +++ .../image_file_formats/pnglib/pngset.c | 1219 + .../image_file_formats/pnglib/pngtrans.c | 650 + .../image_file_formats/pnglib/pngvcrd.c | 3903 +++ .../image_file_formats/pnglib/pngwio.c | 228 + .../image_file_formats/pnglib/pngwrite.c | 1464 ++ .../image_file_formats/pnglib/pngwtran.c | 563 + .../image_file_formats/pnglib/pngwutil.c | 2730 ++ .../gui/graphics/imaging/juce_Image.cpp | 500 + .../gui/graphics/imaging/juce_Image.h | 293 + .../gui/graphics/imaging/juce_ImageCache.cpp | 246 + .../gui/graphics/imaging/juce_ImageCache.h | 173 + .../imaging/juce_ImageConvolutionKernel.cpp | 285 + .../imaging/juce_ImageConvolutionKernel.h | 137 + .../graphics/imaging/juce_ImageFileFormat.cpp | 224 + .../graphics/imaging/juce_ImageFileFormat.h | 208 + src/juce_core/basics/juce_Atomic.h | 224 + src/juce_core/basics/juce_DataConversions.h | 178 + src/juce_core/basics/juce_FileLogger.cpp | 137 + src/juce_core/basics/juce_FileLogger.h | 115 + src/juce_core/basics/juce_Initialisation.h | 86 + src/juce_core/basics/juce_Logger.cpp | 79 + src/juce_core/basics/juce_Logger.h | 107 + src/juce_core/basics/juce_MathsFunctions.h | 290 + src/juce_core/basics/juce_Memory.h | 172 + src/juce_core/basics/juce_PlatformDefs.h | 341 + src/juce_core/basics/juce_Random.cpp | 95 + src/juce_core/basics/juce_Random.h | 111 + src/juce_core/basics/juce_RelativeTime.cpp | 269 + src/juce_core/basics/juce_RelativeTime.h | 204 + src/juce_core/basics/juce_Singleton.h | 239 + src/juce_core/basics/juce_StandardHeader.h | 149 + src/juce_core/basics/juce_SystemStats.cpp | 140 + src/juce_core/basics/juce_SystemStats.h | 184 + src/juce_core/basics/juce_Time.cpp | 471 + src/juce_core/basics/juce_Time.h | 396 + src/juce_core/containers/juce_Array.h | 1081 + .../containers/juce_ArrayAllocationBase.h | 146 + src/juce_core/containers/juce_BitArray.cpp | 978 + src/juce_core/containers/juce_BitArray.h | 345 + .../containers/juce_ElementComparator.h | 321 + src/juce_core/containers/juce_MemoryBlock.cpp | 403 + src/juce_core/containers/juce_MemoryBlock.h | 246 + src/juce_core/containers/juce_OwnedArray.h | 735 + src/juce_core/containers/juce_PropertySet.cpp | 169 + src/juce_core/containers/juce_PropertySet.h | 193 + .../containers/juce_ReferenceCountedArray.h | 645 + .../containers/juce_ReferenceCountedObject.h | 256 + src/juce_core/containers/juce_SortedSet.h | 646 + src/juce_core/containers/juce_SparseSet.h | 360 + src/juce_core/containers/juce_VoidArray.h | 49 + src/juce_core/cryptography/juce_BlowFish.cpp | 444 + src/juce_core/cryptography/juce_BlowFish.h | 70 + src/juce_core/cryptography/juce_MD5.cpp | 388 + src/juce_core/cryptography/juce_MD5.h | 125 + src/juce_core/cryptography/juce_Primes.cpp | 216 + src/juce_core/cryptography/juce_Primes.h | 71 + src/juce_core/cryptography/juce_RSAKey.cpp | 158 + src/juce_core/cryptography/juce_RSAKey.h | 103 + .../io/files/juce_DirectoryIterator.cpp | 169 + .../io/files/juce_DirectoryIterator.h | 120 + src/juce_core/io/files/juce_File.cpp | 1129 + src/juce_core/io/files/juce_File.h | 850 + .../io/files/juce_FileInputStream.cpp | 111 + src/juce_core/io/files/juce_FileInputStream.h | 80 + .../io/files/juce_FileOutputStream.cpp | 154 + .../io/files/juce_FileOutputStream.h | 92 + .../io/files/juce_FileSearchPath.cpp | 185 + src/juce_core/io/files/juce_FileSearchPath.h | 172 + src/juce_core/io/files/juce_NamedPipe.cpp | 77 + src/juce_core/io/files/juce_NamedPipe.h | 121 + src/juce_core/io/juce_InputStream.cpp | 300 + src/juce_core/io/juce_InputStream.h | 276 + src/juce_core/io/juce_OutputStream.cpp | 283 + src/juce_core/io/juce_OutputStream.h | 243 + src/juce_core/io/network/juce_Socket.cpp | 388 + src/juce_core/io/network/juce_Socket.h | 153 + src/juce_core/io/network/juce_URL.cpp | 425 + src/juce_core/io/network/juce_URL.h | 215 + .../io/streams/juce_BufferedInputStream.cpp | 180 + .../io/streams/juce_BufferedInputStream.h | 93 + .../juce_GZIPCompressorOutputStream.cpp | 220 + .../streams/juce_GZIPCompressorOutputStream.h | 87 + .../juce_GZIPDecompressorInputStream.cpp | 253 + .../juce_GZIPDecompressorInputStream.h | 91 + .../io/streams/juce_MemoryInputStream.cpp | 89 + .../io/streams/juce_MemoryInputStream.h | 83 + .../io/streams/juce_MemoryOutputStream.cpp | 122 + .../io/streams/juce_MemoryOutputStream.h | 100 + .../io/streams/juce_SubregionStream.cpp | 102 + .../io/streams/juce_SubregionStream.h | 98 + src/juce_core/io/streams/zlib/README | 125 + src/juce_core/io/streams/zlib/adler32.c | 149 + src/juce_core/io/streams/zlib/compress.c | 79 + src/juce_core/io/streams/zlib/crc32.c | 423 + src/juce_core/io/streams/zlib/crc32.h | 441 + src/juce_core/io/streams/zlib/deflate.c | 1736 ++ src/juce_core/io/streams/zlib/deflate.h | 331 + src/juce_core/io/streams/zlib/infback.c | 623 + src/juce_core/io/streams/zlib/inffast.c | 318 + src/juce_core/io/streams/zlib/inffast.h | 11 + src/juce_core/io/streams/zlib/inffixed.h | 94 + src/juce_core/io/streams/zlib/inflate.c | 1368 + src/juce_core/io/streams/zlib/inflate.h | 115 + src/juce_core/io/streams/zlib/inftrees.c | 329 + src/juce_core/io/streams/zlib/inftrees.h | 55 + src/juce_core/io/streams/zlib/trees.c | 1219 + src/juce_core/io/streams/zlib/trees.h | 127 + src/juce_core/io/streams/zlib/uncompr.c | 61 + src/juce_core/io/streams/zlib/zconf.h | 341 + src/juce_core/io/streams/zlib/zconf.in.h | 332 + src/juce_core/io/streams/zlib/zlib.h | 1357 + src/juce_core/io/streams/zlib/zutil.c | 318 + src/juce_core/io/streams/zlib/zutil.h | 269 + .../misc/juce_PerformanceCounter.cpp | 106 + src/juce_core/misc/juce_PerformanceCounter.h | 114 + src/juce_core/misc/juce_PlatformUtilities.h | 153 + src/juce_core/misc/juce_Uuid.cpp | 175 + src/juce_core/misc/juce_Uuid.h | 129 + src/juce_core/misc/juce_ZipFile.cpp | 363 + src/juce_core/misc/juce_ZipFile.h | 160 + .../text/juce_CharacterFunctions.cpp | 766 + src/juce_core/text/juce_CharacterFunctions.h | 181 + src/juce_core/text/juce_LocalisedStrings.cpp | 157 + src/juce_core/text/juce_LocalisedStrings.h | 186 + src/juce_core/text/juce_String.cpp | 2206 ++ src/juce_core/text/juce_String.h | 1072 + src/juce_core/text/juce_StringArray.cpp | 589 + src/juce_core/text/juce_StringArray.h | 338 + src/juce_core/text/juce_StringPairArray.cpp | 139 + src/juce_core/text/juce_StringPairArray.h | 160 + src/juce_core/text/juce_XmlDocument.cpp | 963 + src/juce_core/text/juce_XmlDocument.h | 189 + src/juce_core/text/juce_XmlElement.cpp | 1163 + src/juce_core/text/juce_XmlElement.h | 667 + src/juce_core/threads/juce_CriticalSection.h | 136 + .../threads/juce_InterProcessLock.cpp | 44 + src/juce_core/threads/juce_InterProcessLock.h | 91 + src/juce_core/threads/juce_Process.h | 126 + src/juce_core/threads/juce_ReadWriteLock.cpp | 161 + src/juce_core/threads/juce_ReadWriteLock.h | 136 + src/juce_core/threads/juce_ScopedLock.h | 170 + src/juce_core/threads/juce_ScopedReadLock.h | 96 + src/juce_core/threads/juce_ScopedWriteLock.h | 96 + src/juce_core/threads/juce_Thread.cpp | 252 + src/juce_core/threads/juce_Thread.h | 280 + src/juce_core/threads/juce_ThreadPool.cpp | 404 + src/juce_core/threads/juce_ThreadPool.h | 289 + .../threads/juce_TimeSliceThread.cpp | 153 + src/juce_core/threads/juce_TimeSliceThread.h | 143 + src/juce_core/threads/juce_WaitableEvent.h | 106 + src/juce_core_includes.h | 240 + 1033 files changed, 413256 insertions(+) create mode 100644 build/linux/JUCE.make create mode 100644 build/linux/Makefile create mode 100644 build/linux/juce_premake.lua create mode 100644 build/linux/platform_specific_code/juce_linux_Audio.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_AudioCDReader.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_FileChooser.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Files.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Fonts.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Messaging.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Midi.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_NamedPipe.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Network.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_SystemStats.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Threads.cpp create mode 100644 build/linux/platform_specific_code/juce_linux_Windowing.cpp create mode 100644 build/linux/platform_specific_code/linuxincludes.h create mode 100644 build/linux/runpremake create mode 100644 build/macosx/Juce.xcodeproj/project.pbxproj create mode 100644 build/macosx/juce.xcconfig.tortoise.removed create mode 100644 build/macosx/platform_specific_code/juce_mac_CoreAudio.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_FileChooser.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_Files.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_Fonts.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_HTTPStream.h create mode 100644 build/macosx/platform_specific_code/juce_mac_Messaging.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_NamedPipe.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_Network.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_SystemStats.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_Threads.cpp create mode 100644 build/macosx/platform_specific_code/juce_mac_Windowing.cpp create mode 100644 build/win32/devcpp/Makefile.win create mode 100644 build/win32/devcpp/juce.dev create mode 100644 build/win32/platform_specific_code/juce_win32_ASIO.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_AudioCDReader.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_DirectSound.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.h create mode 100644 build/win32/platform_specific_code/juce_win32_FileChooser.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Files.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Fonts.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Messaging.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Midi.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Misc.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Network.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_PlatformUtils.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_SystemStats.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Threads.cpp create mode 100644 build/win32/platform_specific_code/juce_win32_Windowing.cpp create mode 100644 build/win32/platform_specific_code/win32_headers.h create mode 100644 build/win32/vc6/JUCE.dsp create mode 100644 build/win32/vc8/JUCE.vcproj create mode 100644 docs/JUCE changelist.txt create mode 100644 docs/JUCE readme.html create mode 100644 docs/gpl.txt create mode 100644 docs/images/rms_logo.gif create mode 100644 docs/rawmat.css create mode 100644 extras/audio plugins/How to use this framework.txt create mode 100644 extras/audio plugins/demo/build/AudioUnit/Info-JuceAU.plist create mode 100644 extras/audio plugins/demo/build/AudioUnit/JuceAU.exp create mode 100644 extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj create mode 100644 extras/audio plugins/demo/build/RTAS_Mac/Info.plist create mode 100644 extras/audio plugins/demo/build/RTAS_Mac/juce_RTASDemo.xcodeproj/project.pbxproj create mode 100644 extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.sln create mode 100644 extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.vcproj create mode 100644 extras/audio plugins/demo/build/RTAS_Win32/juce_RTASDemo.rc create mode 100644 extras/audio plugins/demo/build/RTAS_Win32/resource.h create mode 100644 extras/audio plugins/demo/build/VST_Mac/Info.plist create mode 100644 extras/audio plugins/demo/build/VST_Mac/JuceVST-Info.plist create mode 100644 extras/audio plugins/demo/build/VST_Mac/JuceVST.xcodeproj/project.pbxproj create mode 100644 extras/audio plugins/demo/build/VST_Mac/version.plist create mode 100644 extras/audio plugins/demo/build/VST_Win32/juce_vst.sln create mode 100644 extras/audio plugins/demo/build/VST_Win32/juce_vst.vcproj create mode 100644 extras/audio plugins/demo/src/DemoEditorComponent.cpp create mode 100644 extras/audio plugins/demo/src/DemoEditorComponent.h create mode 100644 extras/audio plugins/demo/src/DemoJuceFilter.cpp create mode 100644 extras/audio plugins/demo/src/DemoJuceFilter.h create mode 100644 extras/audio plugins/demo/src/JucePluginCharacteristics.h create mode 100644 extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.cpp create mode 100644 extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r create mode 100644 extras/audio plugins/wrapper/formats/RTAS/DefaultResourceFile create mode 100644 extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r create mode 100644 extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h create mode 100644 extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/juce_RTAS_dlldefs.def create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp create mode 100644 extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp create mode 100644 extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.cpp create mode 100644 extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h create mode 100644 extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp create mode 100644 extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.h create mode 100644 extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp create mode 100644 extras/audio plugins/wrapper/juce_AudioFilterBase.cpp create mode 100644 extras/audio plugins/wrapper/juce_AudioFilterBase.h create mode 100644 extras/audio plugins/wrapper/juce_AudioFilterEditor.cpp create mode 100644 extras/audio plugins/wrapper/juce_AudioFilterEditor.h create mode 100644 extras/audio plugins/wrapper/juce_IncludeCharacteristics.h create mode 100644 extras/binarybuilder/BinaryBuilder.cpp create mode 100644 extras/binarybuilder/vc8/BinaryBuilder.sln create mode 100644 extras/binarybuilder/vc8/BinaryBuilder.vcproj create mode 100644 extras/example projects/common/Main.cpp create mode 100644 extras/example projects/example_project_for_Mac/English.lproj/InfoPlist.strings create mode 100644 extras/example projects/example_project_for_Mac/Info.plist create mode 100644 extras/example projects/example_project_for_Mac/juce_application.xcodeproj/project.pbxproj create mode 100644 extras/example projects/example_project_for_Mac/version.plist create mode 100644 extras/example projects/example_project_for_Win32/juce_application.dsp create mode 100644 extras/example projects/example_project_for_Win32/juce_application.dsw create mode 100644 extras/example projects/example_project_for_Win32/juce_application.sln create mode 100644 extras/example projects/example_project_for_Win32/juce_application.vcproj create mode 100644 extras/example projects/readme.txt create mode 100644 extras/juce demo/build/linux/JuceDemo.make create mode 100644 extras/juce demo/build/linux/Makefile create mode 100644 extras/juce demo/build/linux/jucedemo_premake.lua create mode 100644 extras/juce demo/build/linux/runpremake create mode 100644 extras/juce demo/build/macosx/English.lproj/InfoPlist.strings create mode 100644 extras/juce demo/build/macosx/Info.plist create mode 100644 extras/juce demo/build/macosx/jucedemo.xcodeproj/project.pbxproj create mode 100644 extras/juce demo/build/macosx/version.plist create mode 100644 extras/juce demo/build/win32_devcpp/JuceDemo.dev create mode 100644 extras/juce demo/build/win32_devcpp/Makefile.win create mode 100644 extras/juce demo/build/win32_vc6/jucedemo.dsp create mode 100644 extras/juce demo/build/win32_vc6/jucedemo.dsw create mode 100644 extras/juce demo/build/win32_vc8/jucedemo.sln create mode 100644 extras/juce demo/build/win32_vc8/jucedemo.vcproj create mode 100644 extras/juce demo/src/ApplicationStartup.cpp create mode 100644 extras/juce demo/src/BinaryData.cpp create mode 100644 extras/juce demo/src/BinaryData.h create mode 100644 extras/juce demo/src/MainDemoWindow.cpp create mode 100644 extras/juce demo/src/MainDemoWindow.h create mode 100644 extras/juce demo/src/binarydata/AudioDemo.cpp create mode 100644 extras/juce demo/src/binarydata/DragAndDropDemo.cpp create mode 100644 extras/juce demo/src/binarydata/FontsAndTextDemo.cpp create mode 100644 extras/juce demo/src/binarydata/InterprocessCommsDemo.cpp create mode 100644 extras/juce demo/src/binarydata/OpenGLDemo.cpp create mode 100644 extras/juce demo/src/binarydata/PathsAndTransformsDemo.cpp create mode 100644 extras/juce demo/src/binarydata/QuickTimeDemo.cpp create mode 100644 extras/juce demo/src/binarydata/README - what this directory is for.txt create mode 100644 extras/juce demo/src/binarydata/TableDemo.cpp create mode 100644 extras/juce demo/src/binarydata/ThreadingDemo.cpp create mode 100644 extras/juce demo/src/binarydata/TreeViewDemo.cpp create mode 100644 extras/juce demo/src/binarydata/WidgetsDemo.cpp create mode 100644 extras/juce demo/src/binarydata/cello.wav create mode 100644 extras/juce demo/src/binarydata/demo table data.xml create mode 100644 extras/juce demo/src/binarydata/icons.zip create mode 100644 extras/juce demo/src/binarydata/juce.png create mode 100644 extras/juce demo/src/binarydata/treedemo.xml create mode 100644 extras/juce demo/src/demos/AudioDemo.cpp create mode 100644 extras/juce demo/src/demos/DragAndDropDemo.cpp create mode 100644 extras/juce demo/src/demos/FontsAndTextDemo.cpp create mode 100644 extras/juce demo/src/demos/InterprocessCommsDemo.cpp create mode 100644 extras/juce demo/src/demos/OpenGLDemo.cpp create mode 100644 extras/juce demo/src/demos/PathsAndTransformsDemo.cpp create mode 100644 extras/juce demo/src/demos/QuickTimeDemo.cpp create mode 100644 extras/juce demo/src/demos/TableDemo.cpp create mode 100644 extras/juce demo/src/demos/ThreadingDemo.cpp create mode 100644 extras/juce demo/src/demos/TreeViewDemo.cpp create mode 100644 extras/juce demo/src/demos/WidgetsDemo.cpp create mode 100644 extras/juce demo/src/jucedemo_headers.h create mode 100644 extras/the jucer/Jucer To Do list.txt create mode 100644 extras/the jucer/build/linux/Jucer.make create mode 100644 extras/the jucer/build/linux/Makefile create mode 100644 extras/the jucer/build/linux/jucer_premake.lua create mode 100644 extras/the jucer/build/linux/runpremake create mode 100644 extras/the jucer/build/mac/English.lproj/InfoPlist.strings create mode 100644 extras/the jucer/build/mac/Info.plist create mode 100644 extras/the jucer/build/mac/Jucer.xcodeproj/project.pbxproj create mode 100644 extras/the jucer/build/mac/jucer_icon.icns create mode 100644 extras/the jucer/build/mac/version.plist create mode 100644 extras/the jucer/build/vc6/Jucer.dsp create mode 100644 extras/the jucer/build/vc6/Jucer.dsw create mode 100644 extras/the jucer/build/vc6/jucer.rc create mode 100644 extras/the jucer/build/vc6/jucer_icon.ico create mode 100644 extras/the jucer/build/vc8/jucer.rc create mode 100644 extras/the jucer/build/vc8/jucer.sln create mode 100644 extras/the jucer/build/vc8/jucer.vcproj create mode 100644 extras/the jucer/build/vc8/jucer_icon.ico create mode 100644 extras/the jucer/src/BinaryData.cpp create mode 100644 extras/the jucer/src/BinaryData.h create mode 100644 extras/the jucer/src/binarydata/jules.jpg create mode 100644 extras/the jucer/src/binarydata/prefs_about.png create mode 100644 extras/the jucer/src/binarydata/prefs_keys.png create mode 100644 extras/the jucer/src/binarydata/prefs_misc.png create mode 100644 extras/the jucer/src/jucer_Headers.h create mode 100644 extras/the jucer/src/jucer_Main.cpp create mode 100644 extras/the jucer/src/model/components/jucer_ButtonHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_ComboBoxHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_ComponentNameProperty.h create mode 100644 extras/the jucer/src/model/components/jucer_ComponentTypeHandler.cpp create mode 100644 extras/the jucer/src/model/components/jucer_ComponentTypeHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_ComponentUndoableAction.h create mode 100644 extras/the jucer/src/model/components/jucer_GenericComponentHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_GroupComponentHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_HyperlinkButtonHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_JucerComponentHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_LabelHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_SliderHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_TabbedComponentHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_TextButtonHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_TextEditorHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_ToggleButtonHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_TreeViewHandler.h create mode 100644 extras/the jucer/src/model/components/jucer_ViewportHandler.h create mode 100644 extras/the jucer/src/model/documents/jucer_ButtonDocument.cpp create mode 100644 extras/the jucer/src/model/documents/jucer_ButtonDocument.h create mode 100644 extras/the jucer/src/model/documents/jucer_ComponentDocument.cpp create mode 100644 extras/the jucer/src/model/documents/jucer_ComponentDocument.h create mode 100644 extras/the jucer/src/model/jucer_BinaryResources.cpp create mode 100644 extras/the jucer/src/model/jucer_BinaryResources.h create mode 100644 extras/the jucer/src/model/jucer_ComponentLayout.cpp create mode 100644 extras/the jucer/src/model/jucer_ComponentLayout.h create mode 100644 extras/the jucer/src/model/jucer_GeneratedCode.cpp create mode 100644 extras/the jucer/src/model/jucer_GeneratedCode.h create mode 100644 extras/the jucer/src/model/jucer_JucerDocument.cpp create mode 100644 extras/the jucer/src/model/jucer_JucerDocument.h create mode 100644 extras/the jucer/src/model/jucer_ObjectTypes.cpp create mode 100644 extras/the jucer/src/model/jucer_ObjectTypes.h create mode 100644 extras/the jucer/src/model/jucer_PaintRoutine.cpp create mode 100644 extras/the jucer/src/model/jucer_PaintRoutine.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_ColouredElement.cpp create mode 100644 extras/the jucer/src/model/paintelements/jucer_ColouredElement.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_ElementSiblingComponent.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_FillType.cpp create mode 100644 extras/the jucer/src/model/paintelements/jucer_FillType.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_GradientPointComponent.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_ImageResourceProperty.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElement.cpp create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElement.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementEllipse.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementGroup.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementImage.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementPath.cpp create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementPath.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementRectangle.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementRoundedRectangle.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementText.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PaintElementUndoableAction.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_PointComponent.h create mode 100644 extras/the jucer/src/model/paintelements/jucer_StrokeType.cpp create mode 100644 extras/the jucer/src/model/paintelements/jucer_StrokeType.h create mode 100644 extras/the jucer/src/properties/jucer_ColourPropertyComponent.h create mode 100644 extras/the jucer/src/properties/jucer_ComponentBooleanProperty.h create mode 100644 extras/the jucer/src/properties/jucer_ComponentChoiceProperty.h create mode 100644 extras/the jucer/src/properties/jucer_ComponentColourProperty.h create mode 100644 extras/the jucer/src/properties/jucer_ComponentTextProperty.h create mode 100644 extras/the jucer/src/properties/jucer_FilePropertyComponent.cpp create mode 100644 extras/the jucer/src/properties/jucer_FilePropertyComponent.h create mode 100644 extras/the jucer/src/properties/jucer_FontPropertyComponent.cpp create mode 100644 extras/the jucer/src/properties/jucer_FontPropertyComponent.h create mode 100644 extras/the jucer/src/properties/jucer_JustificationProperty.h create mode 100644 extras/the jucer/src/properties/jucer_PositionPropertyBase.h create mode 100644 extras/the jucer/src/templates/jucer_ComponentTemplate.cpp create mode 100644 extras/the jucer/src/templates/jucer_ComponentTemplate.h create mode 100644 extras/the jucer/src/ui/jucer_CommandIDs.h create mode 100644 extras/the jucer/src/ui/jucer_ComponentLayoutEditor.cpp create mode 100644 extras/the jucer/src/ui/jucer_ComponentLayoutEditor.h create mode 100644 extras/the jucer/src/ui/jucer_ComponentLayoutPanel.cpp create mode 100644 extras/the jucer/src/ui/jucer_ComponentLayoutPanel.h create mode 100644 extras/the jucer/src/ui/jucer_ComponentOverlayComponent.cpp create mode 100644 extras/the jucer/src/ui/jucer_ComponentOverlayComponent.h create mode 100644 extras/the jucer/src/ui/jucer_EditingPanelBase.cpp create mode 100644 extras/the jucer/src/ui/jucer_EditingPanelBase.h create mode 100644 extras/the jucer/src/ui/jucer_JucerDocumentHolder.cpp create mode 100644 extras/the jucer/src/ui/jucer_JucerDocumentHolder.h create mode 100644 extras/the jucer/src/ui/jucer_MainWindow.cpp create mode 100644 extras/the jucer/src/ui/jucer_MainWindow.h create mode 100644 extras/the jucer/src/ui/jucer_PaintRoutineEditor.cpp create mode 100644 extras/the jucer/src/ui/jucer_PaintRoutineEditor.h create mode 100644 extras/the jucer/src/ui/jucer_PaintRoutinePanel.cpp create mode 100644 extras/the jucer/src/ui/jucer_PaintRoutinePanel.h create mode 100644 extras/the jucer/src/ui/jucer_PrefsPanel.cpp create mode 100644 extras/the jucer/src/ui/jucer_PrefsPanel.h create mode 100644 extras/the jucer/src/ui/jucer_ResourceEditorPanel.cpp create mode 100644 extras/the jucer/src/ui/jucer_ResourceEditorPanel.h create mode 100644 extras/the jucer/src/ui/jucer_SnapGridPainter.cpp create mode 100644 extras/the jucer/src/ui/jucer_SnapGridPainter.h create mode 100644 extras/the jucer/src/ui/jucer_TestComponent.cpp create mode 100644 extras/the jucer/src/ui/jucer_TestComponent.h create mode 100644 extras/the jucer/src/utility/jucer_ColourEditorComponent.h create mode 100644 extras/the jucer/src/utility/jucer_Colours.h create mode 100644 extras/the jucer/src/utility/jucer_StoredSettings.cpp create mode 100644 extras/the jucer/src/utility/jucer_StoredSettings.h create mode 100644 extras/the jucer/src/utility/jucer_UtilityFunctions.cpp create mode 100644 extras/the jucer/src/utility/jucer_UtilityFunctions.h create mode 100644 juce.h create mode 100644 juce_Config.h create mode 100644 src/juce_DefineMacros.h create mode 100644 src/juce_WithoutMacros.h create mode 100644 src/juce_app_includes.h create mode 100644 src/juce_appframework/application/juce_Application.cpp create mode 100644 src/juce_appframework/application/juce_Application.h create mode 100644 src/juce_appframework/application/juce_ApplicationCommandID.h create mode 100644 src/juce_appframework/application/juce_ApplicationCommandInfo.cpp create mode 100644 src/juce_appframework/application/juce_ApplicationCommandInfo.h create mode 100644 src/juce_appframework/application/juce_ApplicationCommandManager.cpp create mode 100644 src/juce_appframework/application/juce_ApplicationCommandManager.h create mode 100644 src/juce_appframework/application/juce_ApplicationCommandTarget.cpp create mode 100644 src/juce_appframework/application/juce_ApplicationCommandTarget.h create mode 100644 src/juce_appframework/application/juce_ApplicationProperties.cpp create mode 100644 src/juce_appframework/application/juce_ApplicationProperties.h create mode 100644 src/juce_appframework/application/juce_DeletedAtShutdown.cpp create mode 100644 src/juce_appframework/application/juce_DeletedAtShutdown.h create mode 100644 src/juce_appframework/application/juce_PropertiesFile.cpp create mode 100644 src/juce_appframework/application/juce_PropertiesFile.h create mode 100644 src/juce_appframework/application/juce_SystemClipboard.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/Flac Licence.txt create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/all.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/assert.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/callback.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/export.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/format.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/bitbuffer.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/bitmath.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/cpu.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/crc.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/fixed.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/float.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/format.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/all.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/bitbuffer.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/bitmath.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/cpu.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/crc.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/fixed.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/float.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/format.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/lpc.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/md5.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/memory.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/metadata.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/stream_encoder_framing.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/private/window.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/protected/all.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/protected/stream_decoder.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/include/protected/stream_encoder.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/juce_FlacHeader.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/lpc_flac.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/md5.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/memory.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/stream_decoder.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/stream_encoder.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/stream_encoder_framing.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/libFLAC/window_flac.c create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/metadata.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/ordinals.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/stream_decoder.h create mode 100644 src/juce_appframework/audio/audio_file_formats/flac/stream_encoder.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioFormatManager.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioFormatManager.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioFormatReader.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioFormatWriter.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_FlacAudioFormat.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_FlacAudioFormat.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_OggVorbisAudioFormat.h create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.cpp create mode 100644 src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/Ogg Vorbis Licence.txt create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/bitwise.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/codec.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/config_types.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/framing.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/juce_OggVorbisHeader.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/AUTHORS create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/COPYING create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/README create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/analysis.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/backends.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/bitrate.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/bitrate.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/block.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/books/coupled/res_books_stereo.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/books/floor/floor_books.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/books/uncoupled/res_books_uncoupled.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/codebook.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/codebook.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/codec_internal.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/envelope.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/envelope.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/floor0.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/floor1.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/highlevel.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/info.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lookup.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lookup.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lookup_data.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lookups.pl create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lpc.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lpc.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lsp.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lsp.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/mapping0.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/masking.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/mdct.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/mdct.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/misc.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/floor_all.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/psych_11.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/psych_16.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/psych_44.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/psych_8.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/residue_16.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/residue_44.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/residue_44u.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/residue_8.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_11.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_16.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_22.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_32.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_44.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_44u.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_8.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/modes/setup_X.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/os.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/psy.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/psy.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/registry.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/registry.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/res0.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/scales.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/sharedbook.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/smallft.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/smallft.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/synthesis.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/vorbisenc.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/vorbisfile.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/window.c create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/window.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/ogg.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/os_types.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/vorbisenc.h create mode 100644 src/juce_appframework/audio/audio_file_formats/oggvorbis/vorbisfile.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_ChannelRemappingAudioSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_ChannelRemappingAudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_IIRFilterAudioSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_IIRFilterAudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_PositionableAudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.h create mode 100644 src/juce_appframework/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp create mode 100644 src/juce_appframework/audio/audio_sources/juce_ToneGeneratorAudioSource.h create mode 100644 src/juce_appframework/audio/devices/juce_AudioDeviceManager.cpp create mode 100644 src/juce_appframework/audio/devices/juce_AudioDeviceManager.h create mode 100644 src/juce_appframework/audio/devices/juce_AudioIODevice.cpp create mode 100644 src/juce_appframework/audio/devices/juce_AudioIODevice.h create mode 100644 src/juce_appframework/audio/devices/juce_AudioIODeviceType.cpp create mode 100644 src/juce_appframework/audio/devices/juce_AudioIODeviceType.h create mode 100644 src/juce_appframework/audio/devices/juce_MidiInput.h create mode 100644 src/juce_appframework/audio/devices/juce_MidiOutput.h create mode 100644 src/juce_appframework/audio/dsp/juce_AudioDataConverters.cpp create mode 100644 src/juce_appframework/audio/dsp/juce_AudioDataConverters.h create mode 100644 src/juce_appframework/audio/dsp/juce_AudioSampleBuffer.cpp create mode 100644 src/juce_appframework/audio/dsp/juce_AudioSampleBuffer.h create mode 100644 src/juce_appframework/audio/dsp/juce_IIRFilter.cpp create mode 100644 src/juce_appframework/audio/dsp/juce_IIRFilter.h create mode 100644 src/juce_appframework/audio/midi/juce_MidiBuffer.cpp create mode 100644 src/juce_appframework/audio/midi/juce_MidiBuffer.h create mode 100644 src/juce_appframework/audio/midi/juce_MidiFile.cpp create mode 100644 src/juce_appframework/audio/midi/juce_MidiFile.h create mode 100644 src/juce_appframework/audio/midi/juce_MidiKeyboardState.cpp create mode 100644 src/juce_appframework/audio/midi/juce_MidiKeyboardState.h create mode 100644 src/juce_appframework/audio/midi/juce_MidiMessage.cpp create mode 100644 src/juce_appframework/audio/midi/juce_MidiMessage.h create mode 100644 src/juce_appframework/audio/midi/juce_MidiMessageCollector.cpp create mode 100644 src/juce_appframework/audio/midi/juce_MidiMessageCollector.h create mode 100644 src/juce_appframework/audio/midi/juce_MidiMessageSequence.cpp create mode 100644 src/juce_appframework/audio/midi/juce_MidiMessageSequence.h create mode 100644 src/juce_appframework/audio/synthesisers/juce_Sampler.cpp create mode 100644 src/juce_appframework/audio/synthesisers/juce_Sampler.h create mode 100644 src/juce_appframework/audio/synthesisers/juce_Synthesiser.cpp create mode 100644 src/juce_appframework/audio/synthesisers/juce_Synthesiser.h create mode 100644 src/juce_appframework/documents/juce_FileBasedDocument.cpp create mode 100644 src/juce_appframework/documents/juce_FileBasedDocument.h create mode 100644 src/juce_appframework/documents/juce_RecentlyOpenedFilesList.cpp create mode 100644 src/juce_appframework/documents/juce_RecentlyOpenedFilesList.h create mode 100644 src/juce_appframework/documents/juce_SelectedItemSet.h create mode 100644 src/juce_appframework/documents/juce_UndoManager.cpp create mode 100644 src/juce_appframework/documents/juce_UndoManager.h create mode 100644 src/juce_appframework/documents/juce_UndoableAction.h create mode 100644 src/juce_appframework/events/juce_ActionBroadcaster.cpp create mode 100644 src/juce_appframework/events/juce_ActionBroadcaster.h create mode 100644 src/juce_appframework/events/juce_ActionListener.h create mode 100644 src/juce_appframework/events/juce_ActionListenerList.cpp create mode 100644 src/juce_appframework/events/juce_ActionListenerList.h create mode 100644 src/juce_appframework/events/juce_AsyncUpdater.cpp create mode 100644 src/juce_appframework/events/juce_AsyncUpdater.h create mode 100644 src/juce_appframework/events/juce_ChangeBroadcaster.cpp create mode 100644 src/juce_appframework/events/juce_ChangeBroadcaster.h create mode 100644 src/juce_appframework/events/juce_ChangeListener.h create mode 100644 src/juce_appframework/events/juce_ChangeListenerList.cpp create mode 100644 src/juce_appframework/events/juce_ChangeListenerList.h create mode 100644 src/juce_appframework/events/juce_InterprocessConnection.cpp create mode 100644 src/juce_appframework/events/juce_InterprocessConnection.h create mode 100644 src/juce_appframework/events/juce_InterprocessConnectionServer.cpp create mode 100644 src/juce_appframework/events/juce_InterprocessConnectionServer.h create mode 100644 src/juce_appframework/events/juce_Message.cpp create mode 100644 src/juce_appframework/events/juce_Message.h create mode 100644 src/juce_appframework/events/juce_MessageListener.cpp create mode 100644 src/juce_appframework/events/juce_MessageListener.h create mode 100644 src/juce_appframework/events/juce_MessageManager.cpp create mode 100644 src/juce_appframework/events/juce_MessageManager.h create mode 100644 src/juce_appframework/events/juce_MultiTimer.cpp create mode 100644 src/juce_appframework/events/juce_MultiTimer.h create mode 100644 src/juce_appframework/events/juce_Timer.cpp create mode 100644 src/juce_appframework/events/juce_Timer.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_ArrowButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_ArrowButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_Button.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_Button.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_DrawableButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_ImageButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_ShapeButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_ShapeButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_TextButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_TextButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_ToggleButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_ToggleButton.h create mode 100644 src/juce_appframework/gui/components/buttons/juce_ToolbarButton.cpp create mode 100644 src/juce_appframework/gui/components/buttons/juce_ToolbarButton.h create mode 100644 src/juce_appframework/gui/components/controls/juce_ComboBox.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_ComboBox.h create mode 100644 src/juce_appframework/gui/components/controls/juce_Label.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_Label.h create mode 100644 src/juce_appframework/gui/components/controls/juce_ListBox.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_ListBox.h create mode 100644 src/juce_appframework/gui/components/controls/juce_ProgressBar.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_ProgressBar.h create mode 100644 src/juce_appframework/gui/components/controls/juce_Slider.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_Slider.h create mode 100644 src/juce_appframework/gui/components/controls/juce_SliderListener.h create mode 100644 src/juce_appframework/gui/components/controls/juce_TableHeaderComponent.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_TableHeaderComponent.h create mode 100644 src/juce_appframework/gui/components/controls/juce_TableListBox.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_TableListBox.h create mode 100644 src/juce_appframework/gui/components/controls/juce_TextEditor.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_TextEditor.h create mode 100644 src/juce_appframework/gui/components/controls/juce_Toolbar.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_Toolbar.h create mode 100644 src/juce_appframework/gui/components/controls/juce_ToolbarItemComponent.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_ToolbarItemComponent.h create mode 100644 src/juce_appframework/gui/components/controls/juce_ToolbarItemFactory.h create mode 100644 src/juce_appframework/gui/components/controls/juce_ToolbarItemPalette.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_ToolbarItemPalette.h create mode 100644 src/juce_appframework/gui/components/controls/juce_TreeView.cpp create mode 100644 src/juce_appframework/gui/components/controls/juce_TreeView.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_DirectoryContentsList.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_DirectoryContentsList.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileBrowserComponent.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileBrowserComponent.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileBrowserListener.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileChooser.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileChooser.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileChooserDialogBox.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileChooserDialogBox.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileFilter.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileFilter.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileListComponent.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FileListComponent.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FilePreviewComponent.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FilenameComponent.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_FilenameComponent.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_ImagePreviewComponent.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_ImagePreviewComponent.h create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_WildcardFileFilter.cpp create mode 100644 src/juce_appframework/gui/components/filebrowser/juce_WildcardFileFilter.h create mode 100644 src/juce_appframework/gui/components/juce_Component.cpp create mode 100644 src/juce_appframework/gui/components/juce_Component.h create mode 100644 src/juce_appframework/gui/components/juce_ComponentDeletionWatcher.h create mode 100644 src/juce_appframework/gui/components/juce_ComponentListener.cpp create mode 100644 src/juce_appframework/gui/components/juce_ComponentListener.h create mode 100644 src/juce_appframework/gui/components/juce_Desktop.cpp create mode 100644 src/juce_appframework/gui/components/juce_Desktop.h create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyListener.cpp create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyListener.h create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.h create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyPress.cpp create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyPress.h create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.cpp create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.h create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp create mode 100644 src/juce_appframework/gui/components/keyboard/juce_KeyboardFocusTraverser.h create mode 100644 src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.cpp create mode 100644 src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.h create mode 100644 src/juce_appframework/gui/components/layout/juce_ComponentAnimator.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_ComponentAnimator.h create mode 100644 src/juce_appframework/gui/components/layout/juce_ComponentBoundsConstrainer.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_ComponentBoundsConstrainer.h create mode 100644 src/juce_appframework/gui/components/layout/juce_ComponentMovementWatcher.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_ComponentMovementWatcher.h create mode 100644 src/juce_appframework/gui/components/layout/juce_GroupComponent.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_GroupComponent.h create mode 100644 src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.h create mode 100644 src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.h create mode 100644 src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.h create mode 100644 src/juce_appframework/gui/components/layout/juce_ScrollBar.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_ScrollBar.h create mode 100644 src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.h create mode 100644 src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.h create mode 100644 src/juce_appframework/gui/components/layout/juce_StretchableObjectResizer.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_StretchableObjectResizer.h create mode 100644 src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.h create mode 100644 src/juce_appframework/gui/components/layout/juce_TabbedComponent.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_TabbedComponent.h create mode 100644 src/juce_appframework/gui/components/layout/juce_Viewport.cpp create mode 100644 src/juce_appframework/gui/components/layout/juce_Viewport.h create mode 100644 src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp create mode 100644 src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.h create mode 100644 src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.cpp create mode 100644 src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.h create mode 100644 src/juce_appframework/gui/components/menus/juce_MenuBarComponent.cpp create mode 100644 src/juce_appframework/gui/components/menus/juce_MenuBarComponent.h create mode 100644 src/juce_appframework/gui/components/menus/juce_MenuBarModel.cpp create mode 100644 src/juce_appframework/gui/components/menus/juce_MenuBarModel.h create mode 100644 src/juce_appframework/gui/components/menus/juce_PopupMenu.cpp create mode 100644 src/juce_appframework/gui/components/menus/juce_PopupMenu.h create mode 100644 src/juce_appframework/gui/components/menus/juce_PopupMenuCustomComponent.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_ComponentDragger.cpp create mode 100644 src/juce_appframework/gui/components/mouse/juce_ComponentDragger.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.cpp create mode 100644 src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_DragAndDropTarget.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_LassoComponent.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseCursor.cpp create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseCursor.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseEvent.cpp create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseEvent.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.cpp create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseListener.cpp create mode 100644 src/juce_appframework/gui/components/mouse/juce_MouseListener.h create mode 100644 src/juce_appframework/gui/components/mouse/juce_TooltipClient.h create mode 100644 src/juce_appframework/gui/components/properties/juce_BooleanPropertyComponent.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_BooleanPropertyComponent.h create mode 100644 src/juce_appframework/gui/components/properties/juce_ButtonPropertyComponent.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_ButtonPropertyComponent.h create mode 100644 src/juce_appframework/gui/components/properties/juce_ChoicePropertyComponent.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_ChoicePropertyComponent.h create mode 100644 src/juce_appframework/gui/components/properties/juce_PropertyComponent.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_PropertyComponent.h create mode 100644 src/juce_appframework/gui/components/properties/juce_PropertyPanel.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_PropertyPanel.h create mode 100644 src/juce_appframework/gui/components/properties/juce_SliderPropertyComponent.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_SliderPropertyComponent.h create mode 100644 src/juce_appframework/gui/components/properties/juce_TextPropertyComponent.cpp create mode 100644 src/juce_appframework/gui/components/properties/juce_TextPropertyComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_ActiveXControlComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_BubbleComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_BubbleComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_ColourSelector.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_ColourSelector.h create mode 100644 src/juce_appframework/gui/components/special/juce_DropShadower.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_DropShadower.h create mode 100644 src/juce_appframework/gui/components/special/juce_MagnifierComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_MagnifierComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_MidiKeyboardComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_MidiKeyboardComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_OpenGLComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_OpenGLComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_PreferencesPanel.h create mode 100644 src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.h create mode 100644 src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.cpp create mode 100644 src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.h create mode 100644 src/juce_appframework/gui/components/windows/juce_AlertWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_AlertWindow.h create mode 100644 src/juce_appframework/gui/components/windows/juce_ComponentPeer.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_ComponentPeer.h create mode 100644 src/juce_appframework/gui/components/windows/juce_DialogWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_DialogWindow.h create mode 100644 src/juce_appframework/gui/components/windows/juce_DocumentWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_DocumentWindow.h create mode 100644 src/juce_appframework/gui/components/windows/juce_ResizableWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_ResizableWindow.h create mode 100644 src/juce_appframework/gui/components/windows/juce_SplashScreen.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_SplashScreen.h create mode 100644 src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.h create mode 100644 src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_TooltipWindow.h create mode 100644 src/juce_appframework/gui/components/windows/juce_TopLevelWindow.cpp create mode 100644 src/juce_appframework/gui/components/windows/juce_TopLevelWindow.h create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_Brush.cpp create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_Brush.h create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.cpp create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.h create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.cpp create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.h create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.cpp create mode 100644 src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.h create mode 100644 src/juce_appframework/gui/graphics/colour/juce_Colour.cpp create mode 100644 src/juce_appframework/gui/graphics/colour/juce_Colour.h create mode 100644 src/juce_appframework/gui/graphics/colour/juce_ColourGradient.cpp create mode 100644 src/juce_appframework/gui/graphics/colour/juce_ColourGradient.h create mode 100644 src/juce_appframework/gui/graphics/colour/juce_Colours.cpp create mode 100644 src/juce_appframework/gui/graphics/colour/juce_Colours.h create mode 100644 src/juce_appframework/gui/graphics/colour/juce_PixelFormats.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.cpp create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_Graphics.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_Justification.cpp create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_Justification.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsContext.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_RectanglePlacement.cpp create mode 100644 src/juce_appframework/gui/graphics/contexts/juce_RectanglePlacement.h create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_Drawable.cpp create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_Drawable.h create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.cpp create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.h create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.cpp create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.h create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.cpp create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.h create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawableText.cpp create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_DrawableText.h create mode 100644 src/juce_appframework/gui/graphics/drawables/juce_SVGParser.cpp create mode 100644 src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.cpp create mode 100644 src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.h create mode 100644 src/juce_appframework/gui/graphics/effects/juce_GlowEffect.cpp create mode 100644 src/juce_appframework/gui/graphics/effects/juce_GlowEffect.h create mode 100644 src/juce_appframework/gui/graphics/effects/juce_ImageEffectFilter.h create mode 100644 src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.cpp create mode 100644 src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.h create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_Font.cpp create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_Font.h create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.cpp create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.h create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_TextLayout.cpp create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_TextLayout.h create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_Typeface.cpp create mode 100644 src/juce_appframework/gui/graphics/fonts/juce_Typeface.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_BorderSize.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_BorderSize.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Line.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Line.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Path.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Path.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_PathIterator.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_PathIterator.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Point.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Point.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Rectangle.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_Rectangle.h create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_RectangleList.cpp create mode 100644 src/juce_appframework/gui/graphics/geometry/juce_RectangleList.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/README create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/cderror.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/changes to libjpeg for JUCE.txt create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapimin.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapistd.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccoefct.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccolor.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcdctmgr.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jchuff.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jchuff.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcinit.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmainct.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmarker.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmaster.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcomapi.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jconfig.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcparam.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcphuff.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcprepct.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcsample.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jctrans.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapimin.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapistd.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdatasrc.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcoefct.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcolor.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdct.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jddctmgr.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdhuff.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdhuff.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdinput.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmainct.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmarker.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmaster.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmerge.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdphuff.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdpostct.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdsample.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdtrans.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jerror.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jerror.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctflt.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctfst.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctint.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctflt.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctfst.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctint.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctred.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jinclude.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemmgr.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemnobs.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemsys.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmorecfg.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jpegint.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jpeglib.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant1.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant2.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jutils.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jversion.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/transupp.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/transupp.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_JPEGLoader.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_PNGLoader.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/LICENSE create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/libpng_readme.txt create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/png.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/png.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngconf.h create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngerror.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pnggccrd.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngget.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngmem.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngpread.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngread.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrio.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrtran.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrutil.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngset.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngtrans.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngvcrd.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwio.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwrite.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwtran.c create mode 100644 src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwutil.c create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_Image.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_Image.h create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_ImageCache.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_ImageCache.h create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.h create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.cpp create mode 100644 src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.h create mode 100644 src/juce_core/basics/juce_Atomic.h create mode 100644 src/juce_core/basics/juce_DataConversions.h create mode 100644 src/juce_core/basics/juce_FileLogger.cpp create mode 100644 src/juce_core/basics/juce_FileLogger.h create mode 100644 src/juce_core/basics/juce_Initialisation.h create mode 100644 src/juce_core/basics/juce_Logger.cpp create mode 100644 src/juce_core/basics/juce_Logger.h create mode 100644 src/juce_core/basics/juce_MathsFunctions.h create mode 100644 src/juce_core/basics/juce_Memory.h create mode 100644 src/juce_core/basics/juce_PlatformDefs.h create mode 100644 src/juce_core/basics/juce_Random.cpp create mode 100644 src/juce_core/basics/juce_Random.h create mode 100644 src/juce_core/basics/juce_RelativeTime.cpp create mode 100644 src/juce_core/basics/juce_RelativeTime.h create mode 100644 src/juce_core/basics/juce_Singleton.h create mode 100644 src/juce_core/basics/juce_StandardHeader.h create mode 100644 src/juce_core/basics/juce_SystemStats.cpp create mode 100644 src/juce_core/basics/juce_SystemStats.h create mode 100644 src/juce_core/basics/juce_Time.cpp create mode 100644 src/juce_core/basics/juce_Time.h create mode 100644 src/juce_core/containers/juce_Array.h create mode 100644 src/juce_core/containers/juce_ArrayAllocationBase.h create mode 100644 src/juce_core/containers/juce_BitArray.cpp create mode 100644 src/juce_core/containers/juce_BitArray.h create mode 100644 src/juce_core/containers/juce_ElementComparator.h create mode 100644 src/juce_core/containers/juce_MemoryBlock.cpp create mode 100644 src/juce_core/containers/juce_MemoryBlock.h create mode 100644 src/juce_core/containers/juce_OwnedArray.h create mode 100644 src/juce_core/containers/juce_PropertySet.cpp create mode 100644 src/juce_core/containers/juce_PropertySet.h create mode 100644 src/juce_core/containers/juce_ReferenceCountedArray.h create mode 100644 src/juce_core/containers/juce_ReferenceCountedObject.h create mode 100644 src/juce_core/containers/juce_SortedSet.h create mode 100644 src/juce_core/containers/juce_SparseSet.h create mode 100644 src/juce_core/containers/juce_VoidArray.h create mode 100644 src/juce_core/cryptography/juce_BlowFish.cpp create mode 100644 src/juce_core/cryptography/juce_BlowFish.h create mode 100644 src/juce_core/cryptography/juce_MD5.cpp create mode 100644 src/juce_core/cryptography/juce_MD5.h create mode 100644 src/juce_core/cryptography/juce_Primes.cpp create mode 100644 src/juce_core/cryptography/juce_Primes.h create mode 100644 src/juce_core/cryptography/juce_RSAKey.cpp create mode 100644 src/juce_core/cryptography/juce_RSAKey.h create mode 100644 src/juce_core/io/files/juce_DirectoryIterator.cpp create mode 100644 src/juce_core/io/files/juce_DirectoryIterator.h create mode 100644 src/juce_core/io/files/juce_File.cpp create mode 100644 src/juce_core/io/files/juce_File.h create mode 100644 src/juce_core/io/files/juce_FileInputStream.cpp create mode 100644 src/juce_core/io/files/juce_FileInputStream.h create mode 100644 src/juce_core/io/files/juce_FileOutputStream.cpp create mode 100644 src/juce_core/io/files/juce_FileOutputStream.h create mode 100644 src/juce_core/io/files/juce_FileSearchPath.cpp create mode 100644 src/juce_core/io/files/juce_FileSearchPath.h create mode 100644 src/juce_core/io/files/juce_NamedPipe.cpp create mode 100644 src/juce_core/io/files/juce_NamedPipe.h create mode 100644 src/juce_core/io/juce_InputStream.cpp create mode 100644 src/juce_core/io/juce_InputStream.h create mode 100644 src/juce_core/io/juce_OutputStream.cpp create mode 100644 src/juce_core/io/juce_OutputStream.h create mode 100644 src/juce_core/io/network/juce_Socket.cpp create mode 100644 src/juce_core/io/network/juce_Socket.h create mode 100644 src/juce_core/io/network/juce_URL.cpp create mode 100644 src/juce_core/io/network/juce_URL.h create mode 100644 src/juce_core/io/streams/juce_BufferedInputStream.cpp create mode 100644 src/juce_core/io/streams/juce_BufferedInputStream.h create mode 100644 src/juce_core/io/streams/juce_GZIPCompressorOutputStream.cpp create mode 100644 src/juce_core/io/streams/juce_GZIPCompressorOutputStream.h create mode 100644 src/juce_core/io/streams/juce_GZIPDecompressorInputStream.cpp create mode 100644 src/juce_core/io/streams/juce_GZIPDecompressorInputStream.h create mode 100644 src/juce_core/io/streams/juce_MemoryInputStream.cpp create mode 100644 src/juce_core/io/streams/juce_MemoryInputStream.h create mode 100644 src/juce_core/io/streams/juce_MemoryOutputStream.cpp create mode 100644 src/juce_core/io/streams/juce_MemoryOutputStream.h create mode 100644 src/juce_core/io/streams/juce_SubregionStream.cpp create mode 100644 src/juce_core/io/streams/juce_SubregionStream.h create mode 100644 src/juce_core/io/streams/zlib/README create mode 100644 src/juce_core/io/streams/zlib/adler32.c create mode 100644 src/juce_core/io/streams/zlib/compress.c create mode 100644 src/juce_core/io/streams/zlib/crc32.c create mode 100644 src/juce_core/io/streams/zlib/crc32.h create mode 100644 src/juce_core/io/streams/zlib/deflate.c create mode 100644 src/juce_core/io/streams/zlib/deflate.h create mode 100644 src/juce_core/io/streams/zlib/infback.c create mode 100644 src/juce_core/io/streams/zlib/inffast.c create mode 100644 src/juce_core/io/streams/zlib/inffast.h create mode 100644 src/juce_core/io/streams/zlib/inffixed.h create mode 100644 src/juce_core/io/streams/zlib/inflate.c create mode 100644 src/juce_core/io/streams/zlib/inflate.h create mode 100644 src/juce_core/io/streams/zlib/inftrees.c create mode 100644 src/juce_core/io/streams/zlib/inftrees.h create mode 100644 src/juce_core/io/streams/zlib/trees.c create mode 100644 src/juce_core/io/streams/zlib/trees.h create mode 100644 src/juce_core/io/streams/zlib/uncompr.c create mode 100644 src/juce_core/io/streams/zlib/zconf.h create mode 100644 src/juce_core/io/streams/zlib/zconf.in.h create mode 100644 src/juce_core/io/streams/zlib/zlib.h create mode 100644 src/juce_core/io/streams/zlib/zutil.c create mode 100644 src/juce_core/io/streams/zlib/zutil.h create mode 100644 src/juce_core/misc/juce_PerformanceCounter.cpp create mode 100644 src/juce_core/misc/juce_PerformanceCounter.h create mode 100644 src/juce_core/misc/juce_PlatformUtilities.h create mode 100644 src/juce_core/misc/juce_Uuid.cpp create mode 100644 src/juce_core/misc/juce_Uuid.h create mode 100644 src/juce_core/misc/juce_ZipFile.cpp create mode 100644 src/juce_core/misc/juce_ZipFile.h create mode 100644 src/juce_core/text/juce_CharacterFunctions.cpp create mode 100644 src/juce_core/text/juce_CharacterFunctions.h create mode 100644 src/juce_core/text/juce_LocalisedStrings.cpp create mode 100644 src/juce_core/text/juce_LocalisedStrings.h create mode 100644 src/juce_core/text/juce_String.cpp create mode 100644 src/juce_core/text/juce_String.h create mode 100644 src/juce_core/text/juce_StringArray.cpp create mode 100644 src/juce_core/text/juce_StringArray.h create mode 100644 src/juce_core/text/juce_StringPairArray.cpp create mode 100644 src/juce_core/text/juce_StringPairArray.h create mode 100644 src/juce_core/text/juce_XmlDocument.cpp create mode 100644 src/juce_core/text/juce_XmlDocument.h create mode 100644 src/juce_core/text/juce_XmlElement.cpp create mode 100644 src/juce_core/text/juce_XmlElement.h create mode 100644 src/juce_core/threads/juce_CriticalSection.h create mode 100644 src/juce_core/threads/juce_InterProcessLock.cpp create mode 100644 src/juce_core/threads/juce_InterProcessLock.h create mode 100644 src/juce_core/threads/juce_Process.h create mode 100644 src/juce_core/threads/juce_ReadWriteLock.cpp create mode 100644 src/juce_core/threads/juce_ReadWriteLock.h create mode 100644 src/juce_core/threads/juce_ScopedLock.h create mode 100644 src/juce_core/threads/juce_ScopedReadLock.h create mode 100644 src/juce_core/threads/juce_ScopedWriteLock.h create mode 100644 src/juce_core/threads/juce_Thread.cpp create mode 100644 src/juce_core/threads/juce_Thread.h create mode 100644 src/juce_core/threads/juce_ThreadPool.cpp create mode 100644 src/juce_core/threads/juce_ThreadPool.h create mode 100644 src/juce_core/threads/juce_TimeSliceThread.cpp create mode 100644 src/juce_core/threads/juce_TimeSliceThread.h create mode 100644 src/juce_core/threads/juce_WaitableEvent.h create mode 100644 src/juce_core_includes.h diff --git a/build/linux/JUCE.make b/build/linux/JUCE.make new file mode 100644 index 0000000000..fe3459f989 --- /dev/null +++ b/build/linux/JUCE.make @@ -0,0 +1,2194 @@ +# C++ Static Library Makefile autogenerated by premake +# Don't edit this file! Instead edit `premake.lua` then rerun `make` + +ifndef CONFIG + CONFIG=Debug +endif + +ifeq ($(CONFIG),Debug) + BINDIR := ../../bin + LIBDIR := ../../bin + OBJDIR := ../../bin/intermediate_linux/Debug + OUTDIR := ../../bin + CPPFLAGS := -MD -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -I "../../" -I "/usr/include" -I "/usr/include/freetype2" + CFLAGS += $(CPPFLAGS) -g -D_DEBUG -ggdb -Wall + CXXFLAGS := $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) + LDDEPS := + TARGET := libjuce_debug.a +endif + +ifeq ($(CONFIG),Release) + BINDIR := ../../bin + LIBDIR := ../../bin + OBJDIR := ../../bin/intermediate_linux/Release + OUTDIR := ../../bin + CPPFLAGS := -MD -D "LINUX=1" -D "NDEBUG=1" -I "../../" -I "/usr/include" -I "/usr/include/freetype2" + CFLAGS += $(CPPFLAGS) -O2 -Wall + CXXFLAGS := $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -s + LDDEPS := + TARGET := libjuce.a +endif + +OBJECTS := \ + $(OBJDIR)/juce_FileLogger.o \ + $(OBJDIR)/juce_Logger.o \ + $(OBJDIR)/juce_Random.o \ + $(OBJDIR)/juce_RelativeTime.o \ + $(OBJDIR)/juce_SystemStats.o \ + $(OBJDIR)/juce_Time.o \ + $(OBJDIR)/juce_BlowFish.o \ + $(OBJDIR)/juce_MD5.o \ + $(OBJDIR)/juce_Primes.o \ + $(OBJDIR)/juce_RSAKey.o \ + $(OBJDIR)/juce_BitArray.o \ + $(OBJDIR)/juce_MemoryBlock.o \ + $(OBJDIR)/juce_PropertySet.o \ + $(OBJDIR)/juce_InputStream.o \ + $(OBJDIR)/juce_OutputStream.o \ + $(OBJDIR)/juce_DirectoryIterator.o \ + $(OBJDIR)/juce_File.o \ + $(OBJDIR)/juce_FileInputStream.o \ + $(OBJDIR)/juce_FileOutputStream.o \ + $(OBJDIR)/juce_FileSearchPath.o \ + $(OBJDIR)/juce_NamedPipe.o \ + $(OBJDIR)/juce_Socket.o \ + $(OBJDIR)/juce_URL.o \ + $(OBJDIR)/juce_BufferedInputStream.o \ + $(OBJDIR)/juce_GZIPCompressorOutputStream.o \ + $(OBJDIR)/juce_GZIPDecompressorInputStream.o \ + $(OBJDIR)/juce_MemoryInputStream.o \ + $(OBJDIR)/juce_MemoryOutputStream.o \ + $(OBJDIR)/juce_SubregionStream.o \ + $(OBJDIR)/adler32.o \ + $(OBJDIR)/compress.o \ + $(OBJDIR)/crc32.o \ + $(OBJDIR)/deflate.o \ + $(OBJDIR)/infback.o \ + $(OBJDIR)/inffast.o \ + $(OBJDIR)/inflate.o \ + $(OBJDIR)/inftrees.o \ + $(OBJDIR)/trees.o \ + $(OBJDIR)/uncompr.o \ + $(OBJDIR)/zutil.o \ + $(OBJDIR)/juce_PerformanceCounter.o \ + $(OBJDIR)/juce_Uuid.o \ + $(OBJDIR)/juce_ZipFile.o \ + $(OBJDIR)/juce_CharacterFunctions.o \ + $(OBJDIR)/juce_LocalisedStrings.o \ + $(OBJDIR)/juce_String.o \ + $(OBJDIR)/juce_StringArray.o \ + $(OBJDIR)/juce_StringPairArray.o \ + $(OBJDIR)/juce_XmlDocument.o \ + $(OBJDIR)/juce_XmlElement.o \ + $(OBJDIR)/juce_InterProcessLock.o \ + $(OBJDIR)/juce_ReadWriteLock.o \ + $(OBJDIR)/juce_Thread.o \ + $(OBJDIR)/juce_ThreadPool.o \ + $(OBJDIR)/juce_TimeSliceThread.o \ + $(OBJDIR)/juce_Application.o \ + $(OBJDIR)/juce_ApplicationCommandInfo.o \ + $(OBJDIR)/juce_ApplicationCommandManager.o \ + $(OBJDIR)/juce_ApplicationCommandTarget.o \ + $(OBJDIR)/juce_ApplicationProperties.o \ + $(OBJDIR)/juce_DeletedAtShutdown.o \ + $(OBJDIR)/juce_PropertiesFile.o \ + $(OBJDIR)/juce_AudioDataConverters.o \ + $(OBJDIR)/juce_AudioSampleBuffer.o \ + $(OBJDIR)/juce_IIRFilter.o \ + $(OBJDIR)/juce_MidiBuffer.o \ + $(OBJDIR)/juce_MidiFile.o \ + $(OBJDIR)/juce_MidiKeyboardState.o \ + $(OBJDIR)/juce_MidiMessage.o \ + $(OBJDIR)/juce_MidiMessageCollector.o \ + $(OBJDIR)/juce_MidiMessageSequence.o \ + $(OBJDIR)/juce_AiffAudioFormat.o \ + $(OBJDIR)/juce_AudioCDReader.o \ + $(OBJDIR)/juce_AudioFormat.o \ + $(OBJDIR)/juce_AudioFormatManager.o \ + $(OBJDIR)/juce_AudioSubsectionReader.o \ + $(OBJDIR)/juce_FlacAudioFormat.o \ + $(OBJDIR)/juce_OggVorbisAudioFormat.o \ + $(OBJDIR)/juce_WavAudioFormat.o \ + $(OBJDIR)/bitbuffer.o \ + $(OBJDIR)/bitmath.o \ + $(OBJDIR)/cpu.o \ + $(OBJDIR)/crc.o \ + $(OBJDIR)/fixed.o \ + $(OBJDIR)/float.o \ + $(OBJDIR)/format.o \ + $(OBJDIR)/lpc_flac.o \ + $(OBJDIR)/md5.o \ + $(OBJDIR)/memory.o \ + $(OBJDIR)/stream_decoder.o \ + $(OBJDIR)/stream_encoder.o \ + $(OBJDIR)/stream_encoder_framing.o \ + $(OBJDIR)/window_flac.o \ + $(OBJDIR)/bitwise.o \ + $(OBJDIR)/framing.o \ + $(OBJDIR)/analysis.o \ + $(OBJDIR)/bitrate.o \ + $(OBJDIR)/block.o \ + $(OBJDIR)/codebook.o \ + $(OBJDIR)/envelope.o \ + $(OBJDIR)/floor0.o \ + $(OBJDIR)/floor1.o \ + $(OBJDIR)/info.o \ + $(OBJDIR)/lookup.o \ + $(OBJDIR)/lpc.o \ + $(OBJDIR)/lsp.o \ + $(OBJDIR)/mapping0.o \ + $(OBJDIR)/mdct.o \ + $(OBJDIR)/psy.o \ + $(OBJDIR)/registry.o \ + $(OBJDIR)/res0.o \ + $(OBJDIR)/sharedbook.o \ + $(OBJDIR)/smallft.o \ + $(OBJDIR)/synthesis.o \ + $(OBJDIR)/vorbisenc.o \ + $(OBJDIR)/vorbisfile.o \ + $(OBJDIR)/window.o \ + $(OBJDIR)/juce_AudioFormatReaderSource.o \ + $(OBJDIR)/juce_AudioSourcePlayer.o \ + $(OBJDIR)/juce_AudioTransportSource.o \ + $(OBJDIR)/juce_BufferingAudioSource.o \ + $(OBJDIR)/juce_ChannelRemappingAudioSource.o \ + $(OBJDIR)/juce_IIRFilterAudioSource.o \ + $(OBJDIR)/juce_MixerAudioSource.o \ + $(OBJDIR)/juce_ResamplingAudioSource.o \ + $(OBJDIR)/juce_ToneGeneratorAudioSource.o \ + $(OBJDIR)/juce_AudioDeviceManager.o \ + $(OBJDIR)/juce_AudioIODevice.o \ + $(OBJDIR)/juce_AudioIODeviceType.o \ + $(OBJDIR)/juce_Sampler.o \ + $(OBJDIR)/juce_Synthesiser.o \ + $(OBJDIR)/juce_FileBasedDocument.o \ + $(OBJDIR)/juce_RecentlyOpenedFilesList.o \ + $(OBJDIR)/juce_UndoManager.o \ + $(OBJDIR)/juce_ActionBroadcaster.o \ + $(OBJDIR)/juce_ActionListenerList.o \ + $(OBJDIR)/juce_AsyncUpdater.o \ + $(OBJDIR)/juce_ChangeBroadcaster.o \ + $(OBJDIR)/juce_ChangeListenerList.o \ + $(OBJDIR)/juce_InterprocessConnection.o \ + $(OBJDIR)/juce_InterprocessConnectionServer.o \ + $(OBJDIR)/juce_Message.o \ + $(OBJDIR)/juce_MessageListener.o \ + $(OBJDIR)/juce_MessageManager.o \ + $(OBJDIR)/juce_MultiTimer.o \ + $(OBJDIR)/juce_Timer.o \ + $(OBJDIR)/juce_Brush.o \ + $(OBJDIR)/juce_GradientBrush.o \ + $(OBJDIR)/juce_ImageBrush.o \ + $(OBJDIR)/juce_SolidColourBrush.o \ + $(OBJDIR)/juce_Colour.o \ + $(OBJDIR)/juce_ColourGradient.o \ + $(OBJDIR)/juce_Colours.o \ + $(OBJDIR)/juce_EdgeTable.o \ + $(OBJDIR)/juce_Graphics.o \ + $(OBJDIR)/juce_Justification.o \ + $(OBJDIR)/juce_LowLevelGraphicsPostScriptRenderer.o \ + $(OBJDIR)/juce_LowLevelGraphicsSoftwareRenderer.o \ + $(OBJDIR)/juce_RectanglePlacement.o \ + $(OBJDIR)/juce_Drawable.o \ + $(OBJDIR)/juce_DrawableComposite.o \ + $(OBJDIR)/juce_DrawableImage.o \ + $(OBJDIR)/juce_DrawablePath.o \ + $(OBJDIR)/juce_DrawableText.o \ + $(OBJDIR)/juce_SVGParser.o \ + $(OBJDIR)/juce_DropShadowEffect.o \ + $(OBJDIR)/juce_GlowEffect.o \ + $(OBJDIR)/juce_ReduceOpacityEffect.o \ + $(OBJDIR)/juce_Font.o \ + $(OBJDIR)/juce_GlyphArrangement.o \ + $(OBJDIR)/juce_TextLayout.o \ + $(OBJDIR)/juce_Typeface.o \ + $(OBJDIR)/juce_AffineTransform.o \ + $(OBJDIR)/juce_BorderSize.o \ + $(OBJDIR)/juce_Line.o \ + $(OBJDIR)/juce_Path.o \ + $(OBJDIR)/juce_PathIterator.o \ + $(OBJDIR)/juce_PathStrokeType.o \ + $(OBJDIR)/juce_Point.o \ + $(OBJDIR)/juce_PositionedRectangle.o \ + $(OBJDIR)/juce_Rectangle.o \ + $(OBJDIR)/juce_RectangleList.o \ + $(OBJDIR)/juce_Image.o \ + $(OBJDIR)/juce_ImageCache.o \ + $(OBJDIR)/juce_ImageConvolutionKernel.o \ + $(OBJDIR)/juce_ImageFileFormat.o \ + $(OBJDIR)/juce_GIFLoader.o \ + $(OBJDIR)/juce_JPEGLoader.o \ + $(OBJDIR)/juce_PNGLoader.o \ + $(OBJDIR)/jcapimin.o \ + $(OBJDIR)/jcapistd.o \ + $(OBJDIR)/jccoefct.o \ + $(OBJDIR)/jccolor.o \ + $(OBJDIR)/jcdctmgr.o \ + $(OBJDIR)/jchuff.o \ + $(OBJDIR)/jcinit.o \ + $(OBJDIR)/jcmainct.o \ + $(OBJDIR)/jcmarker.o \ + $(OBJDIR)/jcmaster.o \ + $(OBJDIR)/jcomapi.o \ + $(OBJDIR)/jcparam.o \ + $(OBJDIR)/jcphuff.o \ + $(OBJDIR)/jcprepct.o \ + $(OBJDIR)/jcsample.o \ + $(OBJDIR)/jctrans.o \ + $(OBJDIR)/jdapimin.o \ + $(OBJDIR)/jdapistd.o \ + $(OBJDIR)/jdatasrc.o \ + $(OBJDIR)/jdcoefct.o \ + $(OBJDIR)/jdcolor.o \ + $(OBJDIR)/jddctmgr.o \ + $(OBJDIR)/jdhuff.o \ + $(OBJDIR)/jdinput.o \ + $(OBJDIR)/jdmainct.o \ + $(OBJDIR)/jdmarker.o \ + $(OBJDIR)/jdmaster.o \ + $(OBJDIR)/jdmerge.o \ + $(OBJDIR)/jdphuff.o \ + $(OBJDIR)/jdpostct.o \ + $(OBJDIR)/jdsample.o \ + $(OBJDIR)/jdtrans.o \ + $(OBJDIR)/jerror.o \ + $(OBJDIR)/jfdctflt.o \ + $(OBJDIR)/jfdctfst.o \ + $(OBJDIR)/jfdctint.o \ + $(OBJDIR)/jidctflt.o \ + $(OBJDIR)/jidctfst.o \ + $(OBJDIR)/jidctint.o \ + $(OBJDIR)/jidctred.o \ + $(OBJDIR)/jmemmgr.o \ + $(OBJDIR)/jmemnobs.o \ + $(OBJDIR)/jquant1.o \ + $(OBJDIR)/jquant2.o \ + $(OBJDIR)/jutils.o \ + $(OBJDIR)/transupp.o \ + $(OBJDIR)/png.o \ + $(OBJDIR)/pngerror.o \ + $(OBJDIR)/pnggccrd.o \ + $(OBJDIR)/pngget.o \ + $(OBJDIR)/pngmem.o \ + $(OBJDIR)/pngpread.o \ + $(OBJDIR)/pngread.o \ + $(OBJDIR)/pngrio.o \ + $(OBJDIR)/pngrtran.o \ + $(OBJDIR)/pngrutil.o \ + $(OBJDIR)/pngset.o \ + $(OBJDIR)/pngtrans.o \ + $(OBJDIR)/pngvcrd.o \ + $(OBJDIR)/pngwio.o \ + $(OBJDIR)/pngwrite.o \ + $(OBJDIR)/pngwtran.o \ + $(OBJDIR)/pngwutil.o \ + $(OBJDIR)/juce_Component.o \ + $(OBJDIR)/juce_ComponentListener.o \ + $(OBJDIR)/juce_Desktop.o \ + $(OBJDIR)/juce_ArrowButton.o \ + $(OBJDIR)/juce_Button.o \ + $(OBJDIR)/juce_DrawableButton.o \ + $(OBJDIR)/juce_HyperlinkButton.o \ + $(OBJDIR)/juce_ImageButton.o \ + $(OBJDIR)/juce_ShapeButton.o \ + $(OBJDIR)/juce_TextButton.o \ + $(OBJDIR)/juce_ToggleButton.o \ + $(OBJDIR)/juce_ToolbarButton.o \ + $(OBJDIR)/juce_ComboBox.o \ + $(OBJDIR)/juce_Label.o \ + $(OBJDIR)/juce_ListBox.o \ + $(OBJDIR)/juce_ProgressBar.o \ + $(OBJDIR)/juce_Slider.o \ + $(OBJDIR)/juce_TableHeaderComponent.o \ + $(OBJDIR)/juce_TableListBox.o \ + $(OBJDIR)/juce_TextEditor.o \ + $(OBJDIR)/juce_Toolbar.o \ + $(OBJDIR)/juce_ToolbarItemComponent.o \ + $(OBJDIR)/juce_ToolbarItemPalette.o \ + $(OBJDIR)/juce_TreeView.o \ + $(OBJDIR)/juce_DirectoryContentsList.o \ + $(OBJDIR)/juce_FileBrowserComponent.o \ + $(OBJDIR)/juce_FileChooser.o \ + $(OBJDIR)/juce_FileChooserDialogBox.o \ + $(OBJDIR)/juce_FileFilter.o \ + $(OBJDIR)/juce_FileListComponent.o \ + $(OBJDIR)/juce_FilenameComponent.o \ + $(OBJDIR)/juce_ImagePreviewComponent.o \ + $(OBJDIR)/juce_WildcardFileFilter.o \ + $(OBJDIR)/juce_KeyboardFocusTraverser.o \ + $(OBJDIR)/juce_KeyListener.o \ + $(OBJDIR)/juce_KeyMappingEditorComponent.o \ + $(OBJDIR)/juce_KeyPress.o \ + $(OBJDIR)/juce_KeyPressMappingSet.o \ + $(OBJDIR)/juce_ModifierKeys.o \ + $(OBJDIR)/juce_ComponentAnimator.o \ + $(OBJDIR)/juce_ComponentBoundsConstrainer.o \ + $(OBJDIR)/juce_ComponentMovementWatcher.o \ + $(OBJDIR)/juce_GroupComponent.o \ + $(OBJDIR)/juce_MultiDocumentPanel.o \ + $(OBJDIR)/juce_ResizableBorderComponent.o \ + $(OBJDIR)/juce_ResizableCornerComponent.o \ + $(OBJDIR)/juce_ScrollBar.o \ + $(OBJDIR)/juce_StretchableLayoutManager.o \ + $(OBJDIR)/juce_StretchableLayoutResizerBar.o \ + $(OBJDIR)/juce_StretchableObjectResizer.o \ + $(OBJDIR)/juce_TabbedButtonBar.o \ + $(OBJDIR)/juce_TabbedComponent.o \ + $(OBJDIR)/juce_Viewport.o \ + $(OBJDIR)/juce_LookAndFeel.o \ + $(OBJDIR)/juce_ShinyLookAndFeel.o \ + $(OBJDIR)/juce_MenuBarComponent.o \ + $(OBJDIR)/juce_MenuBarModel.o \ + $(OBJDIR)/juce_PopupMenu.o \ + $(OBJDIR)/juce_ComponentDragger.o \ + $(OBJDIR)/juce_DragAndDropContainer.o \ + $(OBJDIR)/juce_MouseCursor.o \ + $(OBJDIR)/juce_MouseEvent.o \ + $(OBJDIR)/juce_MouseHoverDetector.o \ + $(OBJDIR)/juce_MouseListener.o \ + $(OBJDIR)/juce_BooleanPropertyComponent.o \ + $(OBJDIR)/juce_ButtonPropertyComponent.o \ + $(OBJDIR)/juce_ChoicePropertyComponent.o \ + $(OBJDIR)/juce_PropertyComponent.o \ + $(OBJDIR)/juce_PropertyPanel.o \ + $(OBJDIR)/juce_SliderPropertyComponent.o \ + $(OBJDIR)/juce_TextPropertyComponent.o \ + $(OBJDIR)/juce_AudioDeviceSelectorComponent.o \ + $(OBJDIR)/juce_BubbleComponent.o \ + $(OBJDIR)/juce_BubbleMessageComponent.o \ + $(OBJDIR)/juce_ColourSelector.o \ + $(OBJDIR)/juce_DropShadower.o \ + $(OBJDIR)/juce_MagnifierComponent.o \ + $(OBJDIR)/juce_MidiKeyboardComponent.o \ + $(OBJDIR)/juce_OpenGLComponent.o \ + $(OBJDIR)/juce_PreferencesPanel.o \ + $(OBJDIR)/juce_QuickTimeMovieComponent.o \ + $(OBJDIR)/juce_SystemTrayIconComponent.o \ + $(OBJDIR)/juce_AlertWindow.o \ + $(OBJDIR)/juce_ComponentPeer.o \ + $(OBJDIR)/juce_DialogWindow.o \ + $(OBJDIR)/juce_DocumentWindow.o \ + $(OBJDIR)/juce_ResizableWindow.o \ + $(OBJDIR)/juce_SplashScreen.o \ + $(OBJDIR)/juce_ThreadWithProgressWindow.o \ + $(OBJDIR)/juce_TooltipWindow.o \ + $(OBJDIR)/juce_TopLevelWindow.o \ + $(OBJDIR)/juce_linux_Audio.o \ + $(OBJDIR)/juce_linux_AudioCDReader.o \ + $(OBJDIR)/juce_linux_FileChooser.o \ + $(OBJDIR)/juce_linux_Files.o \ + $(OBJDIR)/juce_linux_Fonts.o \ + $(OBJDIR)/juce_linux_Messaging.o \ + $(OBJDIR)/juce_linux_Midi.o \ + $(OBJDIR)/juce_linux_NamedPipe.o \ + $(OBJDIR)/juce_linux_Network.o \ + $(OBJDIR)/juce_linux_SystemStats.o \ + $(OBJDIR)/juce_linux_Threads.o \ + $(OBJDIR)/juce_linux_Windowing.o \ + +CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) +ifeq (,$(CMD)) + CMD_MKBINDIR := mkdir -p $(BINDIR) + CMD_MKLIBDIR := mkdir -p $(LIBDIR) + CMD_MKOUTDIR := mkdir -p $(OUTDIR) + CMD_MKOBJDIR := mkdir -p $(OBJDIR) +else + CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) + CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) + CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) + CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) +endif + +.PHONY: clean + +$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) + @echo Linking JUCE + -@$(CMD_MKBINDIR) + -@$(CMD_MKLIBDIR) + -@$(CMD_MKOUTDIR) + @ar -cr $@ $^ + @ranlib $@ + +clean: + @echo Cleaning JUCE + -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) + +$(OBJDIR)/juce_FileLogger.o: ../../src/juce_core/basics/juce_FileLogger.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Logger.o: ../../src/juce_core/basics/juce_Logger.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Random.o: ../../src/juce_core/basics/juce_Random.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_RelativeTime.o: ../../src/juce_core/basics/juce_RelativeTime.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SystemStats.o: ../../src/juce_core/basics/juce_SystemStats.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Time.o: ../../src/juce_core/basics/juce_Time.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BlowFish.o: ../../src/juce_core/cryptography/juce_BlowFish.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MD5.o: ../../src/juce_core/cryptography/juce_MD5.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Primes.o: ../../src/juce_core/cryptography/juce_Primes.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_RSAKey.o: ../../src/juce_core/cryptography/juce_RSAKey.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BitArray.o: ../../src/juce_core/containers/juce_BitArray.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MemoryBlock.o: ../../src/juce_core/containers/juce_MemoryBlock.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PropertySet.o: ../../src/juce_core/containers/juce_PropertySet.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_InputStream.o: ../../src/juce_core/io/juce_InputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_OutputStream.o: ../../src/juce_core/io/juce_OutputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DirectoryIterator.o: ../../src/juce_core/io/files/juce_DirectoryIterator.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_File.o: ../../src/juce_core/io/files/juce_File.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileInputStream.o: ../../src/juce_core/io/files/juce_FileInputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileOutputStream.o: ../../src/juce_core/io/files/juce_FileOutputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileSearchPath.o: ../../src/juce_core/io/files/juce_FileSearchPath.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_NamedPipe.o: ../../src/juce_core/io/files/juce_NamedPipe.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Socket.o: ../../src/juce_core/io/network/juce_Socket.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_URL.o: ../../src/juce_core/io/network/juce_URL.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BufferedInputStream.o: ../../src/juce_core/io/streams/juce_BufferedInputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GZIPCompressorOutputStream.o: ../../src/juce_core/io/streams/juce_GZIPCompressorOutputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GZIPDecompressorInputStream.o: ../../src/juce_core/io/streams/juce_GZIPDecompressorInputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MemoryInputStream.o: ../../src/juce_core/io/streams/juce_MemoryInputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MemoryOutputStream.o: ../../src/juce_core/io/streams/juce_MemoryOutputStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SubregionStream.o: ../../src/juce_core/io/streams/juce_SubregionStream.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/adler32.o: ../../src/juce_core/io/streams/zlib/adler32.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/compress.o: ../../src/juce_core/io/streams/zlib/compress.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/crc32.o: ../../src/juce_core/io/streams/zlib/crc32.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/deflate.o: ../../src/juce_core/io/streams/zlib/deflate.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/infback.o: ../../src/juce_core/io/streams/zlib/infback.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/inffast.o: ../../src/juce_core/io/streams/zlib/inffast.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/inflate.o: ../../src/juce_core/io/streams/zlib/inflate.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/inftrees.o: ../../src/juce_core/io/streams/zlib/inftrees.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/trees.o: ../../src/juce_core/io/streams/zlib/trees.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/uncompr.o: ../../src/juce_core/io/streams/zlib/uncompr.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/zutil.o: ../../src/juce_core/io/streams/zlib/zutil.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PerformanceCounter.o: ../../src/juce_core/misc/juce_PerformanceCounter.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Uuid.o: ../../src/juce_core/misc/juce_Uuid.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ZipFile.o: ../../src/juce_core/misc/juce_ZipFile.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_CharacterFunctions.o: ../../src/juce_core/text/juce_CharacterFunctions.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_LocalisedStrings.o: ../../src/juce_core/text/juce_LocalisedStrings.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_String.o: ../../src/juce_core/text/juce_String.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_StringArray.o: ../../src/juce_core/text/juce_StringArray.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_StringPairArray.o: ../../src/juce_core/text/juce_StringPairArray.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_XmlDocument.o: ../../src/juce_core/text/juce_XmlDocument.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_XmlElement.o: ../../src/juce_core/text/juce_XmlElement.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_InterProcessLock.o: ../../src/juce_core/threads/juce_InterProcessLock.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ReadWriteLock.o: ../../src/juce_core/threads/juce_ReadWriteLock.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Thread.o: ../../src/juce_core/threads/juce_Thread.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ThreadPool.o: ../../src/juce_core/threads/juce_ThreadPool.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TimeSliceThread.o: ../../src/juce_core/threads/juce_TimeSliceThread.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Application.o: ../../src/juce_appframework/application/juce_Application.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ApplicationCommandInfo.o: ../../src/juce_appframework/application/juce_ApplicationCommandInfo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ApplicationCommandManager.o: ../../src/juce_appframework/application/juce_ApplicationCommandManager.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ApplicationCommandTarget.o: ../../src/juce_appframework/application/juce_ApplicationCommandTarget.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ApplicationProperties.o: ../../src/juce_appframework/application/juce_ApplicationProperties.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DeletedAtShutdown.o: ../../src/juce_appframework/application/juce_DeletedAtShutdown.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PropertiesFile.o: ../../src/juce_appframework/application/juce_PropertiesFile.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioDataConverters.o: ../../src/juce_appframework/audio/dsp/juce_AudioDataConverters.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioSampleBuffer.o: ../../src/juce_appframework/audio/dsp/juce_AudioSampleBuffer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_IIRFilter.o: ../../src/juce_appframework/audio/dsp/juce_IIRFilter.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiBuffer.o: ../../src/juce_appframework/audio/midi/juce_MidiBuffer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiFile.o: ../../src/juce_appframework/audio/midi/juce_MidiFile.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiKeyboardState.o: ../../src/juce_appframework/audio/midi/juce_MidiKeyboardState.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiMessage.o: ../../src/juce_appframework/audio/midi/juce_MidiMessage.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiMessageCollector.o: ../../src/juce_appframework/audio/midi/juce_MidiMessageCollector.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiMessageSequence.o: ../../src/juce_appframework/audio/midi/juce_MidiMessageSequence.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AiffAudioFormat.o: ../../src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioCDReader.o: ../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioFormat.o: ../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioFormatManager.o: ../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormatManager.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioSubsectionReader.o: ../../src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FlacAudioFormat.o: ../../src/juce_appframework/audio/audio_file_formats/juce_FlacAudioFormat.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_OggVorbisAudioFormat.o: ../../src/juce_appframework/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_WavAudioFormat.o: ../../src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/bitbuffer.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/bitbuffer.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/bitmath.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/bitmath.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/cpu.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/cpu.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/crc.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/crc.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/fixed.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/fixed.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/float.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/float.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/format.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/format.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/lpc_flac.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/lpc_flac.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/md5.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/md5.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/memory.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/memory.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/stream_decoder.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/stream_decoder.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/stream_encoder.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/stream_encoder.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/stream_encoder_framing.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/stream_encoder_framing.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/window_flac.o: ../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/window_flac.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/bitwise.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/bitwise.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/framing.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/framing.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/analysis.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/analysis.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/bitrate.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/bitrate.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/block.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/block.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/codebook.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/codebook.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/envelope.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/envelope.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/floor0.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/floor0.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/floor1.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/floor1.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/info.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/info.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/lookup.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lookup.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/lpc.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lpc.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/lsp.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/lsp.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/mapping0.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/mapping0.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/mdct.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/mdct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/psy.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/psy.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/registry.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/registry.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/res0.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/res0.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/sharedbook.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/sharedbook.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/smallft.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/smallft.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/synthesis.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/synthesis.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/vorbisenc.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/vorbisenc.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/vorbisfile.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/vorbisfile.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/window.o: ../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/window.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioFormatReaderSource.o: ../../src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioSourcePlayer.o: ../../src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioTransportSource.o: ../../src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BufferingAudioSource.o: ../../src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ChannelRemappingAudioSource.o: ../../src/juce_appframework/audio/audio_sources/juce_ChannelRemappingAudioSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_IIRFilterAudioSource.o: ../../src/juce_appframework/audio/audio_sources/juce_IIRFilterAudioSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MixerAudioSource.o: ../../src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ResamplingAudioSource.o: ../../src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ToneGeneratorAudioSource.o: ../../src/juce_appframework/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioDeviceManager.o: ../../src/juce_appframework/audio/devices/juce_AudioDeviceManager.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioIODevice.o: ../../src/juce_appframework/audio/devices/juce_AudioIODevice.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioIODeviceType.o: ../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Sampler.o: ../../src/juce_appframework/audio/synthesisers/juce_Sampler.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Synthesiser.o: ../../src/juce_appframework/audio/synthesisers/juce_Synthesiser.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileBasedDocument.o: ../../src/juce_appframework/documents/juce_FileBasedDocument.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_RecentlyOpenedFilesList.o: ../../src/juce_appframework/documents/juce_RecentlyOpenedFilesList.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_UndoManager.o: ../../src/juce_appframework/documents/juce_UndoManager.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ActionBroadcaster.o: ../../src/juce_appframework/events/juce_ActionBroadcaster.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ActionListenerList.o: ../../src/juce_appframework/events/juce_ActionListenerList.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AsyncUpdater.o: ../../src/juce_appframework/events/juce_AsyncUpdater.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ChangeBroadcaster.o: ../../src/juce_appframework/events/juce_ChangeBroadcaster.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ChangeListenerList.o: ../../src/juce_appframework/events/juce_ChangeListenerList.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_InterprocessConnection.o: ../../src/juce_appframework/events/juce_InterprocessConnection.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_InterprocessConnectionServer.o: ../../src/juce_appframework/events/juce_InterprocessConnectionServer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Message.o: ../../src/juce_appframework/events/juce_Message.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MessageListener.o: ../../src/juce_appframework/events/juce_MessageListener.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MessageManager.o: ../../src/juce_appframework/events/juce_MessageManager.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MultiTimer.o: ../../src/juce_appframework/events/juce_MultiTimer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Timer.o: ../../src/juce_appframework/events/juce_Timer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Brush.o: ../../src/juce_appframework/gui/graphics/brushes/juce_Brush.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GradientBrush.o: ../../src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ImageBrush.o: ../../src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SolidColourBrush.o: ../../src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Colour.o: ../../src/juce_appframework/gui/graphics/colour/juce_Colour.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ColourGradient.o: ../../src/juce_appframework/gui/graphics/colour/juce_ColourGradient.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Colours.o: ../../src/juce_appframework/gui/graphics/colour/juce_Colours.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_EdgeTable.o: ../../src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Graphics.o: ../../src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Justification.o: ../../src/juce_appframework/gui/graphics/contexts/juce_Justification.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_LowLevelGraphicsPostScriptRenderer.o: ../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_LowLevelGraphicsSoftwareRenderer.o: ../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_RectanglePlacement.o: ../../src/juce_appframework/gui/graphics/contexts/juce_RectanglePlacement.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Drawable.o: ../../src/juce_appframework/gui/graphics/drawables/juce_Drawable.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DrawableComposite.o: ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DrawableImage.o: ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DrawablePath.o: ../../src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DrawableText.o: ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableText.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SVGParser.o: ../../src/juce_appframework/gui/graphics/drawables/juce_SVGParser.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DropShadowEffect.o: ../../src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GlowEffect.o: ../../src/juce_appframework/gui/graphics/effects/juce_GlowEffect.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ReduceOpacityEffect.o: ../../src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Font.o: ../../src/juce_appframework/gui/graphics/fonts/juce_Font.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GlyphArrangement.o: ../../src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TextLayout.o: ../../src/juce_appframework/gui/graphics/fonts/juce_TextLayout.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Typeface.o: ../../src/juce_appframework/gui/graphics/fonts/juce_Typeface.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AffineTransform.o: ../../src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BorderSize.o: ../../src/juce_appframework/gui/graphics/geometry/juce_BorderSize.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Line.o: ../../src/juce_appframework/gui/graphics/geometry/juce_Line.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Path.o: ../../src/juce_appframework/gui/graphics/geometry/juce_Path.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PathIterator.o: ../../src/juce_appframework/gui/graphics/geometry/juce_PathIterator.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PathStrokeType.o: ../../src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Point.o: ../../src/juce_appframework/gui/graphics/geometry/juce_Point.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PositionedRectangle.o: ../../src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Rectangle.o: ../../src/juce_appframework/gui/graphics/geometry/juce_Rectangle.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_RectangleList.o: ../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Image.o: ../../src/juce_appframework/gui/graphics/imaging/juce_Image.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ImageCache.o: ../../src/juce_appframework/gui/graphics/imaging/juce_ImageCache.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ImageConvolutionKernel.o: ../../src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ImageFileFormat.o: ../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GIFLoader.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_JPEGLoader.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_JPEGLoader.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PNGLoader.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_PNGLoader.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jcapimin.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapimin.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcapistd.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapistd.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jccoefct.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccoefct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jccolor.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccolor.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcdctmgr.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcdctmgr.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jchuff.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jchuff.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcinit.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcinit.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcmainct.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmainct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcmarker.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmarker.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcmaster.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmaster.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcomapi.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcomapi.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcparam.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcparam.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcphuff.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcphuff.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcprepct.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcprepct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jcsample.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcsample.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jctrans.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jctrans.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdapimin.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapimin.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdapistd.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapistd.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdatasrc.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdatasrc.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdcoefct.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcoefct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdcolor.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcolor.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jddctmgr.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jddctmgr.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdhuff.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdhuff.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdinput.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdinput.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdmainct.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmainct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdmarker.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmarker.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdmaster.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmaster.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdmerge.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmerge.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdphuff.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdphuff.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdpostct.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdpostct.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdsample.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdsample.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jdtrans.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdtrans.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jerror.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jerror.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jfdctflt.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctflt.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jfdctfst.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctfst.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jfdctint.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctint.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jidctflt.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctflt.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jidctfst.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctfst.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jidctint.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctint.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jidctred.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctred.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jmemmgr.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemmgr.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jmemnobs.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemnobs.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jquant1.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant1.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jquant2.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant2.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/jutils.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jutils.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/transupp.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/transupp.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/png.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/png.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngerror.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngerror.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pnggccrd.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pnggccrd.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngget.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngget.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngmem.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngmem.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngpread.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngpread.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngread.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngread.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngrio.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrio.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngrtran.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrtran.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngrutil.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrutil.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngset.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngset.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngtrans.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngtrans.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngvcrd.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngvcrd.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngwio.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwio.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngwrite.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwrite.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngwtran.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwtran.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/pngwutil.o: ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwutil.c + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CC) $(CFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Component.o: ../../src/juce_appframework/gui/components/juce_Component.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComponentListener.o: ../../src/juce_appframework/gui/components/juce_ComponentListener.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Desktop.o: ../../src/juce_appframework/gui/components/juce_Desktop.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ArrowButton.o: ../../src/juce_appframework/gui/components/buttons/juce_ArrowButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Button.o: ../../src/juce_appframework/gui/components/buttons/juce_Button.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DrawableButton.o: ../../src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_HyperlinkButton.o: ../../src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ImageButton.o: ../../src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ShapeButton.o: ../../src/juce_appframework/gui/components/buttons/juce_ShapeButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TextButton.o: ../../src/juce_appframework/gui/components/buttons/juce_TextButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ToggleButton.o: ../../src/juce_appframework/gui/components/buttons/juce_ToggleButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ToolbarButton.o: ../../src/juce_appframework/gui/components/buttons/juce_ToolbarButton.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComboBox.o: ../../src/juce_appframework/gui/components/controls/juce_ComboBox.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Label.o: ../../src/juce_appframework/gui/components/controls/juce_Label.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ListBox.o: ../../src/juce_appframework/gui/components/controls/juce_ListBox.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ProgressBar.o: ../../src/juce_appframework/gui/components/controls/juce_ProgressBar.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Slider.o: ../../src/juce_appframework/gui/components/controls/juce_Slider.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TableHeaderComponent.o: ../../src/juce_appframework/gui/components/controls/juce_TableHeaderComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TableListBox.o: ../../src/juce_appframework/gui/components/controls/juce_TableListBox.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TextEditor.o: ../../src/juce_appframework/gui/components/controls/juce_TextEditor.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Toolbar.o: ../../src/juce_appframework/gui/components/controls/juce_Toolbar.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ToolbarItemComponent.o: ../../src/juce_appframework/gui/components/controls/juce_ToolbarItemComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ToolbarItemPalette.o: ../../src/juce_appframework/gui/components/controls/juce_ToolbarItemPalette.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TreeView.o: ../../src/juce_appframework/gui/components/controls/juce_TreeView.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DirectoryContentsList.o: ../../src/juce_appframework/gui/components/filebrowser/juce_DirectoryContentsList.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileBrowserComponent.o: ../../src/juce_appframework/gui/components/filebrowser/juce_FileBrowserComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileChooser.o: ../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileChooserDialogBox.o: ../../src/juce_appframework/gui/components/filebrowser/juce_FileChooserDialogBox.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileFilter.o: ../../src/juce_appframework/gui/components/filebrowser/juce_FileFilter.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FileListComponent.o: ../../src/juce_appframework/gui/components/filebrowser/juce_FileListComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_FilenameComponent.o: ../../src/juce_appframework/gui/components/filebrowser/juce_FilenameComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ImagePreviewComponent.o: ../../src/juce_appframework/gui/components/filebrowser/juce_ImagePreviewComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_WildcardFileFilter.o: ../../src/juce_appframework/gui/components/filebrowser/juce_WildcardFileFilter.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_KeyboardFocusTraverser.o: ../../src/juce_appframework/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_KeyListener.o: ../../src/juce_appframework/gui/components/keyboard/juce_KeyListener.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_KeyMappingEditorComponent.o: ../../src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_KeyPress.o: ../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_KeyPressMappingSet.o: ../../src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ModifierKeys.o: ../../src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComponentAnimator.o: ../../src/juce_appframework/gui/components/layout/juce_ComponentAnimator.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComponentBoundsConstrainer.o: ../../src/juce_appframework/gui/components/layout/juce_ComponentBoundsConstrainer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComponentMovementWatcher.o: ../../src/juce_appframework/gui/components/layout/juce_ComponentMovementWatcher.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_GroupComponent.o: ../../src/juce_appframework/gui/components/layout/juce_GroupComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MultiDocumentPanel.o: ../../src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ResizableBorderComponent.o: ../../src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ResizableCornerComponent.o: ../../src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ScrollBar.o: ../../src/juce_appframework/gui/components/layout/juce_ScrollBar.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_StretchableLayoutManager.o: ../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_StretchableLayoutResizerBar.o: ../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_StretchableObjectResizer.o: ../../src/juce_appframework/gui/components/layout/juce_StretchableObjectResizer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TabbedButtonBar.o: ../../src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TabbedComponent.o: ../../src/juce_appframework/gui/components/layout/juce_TabbedComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_Viewport.o: ../../src/juce_appframework/gui/components/layout/juce_Viewport.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_LookAndFeel.o: ../../src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ShinyLookAndFeel.o: ../../src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MenuBarComponent.o: ../../src/juce_appframework/gui/components/menus/juce_MenuBarComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MenuBarModel.o: ../../src/juce_appframework/gui/components/menus/juce_MenuBarModel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PopupMenu.o: ../../src/juce_appframework/gui/components/menus/juce_PopupMenu.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComponentDragger.o: ../../src/juce_appframework/gui/components/mouse/juce_ComponentDragger.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DragAndDropContainer.o: ../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MouseCursor.o: ../../src/juce_appframework/gui/components/mouse/juce_MouseCursor.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MouseEvent.o: ../../src/juce_appframework/gui/components/mouse/juce_MouseEvent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MouseHoverDetector.o: ../../src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MouseListener.o: ../../src/juce_appframework/gui/components/mouse/juce_MouseListener.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BooleanPropertyComponent.o: ../../src/juce_appframework/gui/components/properties/juce_BooleanPropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ButtonPropertyComponent.o: ../../src/juce_appframework/gui/components/properties/juce_ButtonPropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ChoicePropertyComponent.o: ../../src/juce_appframework/gui/components/properties/juce_ChoicePropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PropertyComponent.o: ../../src/juce_appframework/gui/components/properties/juce_PropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PropertyPanel.o: ../../src/juce_appframework/gui/components/properties/juce_PropertyPanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SliderPropertyComponent.o: ../../src/juce_appframework/gui/components/properties/juce_SliderPropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TextPropertyComponent.o: ../../src/juce_appframework/gui/components/properties/juce_TextPropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AudioDeviceSelectorComponent.o: ../../src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BubbleComponent.o: ../../src/juce_appframework/gui/components/special/juce_BubbleComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_BubbleMessageComponent.o: ../../src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ColourSelector.o: ../../src/juce_appframework/gui/components/special/juce_ColourSelector.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DropShadower.o: ../../src/juce_appframework/gui/components/special/juce_DropShadower.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MagnifierComponent.o: ../../src/juce_appframework/gui/components/special/juce_MagnifierComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_MidiKeyboardComponent.o: ../../src/juce_appframework/gui/components/special/juce_MidiKeyboardComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_OpenGLComponent.o: ../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_PreferencesPanel.o: ../../src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_QuickTimeMovieComponent.o: ../../src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SystemTrayIconComponent.o: ../../src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_AlertWindow.o: ../../src/juce_appframework/gui/components/windows/juce_AlertWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ComponentPeer.o: ../../src/juce_appframework/gui/components/windows/juce_ComponentPeer.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DialogWindow.o: ../../src/juce_appframework/gui/components/windows/juce_DialogWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_DocumentWindow.o: ../../src/juce_appframework/gui/components/windows/juce_DocumentWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ResizableWindow.o: ../../src/juce_appframework/gui/components/windows/juce_ResizableWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_SplashScreen.o: ../../src/juce_appframework/gui/components/windows/juce_SplashScreen.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_ThreadWithProgressWindow.o: ../../src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TooltipWindow.o: ../../src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_TopLevelWindow.o: ../../src/juce_appframework/gui/components/windows/juce_TopLevelWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Audio.o: platform_specific_code/juce_linux_Audio.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_AudioCDReader.o: platform_specific_code/juce_linux_AudioCDReader.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_FileChooser.o: platform_specific_code/juce_linux_FileChooser.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Files.o: platform_specific_code/juce_linux_Files.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Fonts.o: platform_specific_code/juce_linux_Fonts.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Messaging.o: platform_specific_code/juce_linux_Messaging.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Midi.o: platform_specific_code/juce_linux_Midi.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_NamedPipe.o: platform_specific_code/juce_linux_NamedPipe.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Network.o: platform_specific_code/juce_linux_Network.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_SystemStats.o: platform_specific_code/juce_linux_SystemStats.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Threads.o: platform_specific_code/juce_linux_Threads.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/juce_linux_Windowing.o: platform_specific_code/juce_linux_Windowing.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJECTS:%.o=%.d) + diff --git a/build/linux/Makefile b/build/linux/Makefile new file mode 100644 index 0000000000..489d850119 --- /dev/null +++ b/build/linux/Makefile @@ -0,0 +1,25 @@ +# Makefile autogenerated by premake +# Don't edit this file! Instead edit `premake.lua` then rerun `make` +# Options: +# CONFIG=[Debug|Release] + +ifndef CONFIG + CONFIG=Debug +endif + +export CONFIG + +.PHONY: all clean JUCE + +all: JUCE + +Makefile: juce_premake.lua + @echo ==== Regenerating Makefiles ==== + @premake --file $^ --cc gcc --target gnu + +JUCE: + @echo ==== Building JUCE ==== + @$(MAKE) --no-print-directory -C . -f JUCE.make + +clean: + @$(MAKE) --no-print-directory -C . -f JUCE.make clean diff --git a/build/linux/juce_premake.lua b/build/linux/juce_premake.lua new file mode 100644 index 0000000000..7d72b549f8 --- /dev/null +++ b/build/linux/juce_premake.lua @@ -0,0 +1,138 @@ + +project.name = "JUCE" +project.bindir = "../../bin" +project.libdir = "../../bin" + +project.configs = { "Debug", "Release" } + +package = newpackage() +package.name = "JUCE" +package.kind = "lib" +package.language = "c++" + +package.objdir = "../../bin/intermediate_linux/" +package.config["Debug"].objdir = "../../bin/intermediate_linux/Debug" +package.config["Release"].objdir = "../../bin/intermediate_linux/Release" + +package.config["Debug"].target = "juce_debug" +package.config["Release"].target = "juce" + +package.config["Debug"].defines = { "LINUX=1", "DEBUG=1", "_DEBUG=1" }; +package.config["Debug"].buildoptions = { "-D_DEBUG -ggdb -Wall" } + +package.config["Release"].defines = { "LINUX=1", "NDEBUG=1" }; +package.config["Release"].buildoptions = { "-Wall" } + + +package.includepaths = { + "../../", + "/usr/include", + "/usr/include/freetype2" +} + +package.linkflags = { "static-runtime" } + + +package.files = { matchfiles ( + "../../src/*.h", + "../../src/juce_core/basics/*.cpp", + "../../src/juce_core/basics/*.h", + "../../src/juce_core/cryptography/*.cpp", + "../../src/juce_core/cryptography/*.h", + "../../src/juce_core/containers/*.cpp", + "../../src/juce_core/containers/*.h", + "../../src/juce_core/io/*.cpp", + "../../src/juce_core/io/*.h", + "../../src/juce_core/io/files/*.cpp", + "../../src/juce_core/io/files/*.h", + "../../src/juce_core/io/network/*.cpp", + "../../src/juce_core/io/network/*.h", + "../../src/juce_core/io/streams/*.cpp", + "../../src/juce_core/io/streams/*.h", + "../../src/juce_core/io/streams/zlib/*.cpp", + "../../src/juce_core/io/streams/zlib/*.c", + "../../src/juce_core/io/streams/zlib/*.h", + "../../src/juce_core/misc/*.cpp", + "../../src/juce_core/misc/*.h", + "../../src/juce_core/text/*.cpp", + "../../src/juce_core/text/*.h", + "../../src/juce_core/threads/*.cpp", + "../../src/juce_core/threads/*.h", + "../../src/juce_appframework/application/*.cpp", + "../../src/juce_appframework/application/*.h", + "../../src/juce_appframework/audio/*.cpp", + "../../src/juce_appframework/audio/*.h", + "../../src/juce_appframework/audio/dsp/*.cpp", + "../../src/juce_appframework/audio/dsp/*.h", + "../../src/juce_appframework/audio/midi/*.cpp", + "../../src/juce_appframework/audio/midi/*.h", + "../../src/juce_appframework/audio/audio_file_formats/*.cpp", + "../../src/juce_appframework/audio/audio_file_formats/*.h", + "../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/*.c", + "../../src/juce_appframework/audio/audio_file_formats/flac/libFLAC/*.h", + "../../src/juce_appframework/audio/audio_file_formats/oggvorbis/*.c", + "../../src/juce_appframework/audio/audio_file_formats/oggvorbis/*.h", + "../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/*.c", + "../../src/juce_appframework/audio/audio_file_formats/oggvorbis/libvorbis-1.1.2/lib/*.h", + "../../src/juce_appframework/audio/audio_sources/*.cpp", + "../../src/juce_appframework/audio/audio_sources/*.h", + "../../src/juce_appframework/audio/devices/*.cpp", + "../../src/juce_appframework/audio/devices/*.h", + "../../src/juce_appframework/audio/synthesisers/*.cpp", + "../../src/juce_appframework/audio/synthesisers/*.h", + "../../src/juce_appframework/documents/*.cpp", + "../../src/juce_appframework/documents/*.h", + "../../src/juce_appframework/events/*.cpp", + "../../src/juce_appframework/events/*.h", + "../../src/juce_appframework/gui/graphics/brushes/*.cpp", + "../../src/juce_appframework/gui/graphics/brushes/*.h", + "../../src/juce_appframework/gui/graphics/colour/*.cpp", + "../../src/juce_appframework/gui/graphics/colour/*.h", + "../../src/juce_appframework/gui/graphics/contexts/*.cpp", + "../../src/juce_appframework/gui/graphics/contexts/*.h", + "../../src/juce_appframework/gui/graphics/drawables/*.cpp", + "../../src/juce_appframework/gui/graphics/drawables/*.h", + "../../src/juce_appframework/gui/graphics/effects/*.cpp", + "../../src/juce_appframework/gui/graphics/effects/*.h", + "../../src/juce_appframework/gui/graphics/fonts/*.cpp", + "../../src/juce_appframework/gui/graphics/fonts/*.h", + "../../src/juce_appframework/gui/graphics/geometry/*.cpp", + "../../src/juce_appframework/gui/graphics/geometry/*.h", + "../../src/juce_appframework/gui/graphics/imaging/*.cpp", + "../../src/juce_appframework/gui/graphics/imaging/*.h", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/*.cpp", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/*.h", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/*.cpp", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/*.c", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/*.h", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/*.cpp", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/*.c", + "../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/*.h", + "../../src/juce_appframework/gui/components/*.cpp", + "../../src/juce_appframework/gui/components/*.h", + "../../src/juce_appframework/gui/components/buttons/*.cpp", + "../../src/juce_appframework/gui/components/buttons/*.h", + "../../src/juce_appframework/gui/components/controls/*.cpp", + "../../src/juce_appframework/gui/components/controls/*.h", + "../../src/juce_appframework/gui/components/filebrowser/*.cpp", + "../../src/juce_appframework/gui/components/filebrowser/*.h", + "../../src/juce_appframework/gui/components/keyboard/*.cpp", + "../../src/juce_appframework/gui/components/keyboard/*.h", + "../../src/juce_appframework/gui/components/layout/*.cpp", + "../../src/juce_appframework/gui/components/layout/*.h", + "../../src/juce_appframework/gui/components/lookandfeel/*.cpp", + "../../src/juce_appframework/gui/components/lookandfeel/*.h", + "../../src/juce_appframework/gui/components/menus/*.cpp", + "../../src/juce_appframework/gui/components/menus/*.h", + "../../src/juce_appframework/gui/components/mouse/*.cpp", + "../../src/juce_appframework/gui/components/mouse/*.h", + "../../src/juce_appframework/gui/components/properties/*.cpp", + "../../src/juce_appframework/gui/components/properties/*.h", + "../../src/juce_appframework/gui/components/special/*.cpp", + "../../src/juce_appframework/gui/components/special/*.h", + "../../src/juce_appframework/gui/components/windows/*.cpp", + "../../src/juce_appframework/gui/components/windows/*.h", + "platform_specific_code/*.h", + "platform_specific_code/*.cpp" + ) +} diff --git a/build/linux/platform_specific_code/juce_linux_Audio.cpp b/build/linux/platform_specific_code/juce_linux_Audio.cpp new file mode 100644 index 0000000000..137252e660 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Audio.cpp @@ -0,0 +1,962 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../juce_Config.h" +#if JUCE_BUILD_GUI_CLASSES + +#if JUCE_ALSA + +#include "linuxincludes.h" +#include + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/threads/juce_ScopedLock.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/io/files/juce_File.h" +#include "../../../src/juce_core/io/files/juce_FileInputStream.h" +#include "../../../src/juce_core/basics/juce_Singleton.h" +#include "../../../src/juce_appframework/audio/dsp/juce_AudioDataConverters.h" + +static const int maxNumChans = 64; + + +//============================================================================== +static void getDeviceSampleRates (snd_pcm_t* handle, Array & rates) +{ + const int ratesToTry[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; + + snd_pcm_hw_params_t* hwParams; + snd_pcm_hw_params_alloca (&hwParams); + + for (int i = 0; ratesToTry[i] != 0; ++i) + { + if (snd_pcm_hw_params_any (handle, hwParams) >= 0 + && snd_pcm_hw_params_test_rate (handle, hwParams, ratesToTry[i], 0) == 0) + { + rates.add (ratesToTry[i]); + } + } +} + +static void getDeviceNumChannels (snd_pcm_t* handle, unsigned int* minChans, unsigned int* maxChans) +{ + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca (¶ms); + + if (snd_pcm_hw_params_any (handle, params) >= 0) + { + snd_pcm_hw_params_get_channels_min (params, minChans); + snd_pcm_hw_params_get_channels_max (params, maxChans); + } +} + +static void getDeviceProperties (const String& id, + unsigned int& minChansOut, + unsigned int& maxChansOut, + unsigned int& minChansIn, + unsigned int& maxChansIn, + Array & rates) +{ + snd_ctl_t* handle; + + if (snd_ctl_open (&handle, id.upToLastOccurrenceOf (T(","), false, false), SND_CTL_NONBLOCK) >= 0) + { + snd_pcm_info_t* info; + snd_pcm_info_alloca (&info); + + snd_pcm_info_set_stream (info, SND_PCM_STREAM_PLAYBACK); + snd_pcm_info_set_device (info, id.fromLastOccurrenceOf (T(","), false, false).getIntValue()); + snd_pcm_info_set_subdevice (info, 0); + + if (snd_ctl_pcm_info (handle, info) >= 0) + { + snd_pcm_t* pcmHandle; + if (snd_pcm_open (&pcmHandle, id, SND_PCM_STREAM_PLAYBACK, SND_PCM_ASYNC | SND_PCM_NONBLOCK ) >= 0) + { + getDeviceNumChannels (pcmHandle, &minChansOut, &maxChansOut); + getDeviceSampleRates (pcmHandle, rates); + + snd_pcm_close (pcmHandle); + } + } + + snd_pcm_info_set_stream (info, SND_PCM_STREAM_CAPTURE); + + if (snd_ctl_pcm_info (handle, info) >= 0) + { + snd_pcm_t* pcmHandle; + if (snd_pcm_open (&pcmHandle, id, SND_PCM_STREAM_CAPTURE, SND_PCM_ASYNC | SND_PCM_NONBLOCK ) >= 0) + { + getDeviceNumChannels (pcmHandle, &minChansIn, &maxChansIn); + + if (rates.size() == 0) + getDeviceSampleRates (pcmHandle, rates); + + snd_pcm_close (pcmHandle); + } + } + + snd_ctl_close (handle); + } +} + +//============================================================================== +class ALSADevice +{ +public: + ALSADevice (const String& deviceName, + const bool forInput) + : handle (0), + bitDepth (16), + numChannelsRunning (0), + isInput (forInput), + sampleFormat (AudioDataConverters::int16LE) + { + failed (snd_pcm_open (&handle, deviceName, + forInput ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, + SND_PCM_ASYNC)); + } + + ~ALSADevice() + { + if (handle != 0) + snd_pcm_close (handle); + } + + bool setParameters (unsigned int sampleRate, int numChannels, int bufferSize) + { + if (handle == 0) + return false; + + snd_pcm_hw_params_t* hwParams; + snd_pcm_hw_params_alloca (&hwParams); + + if (failed (snd_pcm_hw_params_any (handle, hwParams))) + return false; + + if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_NONINTERLEAVED) >= 0) + isInterleaved = false; + else if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_INTERLEAVED) >= 0) + isInterleaved = true; + else + { + jassertfalse + return false; + } + + const int formatsToTry[] = { SND_PCM_FORMAT_FLOAT_LE, 32, AudioDataConverters::float32LE, + SND_PCM_FORMAT_FLOAT_BE, 32, AudioDataConverters::float32BE, + SND_PCM_FORMAT_S32_LE, 32, AudioDataConverters::int32LE, + SND_PCM_FORMAT_S32_BE, 32, AudioDataConverters::int32BE, + SND_PCM_FORMAT_S24_LE, 24, AudioDataConverters::int24LE, + SND_PCM_FORMAT_S24_BE, 24, AudioDataConverters::int24BE, + SND_PCM_FORMAT_S16_LE, 16, AudioDataConverters::int16LE, + SND_PCM_FORMAT_S16_BE, 16, AudioDataConverters::int16BE }; + bitDepth = 0; + + for (int i = 0; i < numElementsInArray (formatsToTry); i += 3) + { + if (snd_pcm_hw_params_set_format (handle, hwParams, (_snd_pcm_format) formatsToTry [i]) >= 0) + { + bitDepth = formatsToTry [i + 1]; + sampleFormat = (AudioDataConverters::DataFormat) formatsToTry [i + 2]; + break; + } + } + + if (bitDepth == 0) + { + error = T("device doesn't support a compatible PCM format"); + DBG (T("ALSA error: ") + error + T("\n")); + return false; + } + + int dir = 0; + unsigned int periods = 4; + snd_pcm_uframes_t samplesPerPeriod = bufferSize; + + if (failed (snd_pcm_hw_params_set_rate_near (handle, hwParams, &sampleRate, 0)) + || failed (snd_pcm_hw_params_set_channels (handle, hwParams, numChannels)) + || failed (snd_pcm_hw_params_set_periods_near (handle, hwParams, &periods, &dir)) + || failed (snd_pcm_hw_params_set_period_size_near (handle, hwParams, &samplesPerPeriod, &dir)) + || failed (snd_pcm_hw_params (handle, hwParams))) + { + return false; + } + + snd_pcm_sw_params_t* swParams; + snd_pcm_sw_params_alloca (&swParams); + + if (failed (snd_pcm_sw_params_current (handle, swParams)) + || failed (snd_pcm_sw_params_set_silence_threshold (handle, swParams, 0)) + || failed (snd_pcm_sw_params_set_silence_size (handle, swParams, INT_MAX)) + || failed (snd_pcm_sw_params_set_start_threshold (handle, swParams, samplesPerPeriod)) + || failed (snd_pcm_sw_params_set_stop_threshold (handle, swParams, INT_MAX)) + || failed (snd_pcm_sw_params (handle, swParams))) + { + return false; + } + + /* +#ifdef JUCE_DEBUG + // enable this to dump the config of the devices that get opened + snd_output_t* out; + snd_output_stdio_attach (&out, stderr, 0); + snd_pcm_hw_params_dump (hwParams, out); + snd_pcm_sw_params_dump (swParams, out); +#endif + */ + + numChannelsRunning = numChannels; + + return true; + } + + //============================================================================== + bool write (float** const data, const int numSamples) + { + if (isInterleaved) + { + scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); + float* interleaved = (float*) scratch; + + AudioDataConverters::interleaveSamples ((const float**) data, interleaved, numSamples, numChannelsRunning); + AudioDataConverters::convertFloatToFormat (sampleFormat, interleaved, interleaved, numSamples * numChannelsRunning); + + snd_pcm_sframes_t num = snd_pcm_writei (handle, (void*) interleaved, numSamples); + + if (failed (num) && num != -EPIPE && num != -ESTRPIPE) + return false; + } + else + { + for (int i = 0; i < numChannelsRunning; ++i) + if (data[i] != 0) + AudioDataConverters::convertFloatToFormat (sampleFormat, data[i], data[i], numSamples); + + snd_pcm_sframes_t num = snd_pcm_writen (handle, (void**) data, numSamples); + + if (failed (num)) + { + if (num == -EPIPE) + { + if (failed (snd_pcm_prepare (handle))) + return false; + } + else if (num != -ESTRPIPE) + return false; + } + } + + return true; + } + + bool read (float** const data, const int numSamples) + { + if (isInterleaved) + { + scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); + float* interleaved = (float*) scratch; + + snd_pcm_sframes_t num = snd_pcm_readi (handle, (void*) interleaved, numSamples); + + if (failed (num)) + { + if (num == -EPIPE) + { + if (failed (snd_pcm_prepare (handle))) + return false; + } + else if (num != -ESTRPIPE) + return false; + } + + AudioDataConverters::convertFormatToFloat (sampleFormat, interleaved, interleaved, numSamples * numChannelsRunning); + AudioDataConverters::deinterleaveSamples (interleaved, data, numSamples, numChannelsRunning); + } + else + { + snd_pcm_sframes_t num = snd_pcm_readn (handle, (void**) data, numSamples); + + if (failed (num) && num != -EPIPE && num != -ESTRPIPE) + return false; + + for (int i = 0; i < numChannelsRunning; ++i) + if (data[i] != 0) + AudioDataConverters::convertFormatToFloat (sampleFormat, data[i], data[i], numSamples); + } + + return true; + } + + //============================================================================== + juce_UseDebuggingNewOperator + + snd_pcm_t* handle; + String error; + int bitDepth, numChannelsRunning; + + //============================================================================== +private: + const bool isInput; + bool isInterleaved; + MemoryBlock scratch; + AudioDataConverters::DataFormat sampleFormat; + + //============================================================================== + bool failed (const int errorNum) + { + if (errorNum >= 0) + return false; + + error = snd_strerror (errorNum); + DBG (T("ALSA error: ") + error + T("\n")); + return true; + } +}; + +//============================================================================== +class ALSAThread : public Thread +{ +public: + ALSAThread (const String& deviceName_) + : Thread (T("Juce ALSA")), + sampleRate (0), + bufferSize (0), + deviceName (deviceName_), + outputDevice (0), + inputDevice (0), + numCallbacks (0), + callback (0), + totalNumInputChannels (0), + totalNumOutputChannels (0) + { + zeromem (outputChannelData, sizeof (outputChannelData)); + zeromem (outputChannelDataForCallback, sizeof (outputChannelDataForCallback)); + zeromem (inputChannelData, sizeof (inputChannelData)); + zeromem (inputChannelDataForCallback, sizeof (inputChannelDataForCallback)); + + initialiseRatesAndChannels(); + } + + ~ALSAThread() + { + close(); + } + + void open (const BitArray& inputChannels, + const BitArray& outputChannels, + const double sampleRate_, + const int bufferSize_) + { + close(); + + error = String::empty; + sampleRate = sampleRate_; + bufferSize = bufferSize_; + + numChannelsRunning = jmax (inputChannels.getHighestBit(), + outputChannels.getHighestBit()) + 1; + + numChannelsRunning = jmin (maxNumChans, jlimit ((int) minChansIn, + (int) maxChansIn, + numChannelsRunning)); + + if (inputChannels.getHighestBit() >= 0) + { + for (int i = 0; i < numChannelsRunning; ++i) + { + inputChannelData [i] = (float*) juce_calloc (sizeof (float) * bufferSize); + + if (inputChannels[i]) + inputChannelDataForCallback [totalNumInputChannels++] = inputChannelData [i]; + } + } + + if (outputChannels.getHighestBit() >= 0) + { + for (int i = 0; i < numChannelsRunning; ++i) + { + outputChannelData [i] = (float*) juce_calloc (sizeof (float) * bufferSize); + + if (outputChannels[i]) + outputChannelDataForCallback [totalNumOutputChannels++] = outputChannelData [i]; + } + } + + if (totalNumOutputChannels > 0) + { + outputDevice = new ALSADevice (deviceName, false); + + if (outputDevice->error.isNotEmpty()) + { + error = outputDevice->error; + deleteAndZero (outputDevice); + return; + } + + if (! outputDevice->setParameters ((unsigned int) sampleRate, numChannelsRunning, bufferSize)) + { + error = outputDevice->error; + deleteAndZero (outputDevice); + return; + } + } + + if (totalNumInputChannels > 0) + { + inputDevice = new ALSADevice (deviceName, true); + + if (inputDevice->error.isNotEmpty()) + { + error = inputDevice->error; + deleteAndZero (inputDevice); + return; + } + + if (! inputDevice->setParameters ((unsigned int) sampleRate, numChannelsRunning, bufferSize)) + { + error = inputDevice->error; + deleteAndZero (inputDevice); + return; + } + } + + if (outputDevice == 0 && inputDevice == 0) + { + error = T("no channels"); + return; + } + + if (outputDevice != 0 && inputDevice != 0) + { + snd_pcm_link (outputDevice->handle, inputDevice->handle); + } + + if (inputDevice != 0 && failed (snd_pcm_prepare (inputDevice->handle))) + return; + + if (outputDevice != 0 && failed (snd_pcm_prepare (outputDevice->handle))) + return; + + startThread (9); + + int count = 1000; + + while (numCallbacks == 0) + { + sleep (5); + + if (--count < 0 || ! isThreadRunning()) + { + error = T("device didn't start"); + break; + } + } + } + + void close() + { + stopThread (6000); + + deleteAndZero (inputDevice); + deleteAndZero (outputDevice); + + for (int i = 0; i < maxNumChans; ++i) + { + juce_free (inputChannelData [i]); + juce_free (outputChannelData [i]); + } + + zeromem (outputChannelData, sizeof (outputChannelData)); + zeromem (outputChannelDataForCallback, sizeof (outputChannelDataForCallback)); + zeromem (inputChannelData, sizeof (inputChannelData)); + zeromem (inputChannelDataForCallback, sizeof (inputChannelDataForCallback)); + totalNumOutputChannels = 0; + totalNumInputChannels = 0; + numChannelsRunning = 0; + + numCallbacks = 0; + } + + void setCallback (AudioIODeviceCallback* const newCallback) + { + const ScopedLock sl (callbackLock); + callback = newCallback; + } + + void run() + { + while (! threadShouldExit()) + { + if (inputDevice != 0) + { + jassert (numChannelsRunning >= inputDevice->numChannelsRunning); + + if (! inputDevice->read (inputChannelData, bufferSize)) + { + DBG (T("ALSA: read failure")); + break; + } + } + + if (threadShouldExit()) + break; + + { + const ScopedLock sl (callbackLock); + ++numCallbacks; + + if (callback != 0) + { + callback->audioDeviceIOCallback ((const float**) inputChannelDataForCallback, + totalNumInputChannels, + outputChannelDataForCallback, + totalNumOutputChannels, + bufferSize); + } + else + { + for (int i = 0; i < totalNumOutputChannels; ++i) + zeromem (outputChannelDataForCallback[i], sizeof (float) * bufferSize); + } + } + + if (outputDevice != 0) + { + failed (snd_pcm_wait (outputDevice->handle, 2000)); + + if (threadShouldExit()) + break; + + failed (snd_pcm_avail_update (outputDevice->handle)); + + jassert (numChannelsRunning >= outputDevice->numChannelsRunning); + if (! outputDevice->write (outputChannelData, bufferSize)) + { + DBG (T("ALSA: write failure")); + break; + } + } + } + } + + int getBitDepth() const + { + if (outputDevice != 0) + return outputDevice->bitDepth; + + if (inputDevice != 0) + return inputDevice->bitDepth; + + return 16; + } + + //============================================================================== + juce_UseDebuggingNewOperator + + String error; + double sampleRate; + int bufferSize; + + Array sampleRates; + StringArray channelNamesOut, channelNamesIn; + +private: + //============================================================================== + const String deviceName; + ALSADevice* outputDevice; + ALSADevice* inputDevice; + int numCallbacks; + + AudioIODeviceCallback* callback; + CriticalSection callbackLock; + + float* outputChannelData [maxNumChans]; + float* outputChannelDataForCallback [maxNumChans]; + int totalNumInputChannels; + float* inputChannelData [maxNumChans]; + float* inputChannelDataForCallback [maxNumChans]; + int totalNumOutputChannels; + int numChannelsRunning; + + unsigned int minChansOut, maxChansOut; + unsigned int minChansIn, maxChansIn; + + bool failed (const int errorNum) + { + if (errorNum >= 0) + return false; + + error = snd_strerror (errorNum); + DBG (T("ALSA error: ") + error + T("\n")); + return true; + } + + void initialiseRatesAndChannels() + { + sampleRates.clear(); + channelNamesOut.clear(); + channelNamesIn.clear(); + minChansOut = 0; + maxChansOut = 0; + minChansIn = 0; + maxChansIn = 0; + + getDeviceProperties (deviceName, minChansOut, maxChansOut, minChansIn, maxChansIn, sampleRates); + + unsigned int i; + for (i = 0; i < maxChansOut; ++i) + channelNamesOut.add (T("channel ") + String ((int) i + 1)); + + for (i = 0; i < maxChansIn; ++i) + channelNamesIn.add (T("channel ") + String ((int) i + 1)); + } +}; + + +//============================================================================== +class ALSAAudioIODevice : public AudioIODevice +{ +public: + ALSAAudioIODevice (const String& deviceName, + const String& deviceId) + : AudioIODevice (deviceName, T("ALSA")), + isOpen_ (false), + isStarted (false), + internal (0) + { + internal = new ALSAThread (deviceId); + } + + ~ALSAAudioIODevice() + { + delete internal; + } + + const StringArray getOutputChannelNames() + { + return internal->channelNamesOut; + } + + const StringArray getInputChannelNames() + { + return internal->channelNamesIn; + } + + int getNumSampleRates() + { + return internal->sampleRates.size(); + } + + double getSampleRate (int index) + { + return internal->sampleRates [index]; + } + + int getNumBufferSizesAvailable() + { + return 50; + } + + int getBufferSizeSamples (int index) + { + int n = 16; + for (int i = 0; i < index; ++i) + n += n < 64 ? 16 + : (n < 512 ? 32 + : (n < 1024 ? 64 + : (n < 2048 ? 128 : 256))); + + return n; + } + + int getDefaultBufferSize() + { + return 512; + } + + const String open (const BitArray& inputChannels, + const BitArray& outputChannels, + double sampleRate, + int bufferSizeSamples) + { + close(); + + if (bufferSizeSamples <= 0) + bufferSizeSamples = getDefaultBufferSize(); + + if (sampleRate <= 0) + { + for (int i = 0; i < getNumSampleRates(); ++i) + { + if (getSampleRate (i) >= 44100) + { + sampleRate = getSampleRate (i); + break; + } + } + } + + internal->open (inputChannels, outputChannels, + sampleRate, bufferSizeSamples); + + isOpen_ = internal->error.isEmpty(); + return internal->error; + } + + void close() + { + stop(); + internal->close(); + isOpen_ = false; + } + + bool isOpen() + { + return isOpen_; + } + + int getCurrentBufferSizeSamples() + { + return internal->bufferSize; + } + + double getCurrentSampleRate() + { + return internal->sampleRate; + } + + int getCurrentBitDepth() + { + return internal->getBitDepth(); + } + + int getOutputLatencyInSamples() + { + return 0; + } + + int getInputLatencyInSamples() + { + return 0; + } + + void start (AudioIODeviceCallback* callback) + { + if (! isOpen_) + callback = 0; + + internal->setCallback (callback); + isStarted = (callback != 0); + } + + void stop() + { + start (0); + } + + bool isPlaying() + { + return isStarted && internal->error.isEmpty(); + } + + const String getLastError() + { + return internal->error; + } + +private: + bool isOpen_, isStarted; + ALSAThread* internal; +}; + + +//============================================================================== +class ALSAAudioIODeviceType : public AudioIODeviceType +{ +public: + //============================================================================== + ALSAAudioIODeviceType() + : AudioIODeviceType (T("ALSA")), + hasScanned (false) + { + } + + ~ALSAAudioIODeviceType() + { + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + names.clear(); + ids.clear(); + + snd_ctl_t* handle; + snd_ctl_card_info_t* info; + snd_ctl_card_info_alloca (&info); + + int cardNum = -1; + + while (ids.size() <= 24) + { + snd_card_next (&cardNum); + + if (cardNum < 0) + break; + + if (snd_ctl_open (&handle, T("hw:") + String (cardNum), 0) >= 0) + { + if (snd_ctl_card_info (handle, info) >= 0) + { + String cardId (snd_ctl_card_info_get_id (info)); + + if (cardId.removeCharacters (T("0123456789")).isEmpty()) + cardId = String (cardNum); + + int device = -1; + + for (;;) + { + if (snd_ctl_pcm_next_device (handle, &device) < 0 || device < 0) + break; + + String id, name; + id << T("hw:") << cardId << T(",") << device; + + if (testDevice (id)) + { + name << snd_ctl_card_info_get_name (info); + + if (name.isEmpty()) + name = id; + + if (device > 0) + name << T(" (") << (device + 1) << T(")"); + + ids.add (id); + names.add (name); + } + } + } + + snd_ctl_close (handle); + } + } + } + + const StringArray getDeviceNames (const bool /*preferInputNames*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + StringArray namesCopy (names); + namesCopy.removeDuplicates (true); + + return namesCopy; + } + + const String getDefaultDeviceName (const bool /*preferInputNames*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return names[0]; + } + + AudioIODevice* createDevice (const String& deviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int index = names.indexOf (deviceName); + + if (index >= 0) + return new ALSAAudioIODevice (deviceName, ids [index]); + + return 0; + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + StringArray names, ids; + bool hasScanned; + + static bool testDevice (const String& id) + { + unsigned int minChansOut = 0, maxChansOut = 0; + unsigned int minChansIn = 0, maxChansIn = 0; + Array rates; + + getDeviceProperties (id, minChansOut, maxChansOut, minChansIn, maxChansIn, rates); + + DBG (T("ALSA device: ") + id + + T(" outs=") + String ((int) minChansOut) + T("-") + String ((int) maxChansOut) + + T(" ins=") + String ((int) minChansIn) + T("-") + String ((int) maxChansIn) + + T(" rates=") + String (rates.size())); + + return (maxChansOut > 0 || maxChansIn > 0) && rates.size() > 0; + } + + ALSAAudioIODeviceType (const ALSAAudioIODeviceType&); + const ALSAAudioIODeviceType& operator= (const ALSAAudioIODeviceType&); +}; + +//============================================================================== +AudioIODeviceType* juce_createDefaultAudioIODeviceType() +{ + return new ALSAAudioIODeviceType(); +} + + +END_JUCE_NAMESPACE + + +//============================================================================== +#else // if ALSA is turned off.. + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.h" +AudioIODeviceType* juce_createDefaultAudioIODeviceType() { return 0; } + +END_JUCE_NAMESPACE + +#endif + +#endif diff --git a/build/linux/platform_specific_code/juce_linux_AudioCDReader.cpp b/build/linux/platform_specific_code/juce_linux_AudioCDReader.cpp new file mode 100644 index 0000000000..155e32c1a5 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_AudioCDReader.cpp @@ -0,0 +1,110 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.h" + + +//============================================================================== +AudioCDReader::AudioCDReader() + : AudioFormatReader (0, T("CD Audio")) +{ +} + +const StringArray AudioCDReader::getAvailableCDNames() +{ + StringArray names; + return names; +} + +AudioCDReader* AudioCDReader::createReaderForCD (const int index) +{ + return 0; +} + +AudioCDReader::~AudioCDReader() +{ +} + +void AudioCDReader::refreshTrackLengths() +{ +} + +bool AudioCDReader::read (int** destSamples, + int64 startSampleInFile, + int numSamples) +{ + return false; +} + +bool AudioCDReader::isCDStillPresent() const +{ + return false; +} + +int AudioCDReader::getNumTracks() const +{ + return 0; +} + +int AudioCDReader::getPositionOfTrackStart (int trackNum) const +{ + return 0; +} + +bool AudioCDReader::isTrackAudio (int trackNum) const +{ + return false; +} + +void AudioCDReader::enableIndexScanning (bool b) +{ +} + +int AudioCDReader::getLastIndex() const +{ + return 0; +} + +const Array AudioCDReader::findIndexesInTrack (const int trackNumber) +{ + return Array(); +} + +int AudioCDReader::getCDDBId() +{ + return 0; +} + +END_JUCE_NAMESPACE diff --git a/build/linux/platform_specific_code/juce_linux_FileChooser.cpp b/build/linux/platform_specific_code/juce_linux_FileChooser.cpp new file mode 100644 index 0000000000..bb74895463 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_FileChooser.cpp @@ -0,0 +1,60 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../juce_Config.h" +#if JUCE_BUILD_GUI_CLASSES + +#include "linuxincludes.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.h" + + +//============================================================================== +void FileChooser::showPlatformDialog (OwnedArray& results, + const String& title, + const File& file, + const String& filters, + bool isDirectory, + bool isSave, + bool warnAboutOverwritingExistingFiles, + bool selectMultipleFiles, + FilePreviewComponent* previewComponent) +{ + //xxx ain't got one! + jassertfalse +} + +END_JUCE_NAMESPACE + +#endif diff --git a/build/linux/platform_specific_code/juce_linux_Files.cpp b/build/linux/platform_specific_code/juce_linux_Files.cpp new file mode 100644 index 0000000000..86fb080165 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Files.cpp @@ -0,0 +1,603 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "linuxincludes.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +#include +#include +#include +#include // for statfs +#include +#include +#include +#include +#include +#include + +#define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_fs.h +#define U_MSDOS_SUPER_MAGIC (short) 0x4d44 // linux/msdos_fs.h +#define U_NFS_SUPER_MAGIC (short) 0x6969 // linux/nfs_fs.h +#define U_SMB_SUPER_MAGIC (short) 0x517B // linux/smb_fs.h + + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/io/files/juce_FileInputStream.h" +#include "../../../src/juce_core/io/files/juce_FileOutputStream.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/io/network/juce_URL.h" +#include "../../../src/juce_core/io/files/juce_NamedPipe.h" + +static File executableFile; + + +//============================================================================== +bool juce_isDirectory (const String& fileName) +{ + if (fileName.isEmpty()) + return true; + + struct stat info; + const int res = stat (fileName.toUTF8(), &info); + if (res == 0) + return (info.st_mode & S_IFDIR) != 0; + + return false; +} + +bool juce_fileExists (const String& fileName, const bool dontCountDirectories) +{ + if (fileName.isEmpty()) + return false; + + bool exists = access (fileName.toUTF8(), F_OK) == 0; + + if (exists && dontCountDirectories && juce_isDirectory (fileName)) + exists = false; + + return exists; +} + +int64 juce_getFileSize (const String& fileName) +{ + struct stat info; + const int res = stat (fileName.toUTF8(), &info); + + if (res == 0) + return info.st_size; + + return 0; +} + +void juce_getFileTimes (const String& fileName, + int64& modificationTime, + int64& accessTime, + int64& creationTime) +{ + modificationTime = 0; + accessTime = 0; + creationTime = 0; + + struct stat info; + const int res = stat (fileName.toUTF8(), &info); + if (res == 0) + { + /* + * Note: On Linux the st_ctime field is defined as last change time + * rather than creation. + */ + modificationTime = (int64) info.st_mtime * 1000; + accessTime = (int64) info.st_atime * 1000; + creationTime = (int64) info.st_ctime * 1000; + } +} + +bool juce_setFileTimes (const String& fileName, + int64 modificationTime, + int64 accessTime, + int64 creationTime) +{ + struct utimbuf times; + times.actime = (time_t) (accessTime / 1000); + times.modtime = (time_t) (modificationTime / 1000); + + return utime (fileName.toUTF8(), ×) == 0; +} + +bool juce_canWriteToFile (const String& fileName) +{ + return access (fileName.toUTF8(), W_OK) == 0; +} + +bool juce_setFileReadOnly (const String& fileName, bool isReadOnly) +{ + struct stat info; + const int res = stat (fileName.toUTF8(), &info); + if (res != 0) + return false; + + info.st_mode &= 0777; // Just permissions + + if( isReadOnly ) + info.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); + else + // Give everybody write permission? + info.st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; + + return chmod (fileName.toUTF8(), info.st_mode) == 0; +} + +bool juce_deleteFile (const String& fileName) +{ + if (juce_isDirectory (fileName)) + return rmdir (fileName.toUTF8()) == 0; + else + return remove (fileName.toUTF8()) == 0; +} + +bool juce_copyFile (const String& s, const String& d) +{ + const File source (s), dest (d); + + FileInputStream* in = source.createInputStream(); + bool ok = false; + + if (in != 0) + { + if (dest.deleteFile()) + { + FileOutputStream* const out = dest.createOutputStream(); + + if (out != 0) + { + const int bytesCopied = out->writeFromInputStream (*in, -1); + delete out; + + ok = (bytesCopied == source.getSize()); + + if (! ok) + dest.deleteFile(); + } + } + + delete in; + } + + return ok; +} + +bool juce_moveFile (const String& source, const String& dest) +{ + if (rename (source.toUTF8(), dest.toUTF8()) == 0) + return true; + + if (! juce_canWriteToFile (source)) + return false; + + if (juce_copyFile (source, dest)) + { + if (juce_deleteFile (source)) + return true; + + juce_deleteFile (dest); + } + + return false; +} + +void juce_createDirectory (const String& fileName) +{ + mkdir (fileName.toUTF8(), 0777); +} + +void* juce_fileOpen (const String& fileName, bool forWriting) +{ + const char* mode = "rb"; + + if (forWriting) + { + if (juce_fileExists (fileName, false)) + { + FILE* f = fopen (fileName.toUTF8(), "r+b"); + if (f != 0) + fseek (f, 0, SEEK_END); + + return (void*) f; + } + else + { + mode = "w+b"; + } + } + + return (void*)fopen (fileName.toUTF8(), mode); +} + +void juce_fileClose (void* handle) +{ + if (handle != 0) + fclose ((FILE*) handle); +} + +int juce_fileRead (void* handle, void* buffer, int size) +{ + if (handle != 0) + return fread (buffer, 1, size, (FILE*) handle); + + return 0; +} + +int juce_fileWrite (void* handle, const void* buffer, int size) +{ + if (handle != 0) + return fwrite (buffer, 1, size, (FILE*) handle); + + return 0; +} + +int64 juce_fileSetPosition (void* handle, int64 pos) +{ + if (handle != 0 && fseek ((FILE*) handle, (long) pos, SEEK_SET) == 0) + return pos; + + return -1; +} + +int64 juce_fileGetPosition (void* handle) +{ + if (handle != 0) + return ftell ((FILE*) handle); + else + return -1; +} + +void juce_fileFlush (void* handle) +{ + if (handle != 0) + fflush ((FILE*) handle); +} + +const StringArray juce_getFileSystemRoots() +{ + StringArray s; + s.add (T("/")); + return s; +} + +const String juce_getVolumeLabel (const String& filenameOnVolume, + int& volumeSerialNumber) +{ + // There is no equivalent on Linux + volumeSerialNumber = 0; + return String::empty; +} + +int64 File::getBytesFreeOnVolume() const throw() +{ + struct statfs buf; + int64 free_space = 0; + + if (statfs (getFullPathName().toUTF8(), &buf) == 0) + { + // Note: this returns space available to non-super user + free_space = (int64) buf.f_bsize * (int64) buf.f_bavail; + } + + return free_space; +} + +bool File::isOnCDRomDrive() const throw() +{ + struct statfs buf; + + if (statfs (getFullPathName().toUTF8(), &buf) == 0) + return (buf.f_type == U_ISOFS_SUPER_MAGIC); + + // Assume not if this fails for some reason + return false; +} + +bool File::isOnHardDisk() const throw() +{ + struct statfs buf; + + if (statfs (getFullPathName().toUTF8(), &buf) == 0) + { + switch (buf.f_type) + { + case U_ISOFS_SUPER_MAGIC: // CD-ROM + case U_MSDOS_SUPER_MAGIC: // Probably floppy (but could be mounted FAT filesystem) + case U_NFS_SUPER_MAGIC: // Network NFS + case U_SMB_SUPER_MAGIC: // Network Samba + return false; + + default: + // Assume anything else is a hard-disk (but note it could + // be a RAM disk. There isn't a good way of determining + // this for sure) + return true; + } + } + + // Assume so if this fails for some reason + return true; +} + + +//============================================================================== +const File File::getSpecialLocation (const SpecialLocationType type) +{ + switch (type) + { + case userHomeDirectory: + { + const char* homeDir = getenv ("HOME"); + + if (homeDir == 0) + { + struct passwd* const pw = getpwuid (getuid()); + if (pw != 0) + homeDir = pw->pw_dir; + } + + return File (String (homeDir)); + } + + case userDocumentsDirectory: + return File (T("~")); + + case userDesktopDirectory: + return File (T("~/Desktop")); + + case userApplicationDataDirectory: + return File (T("~")); + + case commonApplicationDataDirectory: + return File (T("/var")); + + case globalApplicationsDirectory: + return File (T("/usr")); + + case tempDirectory: + { + File tmp (T("/var/tmp")); + + if (! tmp.isDirectory()) + { + tmp = T("/tmp"); + + if (! tmp.isDirectory()) + tmp = File::getCurrentWorkingDirectory(); + } + + return tmp; + } + + case currentExecutableFile: + case currentApplicationFile: + // if this fails, it's probably because juce_setCurrentExecutableFileName() + // was never called to set the filename - this should be done by the juce + // main() function, so maybe you've hacked it to use your own custom main()? + jassert (executableFile.exists()); + + return executableFile; + + default: + jassertfalse // unknown type? + break; + } + + return File::nonexistent; +} + +//============================================================================== +void juce_setCurrentExecutableFileName (const String& filename) +{ + executableFile = File::getCurrentWorkingDirectory().getChildFile (filename); +} + +//============================================================================== +const File File::getCurrentWorkingDirectory() throw() +{ + char buf [2048]; + getcwd (buf, sizeof(buf)); + return File (String::fromUTF8 ((const uint8*) buf)); +} + +bool File::setAsCurrentWorkingDirectory() const throw() +{ + return chdir (getFullPathName().toUTF8()) == 0; +} + +//============================================================================== +const tchar File::separator = T('/'); +const tchar* File::separatorString = T("/"); + +//============================================================================== +struct FindFileStruct +{ + String parentDir, wildCard; + DIR* dir; + + bool getNextMatch (String& result, bool* const isDir, bool* const isHidden, int64* const fileSize, + Time* const modTime, Time* const creationTime, bool* const isReadOnly) + { + const char* const wildcardUTF8 = wildCard.toUTF8(); + + for (;;) + { + struct dirent* const de = readdir (dir); + + if (de == 0) + break; + + if (fnmatch (wildcardUTF8, de->d_name, FNM_CASEFOLD) == 0) + { + result = String::fromUTF8 ((const uint8*) de->d_name); + + const String path (parentDir + result); + + if (isDir != 0 || fileSize != 0) + { + struct stat info; + const bool statOk = (stat (path.toUTF8(), &info) == 0); + + if (isDir != 0) + *isDir = path.isEmpty() || (statOk && ((info.st_mode & S_IFDIR) != 0)); + + if (isHidden != 0) + *isHidden = (de->d_name[0] == '.'); + + if (fileSize != 0) + *fileSize = statOk ? info.st_size : 0; + } + + if (modTime != 0 || creationTime != 0) + { + int64 m, a, c; + juce_getFileTimes (path, m, a, c); + + if (modTime != 0) + *modTime = m; + + if (creationTime != 0) + *creationTime = c; + } + + if (isReadOnly != 0) + *isReadOnly = ! juce_canWriteToFile (path); + + return true; + } + } + + return false; + } +}; + +// returns 0 on failure +void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile, + bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly) +{ + DIR* d = opendir (directory.toUTF8()); + + if (d != 0) + { + FindFileStruct* ff = new FindFileStruct(); + ff->parentDir = directory; + + if (!ff->parentDir.endsWithChar (File::separator)) + ff->parentDir += File::separator; + + ff->wildCard = wildCard; + if (wildCard == T("*.*")) + ff->wildCard = T("*"); + + ff->dir = d; + + if (ff->getNextMatch (firstResultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly)) + { + return ff; + } + else + { + firstResultFile = String::empty; + isDir = false; + isHidden = false; + closedir (d); + delete ff; + } + } + + return 0; +} + +bool juce_findFileNext (void* handle, String& resultFile, + bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly) +{ + FindFileStruct* const ff = (FindFileStruct*) handle; + + if (ff != 0) + return ff->getNextMatch (resultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); + + return false; +} + +void juce_findFileClose (void* handle) +{ + FindFileStruct* const ff = (FindFileStruct*) handle; + + if (ff != 0) + { + closedir (ff->dir); + delete ff; + } +} + +bool juce_launchFile (const String& fileName, + const String& parameters) +{ + String cmdString (fileName); + cmdString << " " << parameters; + + if (URL::isProbablyAWebsiteURL (cmdString) || URL::isProbablyAnEmailAddress (cmdString)) + { + // create a command that tries to launch a bunch of likely browsers + const char* const browserNames[] = { "/etc/alternatives/x-www-browser", "firefox", "mozilla", "konqueror", "opera" }; + + StringArray cmdLines; + + for (int i = 0; i < numElementsInArray (browserNames); ++i) + cmdLines.add (String (browserNames[i]) + T(" ") + cmdString.trim().quoted()); + + cmdString = cmdLines.joinIntoString (T(" || ")); + } + + char* const argv[4] = { "/bin/sh", "-c", (char*) cmdString.toUTF8(), 0 }; + + const int cpid = fork(); + + if (cpid == 0) + { + setsid(); + + // Child process + execve (argv[0], argv, environ); + exit (0); + } + + return cpid >= 0; +} + + +END_JUCE_NAMESPACE diff --git a/build/linux/platform_specific_code/juce_linux_Fonts.cpp b/build/linux/platform_specific_code/juce_linux_Fonts.cpp new file mode 100644 index 0000000000..da4060c4c5 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Fonts.cpp @@ -0,0 +1,627 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../juce_Config.h" +#if JUCE_BUILD_GUI_CLASSES + +#include "linuxincludes.h" +#include +#include FT_FREETYPE_H + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/gui/graphics/fonts/juce_Font.h" +#include "../../../src/juce_core/io/streams/juce_MemoryInputStream.h" +#include "../../../src/juce_core/io/files/juce_DirectoryIterator.h" +#include "../../../src/juce_core/text/juce_XmlDocument.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" + + +//============================================================================== +class FreeTypeFontFace +{ +public: + //============================================================================== + enum FontStyle + { + Plain = 0, + Bold = 1, + Italic = 2 + }; + + struct FontNameIndex + { + String fileName; + int faceIndex; + }; + + //============================================================================== + FreeTypeFontFace (const String& familyName) + : hasSerif (false), + monospaced (false) + { + family = familyName; + } + + void setFileName (const String& name, + const int faceIndex, + FontStyle style) + { + if (names[(int) style].fileName.isEmpty()) + { + names[(int) style].fileName = name; + names[(int) style].faceIndex = faceIndex; + } + } + + const String& getFamilyName() const throw() + { + return family; + } + + const String& getFileName (int style, int* faceIndex) const throw() + { + *faceIndex = names [style].faceIndex; + return names[style].fileName; + } + + void setMonospaced (bool mono) { monospaced = mono; } + bool getMonospaced () const throw() { return monospaced; } + + void setSerif (const bool serif) { hasSerif = serif; } + bool getSerif () const throw() { return hasSerif; } + +private: + //============================================================================== + String family; + FontNameIndex names[4]; + bool hasSerif, monospaced; +}; + +//============================================================================== +class FreeTypeInterface : public DeletedAtShutdown +{ +public: + //============================================================================== + FreeTypeInterface() + : lastFace (0), + lastBold (false), + lastItalic (false) + { + if (FT_Init_FreeType (&ftLib) != 0) + { + ftLib = 0; + DBG (T("Failed to initialize FreeType")); + } + + StringArray fontDirs; + fontDirs.addTokens (String (getenv ("JUCE_FONT_PATH")), T(";,"), 0); + fontDirs.removeEmptyStrings (true); + + if (fontDirs.size() == 0) + { + XmlDocument fontsConfig (File (T("/etc/fonts/fonts.conf"))); + XmlElement* const fontsInfo = fontsConfig.getDocumentElement(); + + if (fontsInfo != 0) + { + forEachXmlChildElementWithTagName (*fontsInfo, e, T("dir")) + { + fontDirs.add (e->getAllSubText().trim()); + } + + delete fontsInfo; + } + } + + if (fontDirs.size() == 0) + fontDirs.add (T("/usr/X11R6/lib/X11/fonts")); + + for (int i = 0; i < fontDirs.size(); ++i) + enumerateFaces (fontDirs[i]); + } + + ~FreeTypeInterface() + { + if (lastFace != 0) + FT_Done_Face (lastFace); + + if (ftLib != 0) + FT_Done_FreeType (ftLib); + } + + //============================================================================== + FreeTypeFontFace* findOrCreate (const String& familyName, + const bool create = false) + { + for (int i = 0; i < faces.size(); i++) + if (faces[i]->getFamilyName() == familyName) + return faces[i]; + + if (! create) + return NULL; + + FreeTypeFontFace* newFace = new FreeTypeFontFace (familyName); + faces.add (newFace); + + return newFace; + } + + // Enumerate all font faces available in a given directory + void enumerateFaces (const String& path) + { + File dirPath (path); + if (path.isEmpty() || ! dirPath.isDirectory()) + return; + + DirectoryIterator di (dirPath, true); + + while (di.next()) + { + File possible (di.getFile()); + + if (possible.hasFileExtension (T("ttf")) + || possible.hasFileExtension (T("pfb")) + || possible.hasFileExtension (T("pcf"))) + { + FT_Face face; + int faceIndex = 0; + int numFaces = 0; + + do + { + if (FT_New_Face (ftLib, + possible.getFullPathName(), + faceIndex, + &face) == 0) + { + if (faceIndex == 0) + numFaces = face->num_faces; + + if ((face->face_flags & FT_FACE_FLAG_SCALABLE) != 0) + { + FreeTypeFontFace* const newFace = findOrCreate (face->family_name, true); + int style = (int) FreeTypeFontFace::Plain; + + if ((face->style_flags & FT_STYLE_FLAG_BOLD) != 0) + style |= (int) FreeTypeFontFace::Bold; + + if ((face->style_flags & FT_STYLE_FLAG_ITALIC) != 0) + style |= (int) FreeTypeFontFace::Italic; + + newFace->setFileName (possible.getFullPathName(), faceIndex, (FreeTypeFontFace::FontStyle) style); + + if ((face->face_flags & FT_FACE_FLAG_FIXED_WIDTH) != 0) + newFace->setMonospaced (true); + else + newFace->setMonospaced (false); + + // Surely there must be a better way to do this? + if (String (face->family_name).containsIgnoreCase (T("Sans")) + || String (face->family_name).containsIgnoreCase (T("Verdana")) + || String (face->family_name).containsIgnoreCase (T("Arial"))) + { + newFace->setSerif (false); + } + else + { + newFace->setSerif (true); + } + } + + FT_Done_Face (face); + } + + ++faceIndex; + } + while (faceIndex < numFaces); + } + } + } + + // Create a FreeType face object for a given font + FT_Face createFT_Face (const String& fontName, + const bool bold, + const bool italic) + { + FT_Face face = NULL; + + if (fontName == lastFontName && bold == lastBold && italic == lastItalic) + { + face = lastFace; + } + else + { + if (lastFace) + { + FT_Done_Face (lastFace); + lastFace = NULL; + } + + lastFontName = fontName; + lastBold = bold; + lastItalic = italic; + + FreeTypeFontFace* const ftFace = findOrCreate (fontName); + + if (ftFace != 0) + { + int style = (int) FreeTypeFontFace::Plain; + + if (bold) + style |= (int) FreeTypeFontFace::Bold; + + if (italic) + style |= (int) FreeTypeFontFace::Italic; + + int faceIndex; + String fileName (ftFace->getFileName (style, &faceIndex)); + + if (fileName.isEmpty()) + { + style ^= (int) FreeTypeFontFace::Bold; + + fileName = ftFace->getFileName (style, &faceIndex); + + if (fileName.isEmpty()) + { + style ^= (int) FreeTypeFontFace::Bold; + style ^= (int) FreeTypeFontFace::Italic; + + fileName = ftFace->getFileName (style, &faceIndex); + + if (! fileName.length()) + { + style ^= (int) FreeTypeFontFace::Bold; + fileName = ftFace->getFileName (style, &faceIndex); + } + } + } + + if (! FT_New_Face (ftLib, (const char*) fileName, faceIndex, &lastFace)) + { + face = lastFace; + + // If there isn't a unicode charmap then select the first one. + if (FT_Select_Charmap (face, ft_encoding_unicode)) + FT_Set_Charmap (face, face->charmaps[0]); + } + } + } + return face; + } + + void addGlyph (FT_Face face, Typeface& dest, uint32 character) + { + const unsigned int glyphIndex = FT_Get_Char_Index (face, character); + const float height = (float) (face->ascender - face->descender); + const float scaleX = 1.0f / height; + const float scaleY = -1.0f / height; + Path destShape; + + #define CONVERTX(val) (scaleX * (val).x) + #define CONVERTY(val) (scaleY * (val).y) + + if (FT_Load_Glyph (face, glyphIndex, FT_LOAD_NO_SCALE + | FT_LOAD_NO_BITMAP + | FT_LOAD_IGNORE_TRANSFORM) != 0 + || face->glyph->format != ft_glyph_format_outline) + { + return; + } + + const FT_Outline* const outline = &face->glyph->outline; + const short* const contours = outline->contours; + const char* const tags = outline->tags; + FT_Vector* const points = outline->points; + + for (int c = 0; c < outline->n_contours; c++) + { + const int startPoint = (c == 0) ? 0 : contours [c - 1] + 1; + const int endPoint = contours[c]; + + for (int p = startPoint; p <= endPoint; p++) + { + const float x = CONVERTX (points[p]); + const float y = CONVERTY (points[p]); + + if (p == startPoint) + { + destShape.startNewSubPath (x, y); + } + else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_On) + { + destShape.lineTo (x, y); + } + else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic) + { + const int nextIndex = (p == endPoint) ? startPoint : p + 1; + float x2 = CONVERTX (points [nextIndex]); + float y2 = CONVERTY (points [nextIndex]); + + if (FT_CURVE_TAG (tags [nextIndex]) == FT_Curve_Tag_Conic) + { + x2 = (x + x2) * 0.5f; + y2 = (y + y2) * 0.5f; + } + else + { + ++p; + } + + destShape.quadraticTo (x, y, x2, y2); + } + else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Cubic) + { + if (p > endPoint-1) + return; + + const int next1 = p + 1; + const int next2 = (p == (endPoint - 1)) ? startPoint : p + 2; + + float x2 = CONVERTX (points [next1]); + float y2 = CONVERTY (points [next1]); + float x3 = CONVERTX (points [next2]); + float y3 = CONVERTY (points [next2]); + + if (FT_CURVE_TAG(tags[next1]) != FT_Curve_Tag_Cubic) + return; + + if (FT_CURVE_TAG(tags[next2]) != FT_Curve_Tag_On) + return; + + destShape.cubicTo (x, y, x2, y2, x3, y3); + p += 2; + } + } + + destShape.closeSubPath(); + } + + dest.addGlyph (character, destShape, face->glyph->metrics.horiAdvance/height); + + if ((face->face_flags & FT_FACE_FLAG_KERNING) != 0) + addKerning (face, dest, character, glyphIndex); + } + + void addKerning (FT_Face face, Typeface& dest, const uint32 character, const uint32 glyphIndex) + { + const float height = (float) (face->ascender - face->descender); + + uint32 rightGlyphIndex; + uint32 rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex); + + while (rightGlyphIndex != 0) + { + FT_Vector kerning; + + if (FT_Get_Kerning (face, glyphIndex, rightGlyphIndex, ft_kerning_unscaled, &kerning) == 0) + { + if (kerning.x != 0) + dest.addKerningPair (character, rightCharCode, kerning.x / height); + } + + rightCharCode = FT_Get_Next_Char (face, rightCharCode, &rightGlyphIndex); + } + } + + // Add a glyph to a font + bool addGlyphToFont (const uint32 character, + const tchar* fontName, bool bold, bool italic, + Typeface& dest) + { + FT_Face face = createFT_Face (fontName, bold, italic); + + if (face != 0) + { + addGlyph (face, dest, character); + return true; + } + + return false; + } + + // Create a Typeface object for given name/style + bool createTypeface (const String& fontName, + const bool bold, const bool italic, + Typeface& dest, + const bool addAllGlyphs) + { + dest.clear(); + dest.setName (fontName); + dest.setBold (bold); + dest.setItalic (italic); + + FT_Face face = createFT_Face (fontName, bold, italic); + + if (face == 0) + { +#ifdef JUCE_DEBUG + String msg (T("Failed to create typeface: ")); + msg << fontName << " " << (bold ? 'B' : ' ') << (italic ? 'I' : ' '); + DBG (msg); +#endif + return face; + } + + const float height = (float) (face->ascender - face->descender); + + dest.setAscent (face->ascender / height); + dest.setDefaultCharacter (L' '); + + if (addAllGlyphs) + { + uint32 glyphIndex; + uint32 charCode = FT_Get_First_Char (face, &glyphIndex); + + while (glyphIndex != 0) + { + addGlyph (face, dest, charCode); + charCode = FT_Get_Next_Char (face, charCode, &glyphIndex); + } + } + + return true; + } + + //============================================================================== + void getFamilyNames (StringArray& familyNames) const + { + for (int i = 0; i < faces.size(); i++) + familyNames.add (faces[i]->getFamilyName()); + } + + void getMonospacedNames (StringArray& monoSpaced) const + { + for (int i = 0; i < faces.size(); i++) + if (faces[i]->getMonospaced()) + monoSpaced.add (faces[i]->getFamilyName()); + } + + void getSerifNames (StringArray& serif) const + { + for (int i = 0; i < faces.size(); i++) + if (faces[i]->getSerif()) + serif.add (faces[i]->getFamilyName()); + } + + void getSansSerifNames (StringArray& sansSerif) const + { + for (int i = 0; i < faces.size(); i++) + if (! faces[i]->getSerif()) + sansSerif.add (faces[i]->getFamilyName()); + } + + static FreeTypeInterface* getInstance() + { + static FreeTypeInterface* instance = 0; + + if (instance == 0) + instance = new FreeTypeInterface(); + + return instance; + } + +private: + //============================================================================== + FT_Library ftLib; + FT_Face lastFace; + String lastFontName; + bool lastBold, lastItalic; + OwnedArray faces; +}; + + +//============================================================================== +void Typeface::initialiseTypefaceCharacteristics (const String& fontName, + bool bold, bool italic, + bool addAllGlyphsToFont) +{ + FreeTypeInterface::getInstance() + ->createTypeface (fontName, bold, italic, *this, addAllGlyphsToFont); +} + +void Typeface::findAndAddSystemGlyph (juce_wchar character) +{ + FreeTypeInterface::getInstance() + ->addGlyphToFont (character, getName(), isBold(), isItalic(), *this); +} + +const StringArray Font::findAllTypefaceNames() +{ + StringArray s; + FreeTypeInterface::getInstance()->getFamilyNames (s); + s.sort (true); + return s; +} + +static const String pickBestFont (const StringArray& names, + const char* const choicesString) +{ + StringArray choices; + choices.addTokens (String (choicesString), T(","), 0); + choices.trim(); + choices.removeEmptyStrings(); + + int i, j; + for (j = 0; j < choices.size(); ++j) + if (names.contains (choices[j], true)) + return choices[j]; + + for (j = 0; j < choices.size(); ++j) + for (i = 0; i < names.size(); i++) + if (names[i].startsWithIgnoreCase (choices[j])) + return names[i]; + + for (j = 0; j < choices.size(); ++j) + for (i = 0; i < names.size(); i++) + if (names[i].containsIgnoreCase (choices[j])) + return names[i]; + + return names[0]; +} + +static const String linux_getDefaultSansSerifFontName() +{ + StringArray allFonts; + FreeTypeInterface::getInstance()->getSansSerifNames (allFonts); + + return pickBestFont (allFonts, "Verdana, Bitstream Vera Sans, Luxi Sans, Sans"); +} + +static const String linux_getDefaultSerifFontName() +{ + StringArray allFonts; + FreeTypeInterface::getInstance()->getSerifNames (allFonts); + + return pickBestFont (allFonts, "Bitstream Vera Serif, Times, Nimbus Roman, Serif"); +} + +static const String linux_getDefaultMonospacedFontName() +{ + StringArray allFonts; + FreeTypeInterface::getInstance()->getMonospacedNames (allFonts); + + return pickBestFont (allFonts, "Bitstream Vera Sans Mono, Courier, Sans Mono, Mono"); +} + +void Font::getDefaultFontNames (String& defaultSans, String& defaultSerif, String& defaultFixed) +{ + defaultSans = linux_getDefaultSansSerifFontName(); + defaultSerif = linux_getDefaultSerifFontName(); + defaultFixed = linux_getDefaultMonospacedFontName(); +} + +END_JUCE_NAMESPACE + +#endif diff --git a/build/linux/platform_specific_code/juce_linux_Messaging.cpp b/build/linux/platform_specific_code/juce_linux_Messaging.cpp new file mode 100644 index 0000000000..2daa81e346 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Messaging.cpp @@ -0,0 +1,399 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../juce_Config.h" +#if JUCE_BUILD_GUI_CLASSES + +#include "linuxincludes.h" +#include +#include +#include +#include +#include +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_core/threads/juce_WaitableEvent.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_core/threads/juce_ScopedLock.h" + +#ifdef JUCE_DEBUG + #define JUCE_DEBUG_XERRORS 1 +#endif + +Display* display = 0; // This is also referenced from WindowDriver.cpp +static Window juce_messageWindowHandle = None; + +#define SpecialAtom "JUCESpecialAtom" +#define BroadcastAtom "JUCEBroadcastAtom" +#define SpecialCallbackAtom "JUCESpecialCallbackAtom" + +static Atom specialId; +static Atom broadcastId; +static Atom specialCallbackId; + +// This is referenced from WindowDriver.cpp +XContext improbableNumber; + +// Defined in WindowDriver.cpp +extern void juce_windowMessageReceive (XEvent* event); + +struct MessageThreadFuncCall +{ + MessageCallbackFunction* func; + void* parameter; + void* result; + CriticalSection lock; + WaitableEvent event; +}; + +static bool errorCondition = false; + +// (defined in another file to avoid problems including certain headers in this one) +extern bool juce_isRunningAsApplication(); + +// Usually happens when client-server connection is broken +static int ioErrorHandler (Display* display) +{ + DBG (T("ERROR: connection to X server broken.. terminating.")); + + errorCondition = true; + + if (! juce_isRunningAsApplication()) + Process::terminate(); + + return 0; +} + +// A protocol error has occurred +static int errorHandler (Display* display, XErrorEvent* event) +{ +#ifdef JUCE_DEBUG_XERRORS + char errorStr[64] = { 0 }; + char requestStr[64] = { 0 }; + + XGetErrorText (display, event->error_code, errorStr, 64); + + XGetErrorDatabaseText (display, + "XRequest", + (const char*) String (event->request_code), + "Unknown", + requestStr, + 64); + + DBG (T("ERROR: X returned ") + String (errorStr) + T(" for operation ") + String (requestStr)); +#endif + + return 0; +} + +static bool breakIn = false; + +// Breakin from keyboard +static void sig_handler (int sig) +{ + if (sig == SIGINT) + { + breakIn = true; + return; + } + + static bool reentrant = false; + + if (reentrant == false) + { + reentrant = true; + + // Illegal instruction + fflush (stdout); + Logger::outputDebugString ("ERROR: Program executed illegal instruction.. terminating"); + + errorCondition = true; + + if (juce_isRunningAsApplication()) + Process::terminate(); + } + else + { + if (juce_isRunningAsApplication()) + exit(0); + } +} + + +//============================================================================== +void MessageManager::doPlatformSpecificInitialisation() +{ + // This is called if the client/server connection is broken + XSetIOErrorHandler (ioErrorHandler); + + // This is called if a protocol error occurs + XSetErrorHandler (errorHandler); + + // Install signal handler for break-in + struct sigaction saction; + sigset_t maskSet; + sigemptyset (&maskSet); + saction.sa_handler = sig_handler; + saction.sa_mask = maskSet; + saction.sa_flags = 0; + sigaction (SIGINT, &saction, NULL); + +#ifndef _DEBUG + // Setup signal handlers for various fatal errors + sigaction (SIGILL, &saction, NULL); + sigaction (SIGBUS, &saction, NULL); + sigaction (SIGFPE, &saction, NULL); + sigaction (SIGSEGV, &saction, NULL); + sigaction (SIGSYS, &saction, NULL); +#endif + + // Initialise xlib for multiple thread support + if (! XInitThreads()) + { + // This is fatal! Print error and closedown + Logger::outputDebugString (T("Failed to initialise xlib thread support.")); + + if (juce_isRunningAsApplication()) + Process::terminate(); + } + + String displayName (getenv ("DISPLAY")); + if (displayName.isEmpty()) + displayName = T(":0.0"); + + display = XOpenDisplay (displayName); + + if (display == 0) + { + // This is fatal! Print error and closedown + Logger::outputDebugString ("Failed to open the X display."); + + if (juce_isRunningAsApplication()) + Process::terminate(); + } + + // Get defaults for various properties + int screen = DefaultScreen (display); + Window root = RootWindow (display, screen); + Visual* visual = DefaultVisual (display, screen); + + // Create atoms for our ClientMessages (these cannot be deleted) + specialId = XInternAtom (display, SpecialAtom, false); + broadcastId = XInternAtom (display, BroadcastAtom, false); + specialCallbackId = XInternAtom (display, SpecialCallbackAtom, false); + + // Create a context to store user data associated with Windows we + // create in WindowDriver + improbableNumber = XUniqueContext(); + + // We're only interested in client messages for this window + // which are always sent + XSetWindowAttributes swa; + swa.event_mask = NoEventMask; + + // Create our message window (this will never be mapped) + juce_messageWindowHandle = XCreateWindow (display, root, + 0, 0, 1, 1, 0, 0, InputOnly, + visual, CWEventMask, &swa); +} + +void MessageManager::doPlatformSpecificShutdown() +{ + if (errorCondition == false) + { + XDestroyWindow (display, juce_messageWindowHandle); + XCloseDisplay (display); + } +} + +bool juce_postMessageToSystemQueue (void* message) +{ + if (errorCondition) + return false; + + XClientMessageEvent clientMsg; + clientMsg.display = display; + clientMsg.window = juce_messageWindowHandle; + clientMsg.type = ClientMessage; + clientMsg.format = 32; + clientMsg.message_type = specialId; +#if JUCE_64BIT + clientMsg.data.l[0] = (long) (0x00000000ffffffff & (((uint64) message) >> 32)); + clientMsg.data.l[1] = (long) (0x00000000ffffffff & (long) message); +#else + clientMsg.data.l[0] = (long) message; +#endif + + XSendEvent (display, juce_messageWindowHandle, false, + NoEventMask, (XEvent*) &clientMsg); + + XFlush (display); // This is necessary to ensure the event is delivered + + return true; +} + +void MessageManager::broadcastMessage (const String& value) +{ +} + +void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* func, + void* parameter) +{ + void* retVal = 0; + + if (! errorCondition) + { + if (! isThisTheMessageThread()) + { + static MessageThreadFuncCall messageFuncCallContext; + + const ScopedLock sl (messageFuncCallContext.lock); + + XClientMessageEvent clientMsg; + clientMsg.display = display; + clientMsg.window = juce_messageWindowHandle; + clientMsg.type = ClientMessage; + clientMsg.format = 32; + clientMsg.message_type = specialCallbackId; +#if JUCE_64BIT + clientMsg.data.l[0] = (long) (0x00000000ffffffff & (((uint64) &messageFuncCallContext) >> 32)); + clientMsg.data.l[1] = (long) (0x00000000ffffffff & (uint64) &messageFuncCallContext); +#else + clientMsg.data.l[0] = (long) &messageFuncCallContext; +#endif + + messageFuncCallContext.func = func; + messageFuncCallContext.parameter = parameter; + + if (XSendEvent (display, juce_messageWindowHandle, false, NoEventMask, (XEvent*) &clientMsg) == 0) + return 0; + + XFlush (display); // This is necessary to ensure the event is delivered + + // Wait for it to complete before continuing + messageFuncCallContext.event.wait(); + + retVal = messageFuncCallContext.result; + } + else + { + // Just call the function directly + retVal = func (parameter); + } + } + + return retVal; +} + +bool juce_dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) +{ + if (errorCondition) + return false; + + if (breakIn) + { + errorCondition = true; + + if (juce_isRunningAsApplication()) + Process::terminate(); + } + + if (returnIfNoPendingMessages && ! XPending (display)) + return false; + + XEvent evt; + XNextEvent (display, &evt); + + if (evt.type == ClientMessage && evt.xany.window == juce_messageWindowHandle) + { + XClientMessageEvent* const clientMsg = (XClientMessageEvent*) &evt; + + if (clientMsg->format != 32) + { + jassertfalse + DBG ("Error: juce_dispatchNextMessageOnSystemQueue received malformed client message."); + } + else + { + JUCE_TRY + { +#if JUCE_64BIT + void* const messagePtr + = (void*) ((0xffffffff00000000 & (((uint64) clientMsg->data.l[0]) << 32)) + | (clientMsg->data.l[1] & 0x00000000ffffffff)); +#else + void* const messagePtr = (void*) (clientMsg->data.l[0]); +#endif + + if (clientMsg->message_type == specialId) + { + MessageManager::getInstance()->deliverMessage (messagePtr); + } + else if (clientMsg->message_type == specialCallbackId) + { + MessageThreadFuncCall* const call = (MessageThreadFuncCall*) messagePtr; + MessageCallbackFunction* func = call->func; + call->result = (*func) (call->parameter); + call->event.signal(); + } + else if (clientMsg->message_type == broadcastId) + { +#if 0 + TCHAR buffer[8192]; + zeromem (buffer, sizeof (buffer)); + + if (GlobalGetAtomName ((ATOM) lParam, buffer, 8192) != 0) + mq->deliverBroadcastMessage (String (buffer)); +#endif + } + else + { + DBG ("Error: juce_dispatchNextMessageOnSystemQueue received unknown client message."); + } + } + JUCE_CATCH_ALL + } + } + else if (evt.xany.window != juce_messageWindowHandle) + { + juce_windowMessageReceive (&evt); + } + + return true; +} + +END_JUCE_NAMESPACE + +#endif diff --git a/build/linux/platform_specific_code/juce_linux_Midi.cpp b/build/linux/platform_specific_code/juce_linux_Midi.cpp new file mode 100644 index 0000000000..682d1cf021 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Midi.cpp @@ -0,0 +1,453 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../juce_Config.h" +#if JUCE_BUILD_GUI_CLASSES + +#if JUCE_ALSA + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_MidiOutput.h" +#include "../../../src/juce_appframework/audio/devices/juce_MidiInput.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/basics/juce_Time.h" + + +//============================================================================== +static snd_seq_t* iterateDevices (const bool forInput, + StringArray& deviceNamesFound, + const int deviceIndexToOpen) +{ + snd_seq_t* returnedHandle = 0; + snd_seq_t* seqHandle; + + if (snd_seq_open (&seqHandle, "default", forInput ? SND_SEQ_OPEN_INPUT + : SND_SEQ_OPEN_OUTPUT, 0) == 0) + { + snd_seq_system_info_t* systemInfo; + snd_seq_client_info_t* clientInfo; + + if (snd_seq_system_info_malloc (&systemInfo) == 0) + { + if (snd_seq_system_info (seqHandle, systemInfo) == 0 + && snd_seq_client_info_malloc (&clientInfo) == 0) + { + int numClients = snd_seq_system_info_get_cur_clients (systemInfo); + + while (--numClients >= 0 && returnedHandle == 0) + { + if (snd_seq_query_next_client (seqHandle, clientInfo) == 0) + { + snd_seq_port_info_t* portInfo; + if (snd_seq_port_info_malloc (&portInfo) == 0) + { + int numPorts = snd_seq_client_info_get_num_ports (clientInfo); + const int client = snd_seq_client_info_get_client (clientInfo); + + snd_seq_port_info_set_client (portInfo, client); + snd_seq_port_info_set_port (portInfo, -1); + + while (--numPorts >= 0) + { + if (snd_seq_query_next_port (seqHandle, portInfo) == 0 + && (snd_seq_port_info_get_capability (portInfo) + & (forInput ? SND_SEQ_PORT_CAP_READ + : SND_SEQ_PORT_CAP_WRITE)) != 0) + { + deviceNamesFound.add (snd_seq_client_info_get_name (clientInfo)); + + if (deviceNamesFound.size() == deviceIndexToOpen + 1) + { + const int sourcePort = snd_seq_port_info_get_port (portInfo); + const int sourceClient = snd_seq_client_info_get_client (clientInfo); + + if (sourcePort != -1) + { + snd_seq_set_client_name (seqHandle, + forInput ? "Juce Midi Input" + : "Juce Midi Output"); + + const int portId + = snd_seq_create_simple_port (seqHandle, + forInput ? "Juce Midi In Port" + : "Juce Midi Out Port", + forInput ? (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE) + : (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ), + SND_SEQ_PORT_TYPE_MIDI_GENERIC); + + snd_seq_connect_from (seqHandle, portId, sourceClient, sourcePort); + + returnedHandle = seqHandle; + break; + } + } + } + } + + snd_seq_port_info_free (portInfo); + } + } + } + + snd_seq_client_info_free (clientInfo); + } + + snd_seq_system_info_free (systemInfo); + } + + if (returnedHandle == 0) + snd_seq_close (seqHandle); + } + + return returnedHandle; +} + +static snd_seq_t* createDevice (const bool forInput, + const String& deviceNameToOpen) +{ + snd_seq_t* seqHandle = 0; + + if (snd_seq_open (&seqHandle, "default", forInput ? SND_SEQ_OPEN_INPUT + : SND_SEQ_OPEN_OUTPUT, 0) == 0) + { + snd_seq_set_client_name (seqHandle, + (const char*) (forInput ? (deviceNameToOpen + T(" Input")) + : (deviceNameToOpen + T(" Output")))); + + const int portId + = snd_seq_create_simple_port (seqHandle, + forInput ? "in" + : "out", + forInput ? (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE) + : (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ), + forInput ? SND_SEQ_PORT_TYPE_APPLICATION + : SND_SEQ_PORT_TYPE_MIDI_GENERIC); + + if (portId < 0) + { + snd_seq_close (seqHandle); + seqHandle = 0; + } + } + + return seqHandle; +} + +//============================================================================== +class MidiOutputDevice +{ +public: + MidiOutputDevice (MidiOutput* const midiOutput_, + snd_seq_t* const seqHandle_) + : + midiOutput (midiOutput_), + seqHandle (seqHandle_), + maxEventSize (16 * 1024) + { + jassert (seqHandle != 0 && midiOutput != 0); + snd_midi_event_new (maxEventSize, &midiParser); + } + + ~MidiOutputDevice() + { + snd_midi_event_free (midiParser); + snd_seq_close (seqHandle); + } + + void sendMessageNow (const MidiMessage& message) + { + if (message.getRawDataSize() > maxEventSize) + { + maxEventSize = message.getRawDataSize(); + snd_midi_event_free (midiParser); + snd_midi_event_new (maxEventSize, &midiParser); + } + + snd_seq_event_t event; + snd_seq_ev_clear (&event); + + snd_midi_event_encode (midiParser, + message.getRawData(), + message.getRawDataSize(), + &event); + + snd_midi_event_reset_encode (midiParser); + + snd_seq_ev_set_source (&event, 0); + snd_seq_ev_set_subs (&event); + snd_seq_ev_set_direct (&event); + + snd_seq_event_output_direct (seqHandle, &event); + } + + juce_UseDebuggingNewOperator + +private: + MidiOutput* const midiOutput; + snd_seq_t* const seqHandle; + snd_midi_event_t* midiParser; + int maxEventSize; +}; + +const StringArray MidiOutput::getDevices() +{ + StringArray devices; + iterateDevices (false, devices, -1); + return devices; +} + +int MidiOutput::getDefaultDeviceIndex() +{ + return 0; +} + +MidiOutput* MidiOutput::openDevice (int deviceIndex) +{ + MidiOutput* newDevice = 0; + + StringArray devices; + snd_seq_t* const handle = iterateDevices (false, devices, deviceIndex); + + if (handle != 0) + { + newDevice = new MidiOutput(); + newDevice->internal = new MidiOutputDevice (newDevice, handle); + } + + return newDevice; +} + +MidiOutput* MidiOutput::createNewDevice (const String& deviceName) +{ + MidiOutput* newDevice = 0; + + snd_seq_t* const handle = createDevice (false, deviceName); + + if (handle != 0) + { + newDevice = new MidiOutput(); + newDevice->internal = new MidiOutputDevice (newDevice, handle); + } + + return newDevice; +} + +MidiOutput::MidiOutput() + : internal (0) +{ +} + +MidiOutput::~MidiOutput() +{ + MidiOutputDevice* const device = (MidiOutputDevice*) internal; + delete device; +} + +void MidiOutput::reset() +{ +} + +bool MidiOutput::getVolume (float& leftVol, float& rightVol) +{ + return false; +} + +void MidiOutput::setVolume (float leftVol, float rightVol) +{ +} + +void MidiOutput::sendMessageNow (const MidiMessage& message) +{ + ((MidiOutputDevice*) internal)->sendMessageNow (message); +} + + +//============================================================================== +class MidiInputThread : public Thread +{ +public: + MidiInputThread (MidiInput* const midiInput_, + snd_seq_t* const seqHandle_, + MidiInputCallback* const callback_) + : Thread (T("Juce MIDI Input")), + midiInput (midiInput_), + seqHandle (seqHandle_), + callback (callback_) + { + jassert (seqHandle != 0 && callback != 0 && midiInput != 0); + } + + ~MidiInputThread() + { + snd_seq_close (seqHandle); + } + + void run() + { + const int maxEventSize = 16 * 1024; + snd_midi_event_t* midiParser; + + if (snd_midi_event_new (maxEventSize, &midiParser) >= 0) + { + uint8* const buffer = (uint8*) juce_malloc (maxEventSize); + + const int numPfds = snd_seq_poll_descriptors_count (seqHandle, POLLIN); + struct pollfd* const pfd = (struct pollfd*) alloca (numPfds * sizeof (struct pollfd)); + + snd_seq_poll_descriptors (seqHandle, pfd, numPfds, POLLIN); + + while (! threadShouldExit()) + { + if (poll (pfd, numPfds, 100000) > 0) + { + snd_seq_event_t* inputEvent = 0; + + snd_seq_nonblock (seqHandle, 1); + + do + { + if (snd_seq_event_input (seqHandle, &inputEvent) >= 0) + { + // xxx what about SYSEXes that are too big for the buffer? + const int numBytes = snd_midi_event_decode (midiParser, buffer, maxEventSize, inputEvent); + + snd_midi_event_reset_decode (midiParser); + + if (numBytes > 0) + { + const MidiMessage message ((const uint8*) buffer, + numBytes, + Time::getMillisecondCounter() * 0.001); + + + callback->handleIncomingMidiMessage (midiInput, message); + } + + snd_seq_free_event (inputEvent); + } + } + while (snd_seq_event_input_pending (seqHandle, 0) > 0); + + snd_seq_free_event (inputEvent); + } + } + + snd_midi_event_free (midiParser); + juce_free (buffer); + } + }; + + juce_UseDebuggingNewOperator + +private: + MidiInput* const midiInput; + snd_seq_t* const seqHandle; + MidiInputCallback* const callback; +}; + +//============================================================================== +MidiInput::MidiInput (const String& name_) + : name (name_), + internal (0) +{ +} + +MidiInput::~MidiInput() +{ + stop(); + MidiInputThread* const thread = (MidiInputThread*) internal; + delete thread; +} + +void MidiInput::start() +{ + ((MidiInputThread*) internal)->startThread(); +} + +void MidiInput::stop() +{ + ((MidiInputThread*) internal)->stopThread (2000); +} + +int MidiInput::getDefaultDeviceIndex() +{ + return 0; +} + +const StringArray MidiInput::getDevices() +{ + StringArray devices; + iterateDevices (true, devices, -1); + return devices; +} + +MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback) +{ + MidiInput* newDevice = 0; + + StringArray devices; + snd_seq_t* const handle = iterateDevices (true, devices, deviceIndex); + + if (handle != 0) + { + newDevice = new MidiInput (devices [deviceIndex]); + newDevice->internal = new MidiInputThread (newDevice, handle, callback); + } + + return newDevice; +} + +MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback) +{ + MidiInput* newDevice = 0; + + snd_seq_t* const handle = createDevice (true, deviceName); + + if (handle != 0) + { + newDevice = new MidiInput (deviceName); + newDevice->internal = new MidiInputThread (newDevice, handle, callback); + } + + return newDevice; +} + + + +END_JUCE_NAMESPACE + +#endif + +#endif diff --git a/build/linux/platform_specific_code/juce_linux_NamedPipe.cpp b/build/linux/platform_specific_code/juce_linux_NamedPipe.cpp new file mode 100644 index 0000000000..022e218655 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_NamedPipe.cpp @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../macosx/platform_specific_code/juce_mac_NamedPipe.cpp" + diff --git a/build/linux/platform_specific_code/juce_linux_Network.cpp b/build/linux/platform_specific_code/juce_linux_Network.cpp new file mode 100644 index 0000000000..1f71d8a4fe --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Network.cpp @@ -0,0 +1,59 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "linuxincludes.h" +#include +#include +#include +#include +#include +#include + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/text/juce_StringArray.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/containers/juce_MemoryBlock.h" + +// we'll borrow the mac's socket-based http streaming code.. +#include "../../macosx/platform_specific_code/juce_mac_HTTPStream.h" + + +//============================================================================== +int SystemStats::getMACAddresses (int64* addresses, int maxNum) +{ + // xxx todo + return 0; +} + +END_JUCE_NAMESPACE diff --git a/build/linux/platform_specific_code/juce_linux_SystemStats.cpp b/build/linux/platform_specific_code/juce_linux_SystemStats.cpp new file mode 100644 index 0000000000..0c6f28b0cb --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_SystemStats.cpp @@ -0,0 +1,402 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "linuxincludes.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include +#include + + +#ifndef CPU_ISSET + #undef SUPPORT_AFFINITIES +#endif + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/io/files/juce_File.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" + +static struct _LogicalCpuInfo +{ + bool htSupported; + bool htAvailable; + int numPackages; + int numLogicalPerPackage; + uint32 physicalAffinityMask; +} logicalCpuInfo; + +//============================================================================== +static juce_noinline unsigned int getCPUIDWord (int* familyModel, int* extFeatures) +{ + unsigned int cpu = 0; + unsigned int ext = 0; + unsigned int family = 0; + unsigned int dummy = 0; + + __asm__ ("push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" + : "=a" (family), "=D" (ext), "=c" (dummy),"=d" (cpu) + : "a" (1)); + + if (familyModel != 0) + *familyModel = family; + + if (extFeatures != 0) + *extFeatures = ext; + + return cpu; +} + +void juce_initLogicalCpuInfo() +{ + int familyModelWord, extFeaturesWord; + int featuresWord = getCPUIDWord (&familyModelWord, &extFeaturesWord); + + logicalCpuInfo.htSupported = false; + logicalCpuInfo.htAvailable = false; + logicalCpuInfo.numLogicalPerPackage = 1; + logicalCpuInfo.numPackages = 0; + logicalCpuInfo.physicalAffinityMask = 0; + +#if SUPPORT_AFFINITIES + cpu_set_t processAffinity; + + /* + N.B. If this line causes a compile error, then you've probably not got the latest + version of glibc installed. + + If you don't want to update your copy of glibc and don't care about cpu affinities, + then you can just disable all this stuff by removing the SUPPORT_AFFINITIES macro + from the linuxincludes.h file. + */ + if (sched_getaffinity (getpid(), + sizeof (cpu_set_t), + &processAffinity) != sizeof (cpu_set_t)) + { + return; + } + + // Checks: CPUID supported, model >= Pentium 4, Hyperthreading bit set, logical CPUs per package > 1 + if (featuresWord == 0 + || ((familyModelWord >> 8) & 0xf) < 15 + || (featuresWord & (1 << 28)) == 0 + || ((extFeaturesWord >> 16) & 0xff) < 2) + { + for (int i = 0; i < 64; ++i) + if (CPU_ISSET (i, &processAffinity)) + logicalCpuInfo.physicalAffinityMask |= (1 << i); + + return; + } + + logicalCpuInfo.htSupported = true; + logicalCpuInfo.numLogicalPerPackage = (extFeaturesWord >> 16) & 0xff; + + cpu_set_t affinityMask; + cpu_set_t physAff; + CPU_ZERO (&physAff); + + unsigned char i = 1; + unsigned char physIdMask = 0xFF; + unsigned char physIdShift = 0; + + //unsigned char apicId, logId, physId; + + while (i < logicalCpuInfo.numLogicalPerPackage) + { + i *= 2; + physIdMask <<= 1; + physIdShift++; + } + + CPU_SET (0, &affinityMask); + logicalCpuInfo.numPackages = 0; + +//xxx revisit this at some point.. +/* while ((affinityMask != 0) && (affinityMask <= processAffinity)) + { + int ret; + if (! sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinityMask)) + { + sched_yield(); // schedule onto correct CPU + + featuresWord = getCPUIDWord(&familyModelWord, &extFeaturesWord); + apicId = (unsigned char)(extFeaturesWord >> 24); + logId = (unsigned char)(apicId & ~physIdMask); + physId = (unsigned char)(apicId >> physIdShift); + + if (logId != 0) + logicalCpuInfo.htAvailable = true; + + if ((((int)logId) % logicalCpuInfo.numLogicalPerPackage) == 0) + { + // This is a physical CPU + physAff |= affinityMask; + logicalCpuInfo.numPackages++; + } + } + + affinityMask = affinityMask << 1; + } + + sched_setaffinity (getpid(), sizeof(unsigned long), &processAffinity); +*/ + + logicalCpuInfo.physicalAffinityMask = 0; + + for (int i = 0; i < 64; ++i) + if (CPU_ISSET (i, &physAff)) + logicalCpuInfo.physicalAffinityMask |= (1 << i); + +#endif +} + +//============================================================================== +void Logger::outputDebugString (const String& text) +{ + fprintf (stdout, text.toUTF8()); + fprintf (stdout, "\n"); +} + +void Logger::outputDebugPrintf (const tchar* format, ...) +{ + String text; + va_list args; + va_start (args, format); + text.vprintf(format, args); + outputDebugString(text); +} + +SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() +{ + return Linux; +} + +const String SystemStats::getOperatingSystemName() +{ + return T("Linux"); +} + +static const String getCpuInfo (const char* key, bool lastOne = false) +{ + String info; + char buf [256]; + + FILE* f = fopen ("/proc/cpuinfo", "r"); + + while (f != 0 && fgets (buf, sizeof(buf), f)) + { + if (strncmp (buf, key, strlen (key)) == 0) + { + char* p = buf; + + while (*p && *p != '\n') + ++p; + + if (*p != 0) + *p = 0; + + p = buf; + + while (*p != 0 && *p != ':') + ++p; + + if (*p != 0 && *(p + 1) != 0) + info = p + 2; + + if (! lastOne) + break; + } + } + + fclose (f); + return info; +} + +bool SystemStats::hasMMX() +{ + return getCpuInfo ("flags").contains (T("mmx")); +} + +bool SystemStats::hasSSE() +{ + return getCpuInfo ("flags").contains (T("sse")); +} + +bool SystemStats::hasSSE2() +{ + return getCpuInfo ("flags").contains (T("sse2")); +} + +bool SystemStats::has3DNow() +{ + return getCpuInfo ("flags").contains (T("3dnow")); +} + +const String SystemStats::getCpuVendor() +{ + return getCpuInfo ("vendor_id"); +} + +int SystemStats::getCpuSpeedInMegaherz() +{ + const String speed (getCpuInfo ("cpu MHz")); + + return (int) (speed.getFloatValue() + 0.5f); +} + +bool SystemStats::hasHyperThreading() +{ + return logicalCpuInfo.htAvailable; +} + +int SystemStats::getMemorySizeInMegabytes() +{ + struct sysinfo sysi; + + if (sysinfo (&sysi) == 0) + return (sysi.totalram * sysi.mem_unit / (1024 * 1024)); + + return 0; +} + +uint32 juce_millisecondsSinceStartup() throw() +{ + static unsigned int calibrate = 0; + static bool calibrated = false; + timeval t; + unsigned int ret = 0; + + if (! gettimeofday (&t, 0)) + { + if (! calibrated) + { + struct sysinfo sysi; + + if (sysinfo (&sysi) == 0) + // Safe to assume system was not brought up earlier than 1970! + calibrate = t.tv_sec - sysi.uptime; + + calibrated = true; + } + + ret = 1000 * (t.tv_sec - calibrate) + (t.tv_usec / 1000); + } + + return ret; +} + +double Time::getMillisecondCounterHiRes() throw() +{ + return getHighResolutionTicks() * (1.0 / 1000000.0); +} + +int64 Time::getHighResolutionTicks() throw() +{ + timeval t; + if (gettimeofday (&t,NULL)) + return 0; + + return ((int64) t.tv_sec * (int64) 1000000) + (int64) t.tv_usec; +} + +int64 Time::getHighResolutionTicksPerSecond() throw() +{ + // Microseconds + return 1000000; +} + +bool Time::setSystemTimeToThisTime() const +{ + timeval t; + t.tv_sec = millisSinceEpoch % 1000000; + t.tv_usec = millisSinceEpoch - t.tv_sec; + + return settimeofday (&t, NULL) ? false : true; +} + +int SystemStats::getPageSize() +{ + static int systemPageSize = 0; + + if (systemPageSize == 0) + systemPageSize = sysconf (_SC_PAGESIZE); + + return systemPageSize; +} + +int SystemStats::getNumPhysicalCpus() +{ + if (logicalCpuInfo.numPackages) + return logicalCpuInfo.numPackages; + + return getNumLogicalCpus(); +} + +int SystemStats::getNumLogicalCpus() +{ + const int lastCpu = getCpuInfo ("processor", true).getIntValue(); + + return lastCpu + 1; +} + +uint32 SystemStats::getPhysicalAffinityMask() +{ +#if SUPPORT_AFFINITIES + return logicalCpuInfo.physicalAffinityMask; +#else + /* affinities aren't supported because either the appropriate header files weren't found, + or the SUPPORT_AFFINITIES macro was turned off in linuxheaders.h + */ + jassertfalse + return 0; +#endif + +} + +//============================================================================== +void SystemStats::initialiseStats() +{ + // Process starts off as root when running suid + Process::lowerPrivilege(); + + String s (SystemStats::getJUCEVersion()); + + juce_initLogicalCpuInfo(); +} + +void PlatformUtilities::fpuReset() +{ +} + +END_JUCE_NAMESPACE diff --git a/build/linux/platform_specific_code/juce_linux_Threads.cpp b/build/linux/platform_specific_code/juce_linux_Threads.cpp new file mode 100644 index 0000000000..22bf2b46a9 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Threads.cpp @@ -0,0 +1,457 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "linuxincludes.h" +#include +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/threads/juce_CriticalSection.h" +#include "../../../src/juce_core/threads/juce_WaitableEvent.h" +#include "../../../src/juce_core/threads/juce_InterProcessLock.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_core/io/files/juce_File.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" + +#ifndef CPU_ISSET + #undef SUPPORT_AFFINITIES +#endif + +//============================================================================== +void JUCE_API juce_threadEntryPoint (void*); + +void* threadEntryProc (void* value) +{ + // New threads start off as root when running suid + Process::lowerPrivilege(); + + juce_threadEntryPoint (value); + return 0; +} + +void* juce_createThread (void* userData) +{ + pthread_t handle = 0; + + if (pthread_create (&handle, 0, threadEntryProc, userData) == 0) + { + pthread_detach (handle); + return (void*)handle; + } + + return 0; +} + +void juce_killThread (void* handle) +{ + if (handle != 0) + pthread_cancel ((pthread_t)handle); +} + +void juce_setCurrentThreadName (const String& /*name*/) +{ +} + +int Thread::getCurrentThreadId() +{ + return (int) pthread_self(); +} + +/* + * This is all a bit non-ideal... the trouble is that on Linux you + * need to call setpriority to affect the dynamic priority for + * non-realtime processes, but this requires the pid, which is not + * accessible from the pthread_t. We could get it by calling getpid + * once each thread has started, but then we would need a list of + * running threads etc etc. + * Also there is no such thing as IDLE priority on Linux. + * For the moment, map idle, low and normal process priorities to + * SCHED_OTHER, with the thread priority ignored for these classes. + * Map high priority processes to the lower half of the SCHED_RR + * range, and realtime to the upper half + */ + +// priority 1 to 10 where 5=normal, 1=low. If the handle is 0, sets the +// priority of the current thread +void juce_setThreadPriority (void* handle, int priority) +{ + struct sched_param param; + int policy, maxp, minp, pri; + + if (handle == 0) + handle = (void*) pthread_self(); + + if (pthread_getschedparam ((pthread_t) handle, &policy, ¶m) == 0 + && policy != SCHED_OTHER) + { + minp = sched_get_priority_min(policy); + maxp = sched_get_priority_max(policy); + + pri = ((maxp - minp) / 2) * (priority - 1) / 9; + + if (param.__sched_priority >= (minp + (maxp - minp) / 2)) + // Realtime process priority + param.__sched_priority = minp + ((maxp - minp) / 2) + pri; + else + // High process priority + param.__sched_priority = minp + pri; + + param.sched_priority = jlimit (1, 127, 1 + (priority * 126) / 11); + + pthread_setschedparam ((pthread_t) handle, policy, ¶m); + } +} + +void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) +{ +#if SUPPORT_AFFINITIES + cpu_set_t affinity; + CPU_ZERO (&affinity); + + for (int i = 0; i < 32; ++i) + if ((affinityMask & (1 << i)) != 0) + CPU_SET (i, &affinity); + + /* + N.B. If this line causes a compile error, then you've probably not got the latest + version of glibc installed. + + If you don't want to update your copy of glibc and don't care about cpu affinities, + then you can just disable all this stuff by removing the SUPPORT_AFFINITIES macro + from the linuxincludes.h file. + */ + sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinity); + sched_yield(); + +#else + /* affinities aren't supported because either the appropriate header files weren't found, + or the SUPPORT_AFFINITIES macro was turned off in linuxheaders.h + */ + jassertfalse +#endif +} + +void Thread::yield() +{ + sched_yield(); +} + +void Thread::sleep (int millisecs) +{ + struct timespec time; + time.tv_sec = millisecs / 1000; + time.tv_nsec = (millisecs % 1000) * 1000000; + nanosleep (&time, 0); +} + +//============================================================================== +CriticalSection::CriticalSection() throw() +{ + pthread_mutexattr_t atts; + pthread_mutexattr_init (&atts); + pthread_mutexattr_settype (&atts, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init (&internal, &atts); +} + +CriticalSection::~CriticalSection() throw() +{ + pthread_mutex_destroy (&internal); +} + +void CriticalSection::enter() const throw() +{ + pthread_mutex_lock (&internal); +} + +bool CriticalSection::tryEnter() const throw() +{ + return pthread_mutex_trylock (&internal) == 0; +} + +void CriticalSection::exit() const throw() +{ + pthread_mutex_unlock (&internal); +} + +//============================================================================== +struct EventStruct +{ + pthread_cond_t condition; + pthread_mutex_t mutex; + bool triggered; +}; + +WaitableEvent::WaitableEvent() throw() +{ + EventStruct* const es = new EventStruct(); + es->triggered = false; + + pthread_cond_init (&es->condition, 0); + pthread_mutex_init (&es->mutex, 0); + + internal = es; +} + +WaitableEvent::~WaitableEvent() throw() +{ + EventStruct* const es = (EventStruct*)internal; + + pthread_cond_destroy (&es->condition); + pthread_mutex_destroy (&es->mutex); + + delete es; +} + +bool WaitableEvent::wait (const int timeOutMillisecs) const throw() +{ + EventStruct* const es = (EventStruct*)internal; + + bool ok = true; + pthread_mutex_lock (&es->mutex); + + if (!es->triggered) + { + if (timeOutMillisecs < 0) + { + pthread_cond_wait (&es->condition, &es->mutex); + } + else + { + struct timespec time; + struct timeval t; + int timeout = 0; + + gettimeofday(&t,NULL); + + time.tv_sec = t.tv_sec + (timeOutMillisecs / 1000); + time.tv_nsec = (t.tv_usec + ((timeOutMillisecs % 1000)*1000)) * 1000; + while( time.tv_nsec >= 1000000000 ) + { + time.tv_nsec -= 1000000000; + time.tv_sec++; + } + + while( !timeout ) + { + timeout = pthread_cond_timedwait (&es->condition, &es->mutex, &time); + if( !timeout ) + // Success + break; + + if( timeout == EINTR ) + // Go round again + timeout = 0; + } + } + ok = es->triggered; + } + + es->triggered = false; + + pthread_mutex_unlock (&es->mutex); + return ok; +} + +void WaitableEvent::signal() const throw() +{ + EventStruct* const es = (EventStruct*)internal; + + pthread_mutex_lock (&es->mutex); + es->triggered = true; + pthread_cond_signal (&es->condition); + pthread_mutex_unlock (&es->mutex); +} + +void WaitableEvent::reset() const throw() +{ + EventStruct* const es = (EventStruct*)internal; + + pthread_mutex_lock (&es->mutex); + es->triggered = false; + pthread_mutex_unlock (&es->mutex); +} + +//============================================================================== +// sets the process to 0=low priority, 1=normal, 2=high, 3=realtime +void Process::setPriority (ProcessPriority prior) +{ + struct sched_param param; + int policy, maxp, minp; + + const int p = (int) prior; + + if (p <= 1) + policy = SCHED_OTHER; + else + policy = SCHED_RR; + + minp = sched_get_priority_min (policy); + maxp = sched_get_priority_max (policy); + + if (p < 2) + param.__sched_priority = 0; + else if (p == 2 ) + // Set to middle of lower realtime priority range + param.__sched_priority = minp + (maxp - minp) / 4; + else + // Set to middle of higher realtime priority range + param.__sched_priority = minp + (3 * (maxp - minp) / 4); + + pthread_setschedparam (pthread_self(), policy, ¶m); +} + +void Process::terminate() +{ + exit (0); +} + +void Process::raisePrivilege() +{ + // If running suid root, change effective user + // to root + if (geteuid() != 0 && getuid() == 0) + { + setreuid (geteuid(), getuid()); + setregid (getegid(), getgid()); + } +} + +void Process::lowerPrivilege() +{ + // If runing suid root, change effective user + // back to real user + if (geteuid() == 0 && getuid() != 0) + { + setreuid (geteuid(), getuid()); + setregid (getegid(), getgid()); + } +} + +#if JUCE_BUILD_GUI_CLASSES +void* Process::loadDynamicLibrary (const String& name) +{ + return dlopen ((const char*) name.toUTF8(), RTLD_LOCAL | RTLD_NOW); +} + +void Process::freeDynamicLibrary (void* handle) +{ + dlclose(handle); +} + +void* Process::getProcedureEntryPoint (void* libraryHandle, const String& procedureName) +{ + return dlsym (libraryHandle, (const char*) procedureName); +} +#endif + + +//============================================================================== +InterProcessLock::InterProcessLock (const String& name_) + : internal (0), + name (name_), + reentrancyLevel (0) +{ + const File tempDir (File::getSpecialLocation (File::tempDirectory)); + const File temp (tempDir.getChildFile (name)); + temp.create(); + + internal = (void*) open (temp.getFullPathName().toUTF8(), 'a'); +} + +InterProcessLock::~InterProcessLock() +{ + while (reentrancyLevel > 0) + this->exit(); + +#if JUCE_64BIT + close ((long long) internal); +#else + close ((int) internal); +#endif +} + +bool InterProcessLock::enter (int timeOutMillisecs) +{ + if (internal == 0) + return false; + + if (reentrancyLevel != 0) + return true; + + if (timeOutMillisecs <= 0) + { + if (flock ((long) internal, + timeOutMillisecs < 0 ? LOCK_EX + : (LOCK_EX | LOCK_NB)) == 0) + { + ++reentrancyLevel; + return true; + } + } + else + { + const int64 endTime = Time::currentTimeMillis() + timeOutMillisecs; + + for (;;) + { + if (flock ((long) internal, LOCK_EX | LOCK_NB) == 0) + { + ++reentrancyLevel; + return true; + } + + if (Time::currentTimeMillis() >= endTime) + break; + + Thread::sleep (10); + } + } + + return false; +} + +void InterProcessLock::exit() +{ + if (reentrancyLevel > 0 && internal != 0) + { + --reentrancyLevel; + + const int result = flock ((long) internal, LOCK_UN); + (void) result; + jassert (result == 0); + } +} + + +END_JUCE_NAMESPACE diff --git a/build/linux/platform_specific_code/juce_linux_Windowing.cpp b/build/linux/platform_specific_code/juce_linux_Windowing.cpp new file mode 100644 index 0000000000..7c779b9504 --- /dev/null +++ b/build/linux/platform_specific_code/juce_linux_Windowing.cpp @@ -0,0 +1,3076 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../juce_Config.h" + +#if JUCE_BUILD_GUI_CLASSES + +#include "linuxincludes.h" +#include +#include +#include +#include +#include +#include + +#if JUCE_USE_XINERAMA + #include +#endif + +#if JUCE_USE_XSHM + #include + #include + #include +#endif + +#if JUCE_OPENGL + #include + #include +#endif + + +#undef KeyPress + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" +#include "../../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.h" +#include "../../../src/juce_appframework/application/juce_SystemClipboard.h" +#include "../../../src/juce_appframework/gui/components/windows/juce_AlertWindow.h" +#include "../../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.h" +#include "../../../src/juce_appframework/gui/components/juce_Desktop.h" +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_appframework/gui/components/juce_ComponentDeletionWatcher.h" +#include "../../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.h" +#include "../../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.h" +#include "../../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" +#include "../../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.h" +#include "../../../src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_core/io/network/juce_URL.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" + + +//============================================================================== +#define TAKE_FOCUS 0 +#define DELETE_WINDOW 1 + +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +static const int repaintTimerPeriod = 1000 / 100; // 100 fps maximum + +//============================================================================== +static Atom wm_ChangeState = None; +static Atom wm_State = None; +static Atom wm_Protocols = None; +static Atom wm_ProtocolList [2] = { None, None }; +static Atom wm_ActiveWin = None; + +#define ourDndVersion 3 +static Atom XA_XdndAware = None; +static Atom XA_XdndEnter = None; +static Atom XA_XdndLeave = None; +static Atom XA_XdndPosition = None; +static Atom XA_XdndStatus = None; +static Atom XA_XdndDrop = None; +static Atom XA_XdndFinished = None; +static Atom XA_XdndSelection = None; +static Atom XA_XdndProxy = None; + +static Atom XA_XdndTypeList = None; +static Atom XA_XdndActionList = None; +static Atom XA_XdndActionDescription = None; +static Atom XA_XdndActionCopy = None; +static Atom XA_XdndActionMove = None; +static Atom XA_XdndActionLink = None; +static Atom XA_XdndActionAsk = None; +static Atom XA_XdndActionPrivate = None; +static Atom XA_JXSelectionWindowProperty = None; + +static Atom XA_MimeTextPlain = None; +static Atom XA_MimeTextUriList = None; +static Atom XA_MimeRootDrop = None; + +//============================================================================== +static XErrorHandler oldHandler = 0; +static int trappedErrorCode = 0; + +extern "C" int errorTrapHandler (Display* dpy, XErrorEvent* err) +{ + trappedErrorCode = err->error_code; + return 0; +} + +static void trapErrors() +{ + trappedErrorCode = 0; + oldHandler = XSetErrorHandler (errorTrapHandler); +} + +static bool untrapErrors() +{ + XSetErrorHandler (oldHandler); + return (trappedErrorCode == 0); +} + + +//============================================================================== +static bool isActiveApplication = false; + +bool Process::isForegroundProcess() +{ + return isActiveApplication; +} + +// (used in the messaging code, declared here for build reasons) +bool juce_isRunningAsApplication() +{ + return JUCEApplication::getInstance() != 0; +} + +//============================================================================== +// These are defined in juce_linux_Messaging.cpp +extern Display* display; +extern XContext improbableNumber; + +const int juce_windowIsSemiTransparentFlag = (1 << 31); // also in component.cpp + +static const int eventMask = NoEventMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask + | EnterWindowMask | LeaveWindowMask | PointerMotionMask | KeymapStateMask + | ExposureMask | StructureNotifyMask | FocusChangeMask; + +//============================================================================== +static int pointerMap[5]; +static int lastMousePosX = 0, lastMousePosY = 0; + +enum MouseButtons +{ + NoButton = 0, + LeftButton = 1, + MiddleButton = 2, + RightButton = 3, + WheelUp = 4, + WheelDown = 5 +}; + +static void getMousePos (int& x, int& y, int& mouseMods) +{ + Window root, child; + int winx, winy; + unsigned int mask; + + mouseMods = 0; + + if (XQueryPointer (display, + RootWindow (display, DefaultScreen (display)), + &root, &child, + &x, &y, &winx, &winy, &mask) == False) + { + // Pointer not on the default screen + x = y = -1; + } + else + { + if ((mask & Button1Mask) != 0) + mouseMods |= ModifierKeys::leftButtonModifier; + + if ((mask & Button2Mask) != 0) + mouseMods |= ModifierKeys::middleButtonModifier; + + if ((mask & Button3Mask) != 0) + mouseMods |= ModifierKeys::rightButtonModifier; + } +} + +//============================================================================== +static int AltMask = 0; +static int NumLockMask = 0; +static bool numLock = 0; +static bool capsLock = 0; +static char keyStates [32]; + +static void updateKeyStates (const int keycode, const bool press) +{ + const int keybyte = keycode >> 3; + const int keybit = (1 << (keycode & 7)); + + if (press) + keyStates [keybyte] |= keybit; + else + keyStates [keybyte] &= ~keybit; +} + +static bool keyDown (const int keycode) +{ + const int keybyte = keycode >> 3; + const int keybit = (1 << (keycode & 7)); + + return (keyStates [keybyte] & keybit) != 0; +} + +static const int extendedKeyModifier = 0x10000000; + +bool KeyPress::isKeyCurrentlyDown (int keyCode) +{ + int keysym; + + if (keyCode & extendedKeyModifier) + { + keysym = 0xff00 | (keyCode & 0xff); + } + else + { + keysym = keyCode; + + if (keysym == (XK_Tab & 0xff) + || keysym == (XK_Return & 0xff) + || keysym == (XK_Escape & 0xff) + || keysym == (XK_BackSpace & 0xff)) + { + keysym |= 0xff00; + } + } + + return keyDown (XKeysymToKeycode (display, keysym)); +} + +//============================================================================== +// Alt and Num lock are not defined by standard X +// modifier constants: check what they're mapped to +static void getModifierMapping() +{ + const int altLeftCode = XKeysymToKeycode (display, XK_Alt_L); + const int numLockCode = XKeysymToKeycode (display, XK_Num_Lock); + + AltMask = 0; + NumLockMask = 0; + + XModifierKeymap* mapping = XGetModifierMapping (display); + + if (mapping) + { + for (int i = 0; i < 8; i++) + { + if (mapping->modifiermap [i << 1] == altLeftCode) + AltMask = 1 << i; + else if (mapping->modifiermap [i << 1] == numLockCode) + NumLockMask = 1 << i; + } + + XFreeModifiermap (mapping); + } +} + +static int currentModifiers = 0; + +void ModifierKeys::updateCurrentModifiers() +{ + currentModifierFlags = currentModifiers; +} + +const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() +{ + int x, y, mouseMods; + getMousePos (x, y, mouseMods); + + currentModifiers &= ~ModifierKeys::allMouseButtonModifiers; + currentModifiers |= mouseMods; + + return ModifierKeys (currentModifiers); +} + +static void updateKeyModifiers (const int status) +{ + currentModifiers &= ~(ModifierKeys::shiftModifier + | ModifierKeys::ctrlModifier + | ModifierKeys::altModifier); + + if (status & ShiftMask) + currentModifiers |= ModifierKeys::shiftModifier; + + if (status & ControlMask) + currentModifiers |= ModifierKeys::ctrlModifier; + + if (status & AltMask) + currentModifiers |= ModifierKeys::altModifier; + + numLock = ((status & NumLockMask) != 0); + capsLock = ((status & LockMask) != 0); +} + +static bool updateKeyModifiersFromSym (KeySym sym, const bool press) +{ + int modifier = 0; + bool isModifier = true; + + switch (sym) + { + case XK_Shift_L: + case XK_Shift_R: + modifier = ModifierKeys::shiftModifier; + break; + + case XK_Control_L: + case XK_Control_R: + modifier = ModifierKeys::ctrlModifier; + break; + + case XK_Alt_L: + case XK_Alt_R: + modifier = ModifierKeys::altModifier; + break; + + case XK_Num_Lock: + if (press) + numLock = ! numLock; + + break; + + case XK_Caps_Lock: + if (press) + capsLock = ! capsLock; + + break; + + case XK_Scroll_Lock: + break; + + default: + isModifier = false; + break; + } + + if (modifier != 0) + { + if (press) + currentModifiers |= modifier; + else + currentModifiers &= ~modifier; + } + + return isModifier; +} + +//============================================================================== +#if JUCE_USE_XSHM +static bool isShmAvailable() +{ + static bool isChecked = false; + static bool isAvailable = false; + + if (! isChecked) + { + isChecked = true; + + int major, minor; + Bool pixmaps; + + if (XShmQueryVersion (display, &major, &minor, &pixmaps)) + { + trapErrors(); + + XShmSegmentInfo segmentInfo; + zerostruct (segmentInfo); + XImage* xImage = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)), + 24, ZPixmap, 0, &segmentInfo, 50, 50); + + if ((segmentInfo.shmid = shmget (IPC_PRIVATE, + xImage->bytes_per_line * xImage->height, + IPC_CREAT | 0777)) >= 0) + { + segmentInfo.shmaddr = (char*) shmat (segmentInfo.shmid, 0, 0); + + if (segmentInfo.shmaddr != (void*) -1) + { + segmentInfo.readOnly = False; + xImage->data = segmentInfo.shmaddr; + XSync (display, False); + + if (XShmAttach (display, &segmentInfo) != 0) + { + XSync (display, False); + XShmDetach (display, &segmentInfo); + + isAvailable = true; + } + } + + XFlush (display); + XDestroyImage (xImage); + + shmdt (segmentInfo.shmaddr); + } + + shmctl (segmentInfo.shmid, IPC_RMID, 0); + + untrapErrors(); + } + } + + return isAvailable; +} +#endif + +//============================================================================== +class XBitmapImage : public Image +{ +public: + //============================================================================== + XBitmapImage (const PixelFormat format_, const int w, const int h, + const bool clearImage, const bool is16Bit_) + : Image (format_, w, h), + is16Bit (is16Bit_) + { + jassert (format_ == RGB || format_ == ARGB); + + pixelStride = (format_ == RGB) ? 3 : 4; + lineStride = ((w * pixelStride + 3) & ~3); + + Visual* const visual = DefaultVisual (display, DefaultScreen (display)); + +#if JUCE_USE_XSHM + usingXShm = false; + + if ((! is16Bit) && isShmAvailable()) + { + zerostruct (segmentInfo); + + xImage = XShmCreateImage (display, visual, 24, ZPixmap, 0, &segmentInfo, w, h); + + if (xImage != 0) + { + if ((segmentInfo.shmid = shmget (IPC_PRIVATE, + xImage->bytes_per_line * xImage->height, + IPC_CREAT | 0777)) >= 0) + { + segmentInfo.shmaddr = (char*) shmat (segmentInfo.shmid, 0, 0); + + if (segmentInfo.shmaddr != (void*) -1) + { + segmentInfo.readOnly = False; + + xImage->data = segmentInfo.shmaddr; + imageData = (uint8*) segmentInfo.shmaddr; + + XSync (display, False); + + if (XShmAttach (display, &segmentInfo) != 0) + { + XSync (display, False); + usingXShm = true; + } + else + { + jassertfalse + } + } + else + { + shmctl (segmentInfo.shmid, IPC_RMID, 0); + } + } + } + } + + if (! usingXShm) +#endif + { + imageData = (uint8*) juce_malloc (lineStride * h); + + if (format_ == ARGB && clearImage) + zeromem (imageData, h * lineStride); + + xImage = new XImage(); + + xImage->width = w; + xImage->height = h; + xImage->xoffset = 0; + xImage->format = ZPixmap; + xImage->data = (char*) imageData; + xImage->byte_order = ImageByteOrder (display); + xImage->bitmap_unit = BitmapUnit (display); + xImage->bitmap_bit_order = BitmapBitOrder (display); + xImage->bitmap_pad = 32; + xImage->depth = pixelStride * 8; + xImage->bytes_per_line = lineStride; + xImage->bits_per_pixel = pixelStride * 8; + xImage->red_mask = 0x00FF0000; + xImage->green_mask = 0x0000FF00; + xImage->blue_mask = 0x000000FF; + + if (is16Bit) + { + const int pixelStride = 2; + const int lineStride = ((w * pixelStride + 3) & ~3); + + xImage->data = (char*) juce_malloc (lineStride * h); + xImage->bitmap_pad = 16; + xImage->depth = pixelStride * 8; + xImage->bytes_per_line = lineStride; + xImage->bits_per_pixel = pixelStride * 8; + xImage->red_mask = visual->red_mask; + xImage->green_mask = visual->green_mask; + xImage->blue_mask = visual->blue_mask; + } + + if (! XInitImage (xImage)) + { + jassertfalse + } + } + } + + ~XBitmapImage() + { +#if JUCE_USE_XSHM + if (usingXShm) + { + XShmDetach (display, &segmentInfo); + + XFlush (display); + XDestroyImage (xImage); + + shmdt (segmentInfo.shmaddr); + shmctl (segmentInfo.shmid, IPC_RMID, 0); + } + else +#endif + { + juce_free (xImage->data); + xImage->data = 0; + XDestroyImage (xImage); + } + + if (! is16Bit) + imageData = 0; // to stop the base class freeing this (for the 16-bit version we want it to free it) + } + + void blitToWindow (Window window, int dx, int dy, int dw, int dh, int sx, int sy) + { + static GC gc = 0; + + if (gc == 0) + gc = DefaultGC (display, DefaultScreen (display)); + + if (is16Bit) + { + const uint32 rMask = xImage->red_mask; + const uint32 rShiftL = jmax (0, getShiftNeeded (rMask)); + const uint32 rShiftR = jmax (0, -getShiftNeeded (rMask)); + const uint32 gMask = xImage->green_mask; + const uint32 gShiftL = jmax (0, getShiftNeeded (gMask)); + const uint32 gShiftR = jmax (0, -getShiftNeeded (gMask)); + const uint32 bMask = xImage->blue_mask; + const uint32 bShiftL = jmax (0, getShiftNeeded (bMask)); + const uint32 bShiftR = jmax (0, -getShiftNeeded (bMask)); + + int ls, ps; + const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); + + jassert (! isARGB()) + + for (int y = sy; y < sy + dh; ++y) + { + const uint8* p = pixels + y * ls + sx * ps; + + for (int x = sx; x < sx + dw; ++x) + { + const PixelRGB* const pixel = (const PixelRGB*) p; + p += ps; + + XPutPixel (xImage, x, y, + (((((uint32) pixel->getRed()) << rShiftL) >> rShiftR) & rMask) + | (((((uint32) pixel->getGreen()) << gShiftL) >> gShiftR) & gMask) + | (((((uint32) pixel->getBlue()) << bShiftL) >> bShiftR) & bMask)); + } + } + + releasePixelDataReadOnly (pixels); + } + + // blit results to screen. +#if JUCE_USE_XSHM + if (usingXShm) + XShmPutImage (display, (Drawable) window, gc, xImage, sx, sy, dx, dy, dw, dh, False); + else +#endif + XPutImage (display, (Drawable) window, gc, xImage, sx, sy, dx, dy, dw, dh); + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + XImage* xImage; + const bool is16Bit; + +#if JUCE_USE_XSHM + XShmSegmentInfo segmentInfo; + bool usingXShm; +#endif + + static int getShiftNeeded (const uint32 mask) throw() + { + for (int i = 32; --i >= 0;) + if (((mask >> i) & 1) != 0) + return i - 7; + + jassertfalse + return 0; + } +}; + +#define checkMessageManagerIsLocked jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); + +//============================================================================== +class LinuxComponentPeer : public ComponentPeer +{ +public: + //============================================================================== + LinuxComponentPeer (Component* const component, const int windowStyleFlags) + : ComponentPeer (component, windowStyleFlags), + windowH (0), + parentWindow (0), + wx (0), + wy (0), + ww (0), + wh (0), + taskbarImage (0), + fullScreen (false), + entered (false), + mapped (false) + { + // it's dangerous to create a window on a thread other than the message thread.. + checkMessageManagerIsLocked + + repainter = new LinuxRepaintManager (this); + + createWindow(); + + setTitle (component->getName()); + } + + ~LinuxComponentPeer() + { + // it's dangerous to delete a window on a thread other than the message thread.. + checkMessageManagerIsLocked + + deleteTaskBarIcon(); + + destroyWindow(); + + windowH = 0; + delete repainter; + } + + //============================================================================== + void* getNativeHandle() const + { + return (void*) windowH; + } + + static LinuxComponentPeer* getPeerFor (Window windowHandle) + { + LinuxComponentPeer* peer = 0; + + if (! XFindContext (display, (XID) windowHandle, improbableNumber, (XPointer*) &peer)) + { + if (peer != 0 && ! peer->isValidMessageListener()) + peer = 0; + } + + return peer; + } + + void setVisible (bool shouldBeVisible) + { + if (shouldBeVisible) + XMapWindow (display, windowH); + else + XUnmapWindow (display, windowH); + } + + void setTitle (const String& title) + { + setWindowTitle (windowH, title); + } + + void setPosition (int x, int y) + { + setBounds (x, y, ww, wh, false); + } + + void setSize (int w, int h) + { + setBounds (wx, wy, w, h, false); + } + + void setBounds (int x, int y, int w, int h, const bool isNowFullScreen) + { + fullScreen = isNowFullScreen; + + if (windowH != 0) + { + const ComponentDeletionWatcher deletionChecker (component); + + wx = x; + wy = y; + ww = jmax (1, w); + wh = jmax (1, h); + + if (! mapped) + { + // Make sure the Window manager does what we want + XSizeHints* hints = XAllocSizeHints(); + hints->flags = USSize | USPosition; + hints->width = ww + windowBorder.getLeftAndRight(); + hints->height = wh + windowBorder.getTopAndBottom(); + hints->x = wx - windowBorder.getLeft(); + hints->y = wy - windowBorder.getTop(); + XSetWMNormalHints (display, windowH, hints); + XFree (hints); + } + + XMoveResizeWindow (display, windowH, + wx - windowBorder.getLeft(), + wy - windowBorder.getTop(), + ww + windowBorder.getLeftAndRight(), + wh + windowBorder.getTopAndBottom()); + + if (! deletionChecker.hasBeenDeleted()) + { + updateBorderSize(); + handleMovedOrResized(); + } + } + } + + void getBounds (int& x, int& y, int& w, int& h) const + { + x = wx; + y = wy; + w = ww; + h = wh; + } + + int getScreenX() const + { + return wx; + } + + int getScreenY() const + { + return wy; + } + + void relativePositionToGlobal (int& x, int& y) + { + x += wx; + y += wy; + } + + void globalPositionToRelative (int& x, int& y) + { + x -= wx; + y -= wy; + } + + void setMinimised (bool shouldBeMinimised) + { + if (shouldBeMinimised) + { + Window root = RootWindow (display, DefaultScreen (display)); + + XClientMessageEvent clientMsg; + clientMsg.display = display; + clientMsg.window = windowH; + clientMsg.type = ClientMessage; + clientMsg.format = 32; + clientMsg.message_type = wm_ChangeState; + clientMsg.data.l[0] = IconicState; + + XSendEvent (display, root, false, + SubstructureRedirectMask | SubstructureNotifyMask, + (XEvent*) &clientMsg); + } + else + { + setVisible (true); + } + } + + bool isMinimised() const + { + bool minimised = false; + + CARD32* stateProp; + unsigned long nitems, bytesLeft; + Atom actualType; + int actualFormat; + + if (XGetWindowProperty (display, windowH, wm_State, 0, 64, False, + wm_State, &actualType, &actualFormat, &nitems, &bytesLeft, + (unsigned char**) &stateProp) == Success + && actualType == wm_State + && actualFormat == 32 + && nitems > 0) + { + if (stateProp[0] == IconicState) + minimised = true; + + XFree (stateProp); + } + + return minimised; + } + + void setFullScreen (bool shouldBeFullScreen) + { + setMinimised (false); + + if (fullScreen != shouldBeFullScreen) + { + Rectangle r (lastNonFullscreenBounds); + + if (shouldBeFullScreen) + r = Desktop::getInstance().getMainMonitorArea(); + + if (! r.isEmpty()) + setBounds (r.getX(), r.getY(), r.getWidth(), r.getHeight(), shouldBeFullScreen); + + getComponent()->repaint(); + } + } + + bool isFullScreen() const + { + return fullScreen; + } + + bool isChildWindowOf (Window possibleParent) const + { + Window* windowList = 0; + uint32 windowListSize = 0; + Window parent, root; + + if (XQueryTree (display, windowH, &root, &parent, &windowList, &windowListSize) != 0) + { + if (windowList != 0) + XFree (windowList); + + return parent == possibleParent; + } + + return false; + } + + bool isFrontWindow() const + { + Window* windowList = 0; + uint32 windowListSize = 0; + bool result = false; + + Window parent, root = RootWindow (display, DefaultScreen (display)); + + if (XQueryTree (display, root, &root, &parent, &windowList, &windowListSize) != 0) + { + for (int i = windowListSize; --i >= 0;) + { + LinuxComponentPeer* const peer = LinuxComponentPeer::getPeerFor (windowList[i]); + + if (peer != 0) + { + result = (peer == this); + break; + } + } + } + + if (windowList != 0) + XFree (windowList); + + return result; + } + + bool contains (int x, int y, bool trueIfInAChildWindow) const + { + jassert (x >= 0 && y >= 0 && x < ww && y < wh); // should only be called for points that are actually inside the bounds + + if (x < 0 || y < 0 || x >= ww || y >= wh) + return false; + + bool inFront = false; + + for (int i = 0; i < Desktop::getInstance().getNumComponents(); ++i) + { + Component* const c = Desktop::getInstance().getComponent (i); + + if (inFront) + { + if (c->contains (x + wx - c->getScreenX(), + y + wy - c->getScreenY())) + { + return false; + } + } + else if (c == getComponent()) + { + inFront = true; + } + } + + if (trueIfInAChildWindow) + return true; + + ::Window root, child; + unsigned int bw, depth; + int wx, wy, w, h; + + if (! XGetGeometry (display, (Drawable) windowH, &root, + &wx, &wy, (unsigned int*) &w, (unsigned int*) &h, + &bw, &depth)) + { + return false; + } + + if (! XTranslateCoordinates (display, windowH, windowH, x, y, &wx, &wy, &child)) + return false; + + return child == None; + } + + const BorderSize getFrameSize() const + { + return BorderSize(); + } + + bool setAlwaysOnTop (bool alwaysOnTop) + { + if (windowH != 0) + { + XSetWindowAttributes swa; + swa.override_redirect = getComponent()->isAlwaysOnTop() ? True : False; + + XChangeWindowAttributes (display, windowH, CWOverrideRedirect, &swa); + } + + return true; + } + + void toFront (bool makeActive) + { + if (makeActive) + { + setVisible (true); + grabFocus(); + } + + XEvent ev; + ev.xclient.type = ClientMessage; + ev.xclient.serial = 0; + ev.xclient.send_event = True; + ev.xclient.message_type = wm_ActiveWin; + ev.xclient.window = windowH; + ev.xclient.format = 32; + ev.xclient.data.l[0] = 2; + ev.xclient.data.l[1] = CurrentTime; + ev.xclient.data.l[2] = 0; + ev.xclient.data.l[3] = 0; + ev.xclient.data.l[4] = 0; + + XSendEvent (display, RootWindow (display, DefaultScreen (display)), + False, + SubstructureRedirectMask | SubstructureNotifyMask, + &ev); + + XSync (display, False); + + handleBroughtToFront(); + } + + void toBehind (ComponentPeer* other) + { + LinuxComponentPeer* const otherPeer = dynamic_cast (other); + jassert (otherPeer != 0); // wrong type of window? + + if (otherPeer != 0) + { + setMinimised (false); + + Window newStack[] = { otherPeer->windowH, windowH }; + + XRestackWindows (display, newStack, 2); + } + } + + bool isFocused() const + { + int revert; + Window focus = 0; + XGetInputFocus (display, &focus, &revert); + + if (focus == 0 || focus == None || focus == PointerRoot) + return 0; + + ComponentPeer* focusedPeer = 0; + if (XFindContext (display, (XID) focus, improbableNumber, (XPointer*) &focusedPeer) != 0) + focusedPeer = 0; + + return this == focusedPeer; + } + + void grabFocus() + { + XWindowAttributes atts; + + if (windowH != 0 + && XGetWindowAttributes (display, windowH, &atts) + && atts.map_state == IsViewable) + { + XSetInputFocus (display, windowH, RevertToParent, CurrentTime); + + if (! isActiveApplication) + { + isActiveApplication = true; + handleFocusGain(); + } + } + } + + void repaint (int x, int y, int w, int h) + { + if (Rectangle::intersectRectangles (x, y, w, h, + 0, 0, + getComponent()->getWidth(), + getComponent()->getHeight())) + { + repainter->repaint (x, y, w, h); + } + } + + void performAnyPendingRepaintsNow() + { + repainter->performAnyPendingRepaintsNow(); + } + + //============================================================================== + void handleWindowMessage (XEvent* event) + { + switch (event->xany.type) + { + case 2: // 'KeyPress' + { + XKeyEvent* const keyEvent = (XKeyEvent*) &event->xkey; + updateKeyStates (keyEvent->keycode, true); + + char utf8 [64]; + zeromem (utf8, sizeof (utf8)); + KeySym sym; + XLookupString (keyEvent, utf8, sizeof (utf8), &sym, 0); + + const juce_wchar unicodeChar = *(const juce_wchar*) String::fromUTF8 ((const uint8*) utf8, sizeof (utf8) - 1); + int keyCode = (int) unicodeChar; + + if (keyCode < 0x20) + keyCode = XKeycodeToKeysym (display, keyEvent->keycode, + (currentModifiers & ModifierKeys::shiftModifier) != 0 ? 1 : 0); + + const int oldMods = currentModifiers; + bool keyPressed = false; + + const bool keyDownChange = (sym != NoSymbol) && ! updateKeyModifiersFromSym (sym, true); + + if ((sym & 0xff00) == 0xff00) + { + // Translate keypad + if (sym == XK_KP_Divide) + keyCode = XK_slash; + else if (sym == XK_KP_Multiply) + keyCode = XK_asterisk; + else if (sym == XK_KP_Subtract) + keyCode = XK_hyphen; + else if (sym == XK_KP_Add) + keyCode = XK_plus; + else if (sym == XK_KP_Enter) + keyCode = XK_Return; + else if (sym == XK_KP_Decimal) + keyCode = numLock ? XK_period : XK_Delete; + else if (sym == XK_KP_0) + keyCode = numLock ? XK_0 : XK_Insert; + else if (sym == XK_KP_1) + keyCode = numLock ? XK_1 : XK_End; + else if (sym == XK_KP_2) + keyCode = numLock ? XK_2 : XK_Down; + else if (sym == XK_KP_3) + keyCode = numLock ? XK_3 : XK_Page_Down; + else if (sym == XK_KP_4) + keyCode = numLock ? XK_4 : XK_Left; + else if (sym == XK_KP_5) + keyCode = XK_5; + else if (sym == XK_KP_6) + keyCode = numLock ? XK_6 : XK_Right; + else if (sym == XK_KP_7) + keyCode = numLock ? XK_7 : XK_Home; + else if (sym == XK_KP_8) + keyCode = numLock ? XK_8 : XK_Up; + else if (sym == XK_KP_9) + keyCode = numLock ? XK_9 : XK_Page_Up; + + switch (sym) + { + case XK_Left: + case XK_Right: + case XK_Up: + case XK_Down: + case XK_Page_Up: + case XK_Page_Down: + case XK_End: + case XK_Home: + case XK_Delete: + case XK_Insert: + keyPressed = true; + keyCode = (sym & 0xff) | extendedKeyModifier; + break; + case XK_Tab: + case XK_Return: + case XK_Escape: + case XK_BackSpace: + keyPressed = true; + keyCode &= 0xff; + break; + default: + { + if (sym >= XK_F1 && sym <= XK_F16) + { + keyPressed = true; + keyCode = (sym & 0xff) | extendedKeyModifier; + } + break; + } + } + } + + if (utf8[0] != 0 || ((sym & 0xff00) == 0 && sym >= 8)) + keyPressed = true; + + if (oldMods != currentModifiers) + handleModifierKeysChange(); + + if (keyDownChange) + handleKeyUpOrDown(); + + if (keyPressed) + handleKeyPress (keyCode, unicodeChar); + + break; + } + + case KeyRelease: + { + const XKeyEvent* const keyEvent = (const XKeyEvent*) &event->xkey; + updateKeyStates (keyEvent->keycode, false); + + KeySym sym = XKeycodeToKeysym (display, keyEvent->keycode, 0); + + const int oldMods = currentModifiers; + const bool keyDownChange = (sym != NoSymbol) && ! updateKeyModifiersFromSym (sym, false); + + if (oldMods != currentModifiers) + handleModifierKeysChange(); + + if (keyDownChange) + handleKeyUpOrDown(); + + break; + } + + case ButtonPress: + { + const XButtonPressedEvent* const buttonPressEvent = (const XButtonPressedEvent*) &event->xbutton; + + bool buttonMsg = false; + bool wheelUpMsg = false; + bool wheelDownMsg = false; + + const int map = pointerMap [buttonPressEvent->button - Button1]; + + if (map == LeftButton) + { + currentModifiers |= ModifierKeys::leftButtonModifier; + buttonMsg = true; + } + else if (map == RightButton) + { + currentModifiers |= ModifierKeys::rightButtonModifier; + buttonMsg = true; + } + else if (map == MiddleButton) + { + currentModifiers |= ModifierKeys::middleButtonModifier; + buttonMsg = true; + } + else if (map == WheelUp) + { + wheelUpMsg = true; + } + else if (map == WheelDown) + { + wheelDownMsg = true; + } + + updateKeyModifiers (buttonPressEvent->state); + + if (buttonMsg) + { + toFront (true); + handleMouseDown (buttonPressEvent->x, buttonPressEvent->y, + getEventTime (buttonPressEvent->time)); + } + else if (wheelUpMsg || wheelDownMsg) + { + handleMouseWheel (0, wheelDownMsg ? -84 : 84, + getEventTime (buttonPressEvent->time)); + } + + lastMousePosX = lastMousePosY = 0x100000; + break; + } + + case ButtonRelease: + { + const XButtonReleasedEvent* const buttonRelEvent = (const XButtonReleasedEvent*) &event->xbutton; + + const int oldModifiers = currentModifiers; + const int map = pointerMap [buttonRelEvent->button - Button1]; + + if (map == LeftButton) + currentModifiers &= ~ModifierKeys::leftButtonModifier; + else if (map == RightButton) + currentModifiers &= ~ModifierKeys::rightButtonModifier; + else if (map == MiddleButton) + currentModifiers &= ~ModifierKeys::middleButtonModifier; + + updateKeyModifiers (buttonRelEvent->state); + + handleMouseUp (oldModifiers, + buttonRelEvent->x, buttonRelEvent->y, + getEventTime (buttonRelEvent->time)); + + lastMousePosX = lastMousePosY = 0x100000; + break; + } + + case MotionNotify: + { + const XPointerMovedEvent* const movedEvent = (const XPointerMovedEvent*) &event->xmotion; + + updateKeyModifiers (movedEvent->state); + + int x, y, mouseMods; + getMousePos (x, y, mouseMods); + + if (lastMousePosX != x || lastMousePosY != y) + { + lastMousePosX = x; + lastMousePosY = y; + + if (parentWindow != 0 && (styleFlags & windowHasTitleBar) == 0) + { + Window wRoot = 0, wParent = 0; + Window* wChild = 0; + unsigned int numChildren; + XQueryTree (display, windowH, &wRoot, &wParent, &wChild, &numChildren); + + if (wParent != 0 + && wParent != windowH + && wParent != wRoot) + { + parentWindow = wParent; + updateBounds(); + x -= getScreenX(); + y -= getScreenY(); + } + else + { + parentWindow = 0; + x -= getScreenX(); + y -= getScreenY(); + } + } + else + { + x -= getScreenX(); + y -= getScreenY(); + } + + if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0) + handleMouseMove (x, y, getEventTime (movedEvent->time)); + else + handleMouseDrag (x, y, getEventTime (movedEvent->time)); + } + + break; + } + + case EnterNotify: + { + lastMousePosX = lastMousePosY = 0x100000; + const XEnterWindowEvent* const enterEvent = (const XEnterWindowEvent*) &event->xcrossing; + + if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0 + && ! entered) + { + updateKeyModifiers (enterEvent->state); + + handleMouseEnter (enterEvent->x, enterEvent->y, getEventTime (enterEvent->time)); + + entered = true; + } + + break; + } + + case LeaveNotify: + { + const XLeaveWindowEvent* const leaveEvent = (const XLeaveWindowEvent*) &event->xcrossing; + + // Suppress the normal leave if we've got a pointer grab, or if + // it's a bogus one caused by clicking a mouse button when running + // in a Window manager + if (((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0 + && leaveEvent->mode == NotifyNormal) + || leaveEvent->mode == NotifyUngrab) + { + updateKeyModifiers (leaveEvent->state); + + handleMouseExit (leaveEvent->x, leaveEvent->y, getEventTime (leaveEvent->time)); + + entered = false; + } + + break; + } + + case FocusIn: + { + isActiveApplication = true; + handleFocusGain(); + break; + } + + case FocusOut: + { + isActiveApplication = false; + handleFocusLoss(); + break; + } + + case Expose: + { + // Batch together all pending expose events + XExposeEvent* exposeEvent = (XExposeEvent*) &event->xexpose; + XEvent nextEvent; + + if (exposeEvent->window != windowH) + { + Window child; + XTranslateCoordinates (display, exposeEvent->window, windowH, + exposeEvent->x, exposeEvent->y, &exposeEvent->x, &exposeEvent->y, + &child); + } + + repaint (exposeEvent->x, exposeEvent->y, + exposeEvent->width, exposeEvent->height); + + while (XEventsQueued (display, QueuedAfterFlush) > 0) + { + XPeekEvent (display, (XEvent*) &nextEvent); + if (nextEvent.type != Expose || nextEvent.xany.window != event->xany.window) + break; + + XNextEvent (display, (XEvent*) &nextEvent); + XExposeEvent* nextExposeEvent = (XExposeEvent*) &nextEvent.xexpose; + repaint (nextExposeEvent->x, nextExposeEvent->y, + nextExposeEvent->width, nextExposeEvent->height); + } + + break; + } + + case CirculateNotify: + case CreateNotify: + case DestroyNotify: + // Think we can ignore these + break; + + case ConfigureNotify: + { + updateBounds(); + updateBorderSize(); + handleMovedOrResized(); + + XConfigureEvent* const confEvent = (XConfigureEvent*) &event->xconfigure; + + if (confEvent->window == windowH + && confEvent->above != 0 + && isFrontWindow()) + { + handleBroughtToFront(); + } + + break; + } + + case ReparentNotify: + case GravityNotify: + { + parentWindow = 0; + Window wRoot = 0; + Window* wChild = 0; + unsigned int numChildren; + XQueryTree (display, windowH, &wRoot, &parentWindow, &wChild, &numChildren); + + if (parentWindow == windowH || parentWindow == wRoot) + parentWindow = 0; + + updateBounds(); + updateBorderSize(); + handleMovedOrResized(); + break; + } + + case MapNotify: + mapped = true; + handleBroughtToFront(); + break; + + case UnmapNotify: + mapped = false; + break; + + case MappingNotify: + { + XMappingEvent* mappingEvent = (XMappingEvent*) &event->xmapping; + + if (mappingEvent->request != MappingPointer) + { + // Deal with modifier/keyboard mapping + XRefreshKeyboardMapping (mappingEvent); + getModifierMapping(); + } + + break; + } + + case ClientMessage: + { + XClientMessageEvent* clientMsg = (XClientMessageEvent*) &event->xclient; + + if (clientMsg->message_type == wm_Protocols && clientMsg->format == 32) + { + const Atom atom = (Atom) clientMsg->data.l[0]; + + if (atom == wm_ProtocolList [TAKE_FOCUS]) + { + XWindowAttributes atts; + + if (clientMsg->window != 0 + && XGetWindowAttributes (display, clientMsg->window, &atts)) + { + if (atts.map_state == IsViewable) + XSetInputFocus (display, clientMsg->window, RevertToParent, clientMsg->data.l[1]); + } + } + else if (atom == wm_ProtocolList [DELETE_WINDOW]) + { + handleUserClosingWindow(); + } + } + else if (clientMsg->message_type == XA_XdndEnter) + { + handleDragAndDropEnter (clientMsg); + } + else if (clientMsg->message_type == XA_XdndLeave) + { + resetDragAndDrop(); + } + else if (clientMsg->message_type == XA_XdndPosition) + { + handleDragAndDropPosition (clientMsg); + } + else if (clientMsg->message_type == XA_XdndDrop) + { + handleDragAndDropDrop (clientMsg); + } + else if (clientMsg->message_type == XA_XdndStatus) + { + handleDragAndDropStatus (clientMsg); + } + else if (clientMsg->message_type == XA_XdndFinished) + { + resetDragAndDrop(); + } + + break; + } + + case SelectionClear: + case SelectionRequest: + break; + + case SelectionNotify: + handleDragAndDropSelection (event); + break; + + default: + break; + } + } + + void showMouseCursor (Cursor cursor) + { + XDefineCursor (display, windowH, cursor); + } + + //============================================================================== + void setTaskBarIcon (const Image& image) + { + deleteTaskBarIcon(); + taskbarImage = image.createCopy(); + + Screen* const screen = XDefaultScreenOfDisplay (display); + const int screenNumber = XScreenNumberOfScreen (screen); + + char screenAtom[32]; + snprintf (screenAtom, sizeof (screenAtom), "_NET_SYSTEM_TRAY_S%d", screenNumber); + Atom selectionAtom = XInternAtom (display, screenAtom, false); + + XGrabServer (display); + Window managerWin = XGetSelectionOwner (display, selectionAtom); + + if (managerWin != None) + XSelectInput (display, managerWin, StructureNotifyMask); + + XUngrabServer (display); + XFlush (display); + + if (managerWin != None) + { + XEvent ev; + zerostruct (ev); + ev.xclient.type = ClientMessage; + ev.xclient.window = managerWin; + ev.xclient.message_type = XInternAtom (display, "_NET_SYSTEM_TRAY_OPCODE", False); + ev.xclient.format = 32; + ev.xclient.data.l[0] = CurrentTime; + ev.xclient.data.l[1] = SYSTEM_TRAY_REQUEST_DOCK; + ev.xclient.data.l[2] = windowH; + ev.xclient.data.l[3] = 0; + ev.xclient.data.l[4] = 0; + + XSendEvent (display, managerWin, False, NoEventMask, &ev); + XSync (display, False); + } + + // For older KDE's ... + int atomData = 1; + Atom trayAtom = XInternAtom (display, "KWM_DOCKWINDOW", false); + XChangeProperty (display, windowH, trayAtom, trayAtom, 32, PropModeReplace, (unsigned char*) &atomData, 1); + + // For more recent KDE's... + trayAtom = XInternAtom (display, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false); + XChangeProperty (display, windowH, trayAtom, XA_WINDOW, 32, PropModeReplace, (unsigned char*) &windowH, 1); + } + + void deleteTaskBarIcon() + { + deleteAndZero (taskbarImage); + } + + const Image* getTaskbarIcon() const throw() { return taskbarImage; } + + //============================================================================== + juce_UseDebuggingNewOperator + + bool dontRepaint; + +private: + //============================================================================== + class LinuxRepaintManager : public Timer + { + public: + LinuxRepaintManager (LinuxComponentPeer* const peer_) + : peer (peer_), + image (0), + lastTimeImageUsed (0) + { +#if JUCE_USE_XSHM + useARGBImagesForRendering = isShmAvailable(); + + if (useARGBImagesForRendering) + { + XShmSegmentInfo segmentinfo; + + XImage* const testImage + = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)), + 24, ZPixmap, 0, &segmentinfo, 64, 64); + + useARGBImagesForRendering = (testImage->bits_per_pixel == 32); + XDestroyImage (testImage); + } +#endif + } + + ~LinuxRepaintManager() + { + delete image; + } + + void timerCallback() + { + if (! regionsNeedingRepaint.isEmpty()) + { + stopTimer(); + performAnyPendingRepaintsNow(); + } + else if (Time::getApproximateMillisecondCounter() > lastTimeImageUsed + 3000) + { + stopTimer(); + deleteAndZero (image); + } + } + + void repaint (int x, int y, int w, int h) + { + if (! isTimerRunning()) + startTimer (repaintTimerPeriod); + + regionsNeedingRepaint.add (x, y, w, h); + } + + void performAnyPendingRepaintsNow() + { + peer->clearMaskedRegion(); + + const Rectangle totalArea (regionsNeedingRepaint.getBounds()); + + if (! totalArea.isEmpty()) + { + if (image == 0 || image->getWidth() < totalArea.getWidth() + || image->getHeight() < totalArea.getHeight()) + { + delete image; + +#if JUCE_USE_XSHM + image = new XBitmapImage (useARGBImagesForRendering ? Image::ARGB + : Image::RGB, +#else + image = new XBitmapImage (Image::RGB, +#endif + (totalArea.getWidth() + 31) & ~31, + (totalArea.getHeight() + 31) & ~31, + false, + peer->depthIs16Bit); + } + + startTimer (repaintTimerPeriod); + + LowLevelGraphicsSoftwareRenderer context (*image); + + context.setOrigin (-totalArea.getX(), -totalArea.getY()); + + if (context.reduceClipRegion (regionsNeedingRepaint)) + peer->handlePaint (context); + + if (! peer->maskedRegion.isEmpty()) + regionsNeedingRepaint.subtract (peer->maskedRegion); + + for (RectangleList::Iterator i (regionsNeedingRepaint); i.next();) + { + const Rectangle& r = i.getRectangle(); + + image->blitToWindow (peer->windowH, + r.getX(), r.getY(), r.getWidth(), r.getHeight(), + r.getX() - totalArea.getX(), r.getY() - totalArea.getY()); + } + } + + regionsNeedingRepaint.clear(); + + lastTimeImageUsed = Time::getApproximateMillisecondCounter(); + startTimer (repaintTimerPeriod); + } + + private: + LinuxComponentPeer* const peer; + XBitmapImage* image; + uint32 lastTimeImageUsed; + RectangleList regionsNeedingRepaint; + +#if JUCE_USE_XSHM + bool useARGBImagesForRendering; +#endif + LinuxRepaintManager (const LinuxRepaintManager&); + const LinuxRepaintManager& operator= (const LinuxRepaintManager&); + }; + + LinuxRepaintManager* repainter; + + friend class LinuxRepaintManager; + Window windowH, parentWindow; + int wx, wy, ww, wh; + Image* taskbarImage; + bool fullScreen, entered, mapped, depthIs16Bit; + BorderSize windowBorder; + + //============================================================================== + void removeWindowDecorations (Window wndH) + { + Atom hints = XInternAtom (display, "_MOTIF_WM_HINTS", True); + + if (hints != None) + { + typedef struct + { + CARD32 flags; + CARD32 functions; + CARD32 decorations; + INT32 input_mode; + CARD32 status; + } MotifWmHints; + + MotifWmHints motifHints; + motifHints.flags = 2; /* MWM_HINTS_DECORATIONS */ + motifHints.decorations = 0; + + XChangeProperty (display, wndH, hints, hints, 32, PropModeReplace, + (unsigned char*) &motifHints, 4); + } + + hints = XInternAtom (display, "_WIN_HINTS", True); + + if (hints != None) + { + long gnomeHints = 0; + + XChangeProperty (display, wndH, hints, hints, 32, PropModeReplace, + (unsigned char*) &gnomeHints, 1); + } + + hints = XInternAtom (display, "KWM_WIN_DECORATION", True); + + if (hints != None) + { + long kwmHints = 2; /*KDE_tinyDecoration*/ + + XChangeProperty (display, wndH, hints, hints, 32, PropModeReplace, + (unsigned char*) &kwmHints, 1); + } + + hints = XInternAtom (display, "_NET_WM_WINDOW_TYPE", True); + + if (hints != None) + { + Atom netHints [2]; + netHints[0] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); + + if ((styleFlags & windowIsTemporary) != 0) + netHints[1] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); + else + netHints[1] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_NORMAL", True); + + XChangeProperty (display, wndH, hints, XA_ATOM, 32, PropModeReplace, + (unsigned char*) &netHints, 2); + } + } + + void addWindowButtons (Window wndH) + { + Atom hints = XInternAtom (display, "_MOTIF_WM_HINTS", True); + + if (hints != None) + { + typedef struct + { + CARD32 flags; + CARD32 functions; + CARD32 decorations; + INT32 input_mode; + CARD32 status; + } MotifWmHints; + + MotifWmHints motifHints; + + motifHints.flags = 1 | 2; /* MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS */ + motifHints.decorations = 2 /* MWM_DECOR_BORDER */ | 8 /* MWM_DECOR_TITLE */ | 16; /* MWM_DECOR_MENU */ + + motifHints.functions = 4 /* MWM_FUNC_MOVE */; + + if ((styleFlags & windowHasCloseButton) != 0) + motifHints.functions |= 32; /* MWM_FUNC_CLOSE */ + + if ((styleFlags & windowHasMinimiseButton) != 0) + { + motifHints.functions |= 8; /* MWM_FUNC_MINIMIZE */ + motifHints.decorations |= 0x20; /* MWM_DECOR_MINIMIZE */ + } + + if ((styleFlags & windowHasMaximiseButton) != 0) + { + motifHints.functions |= 0x10; /* MWM_FUNC_MAXIMIZE */ + motifHints.decorations |= 0x40; /* MWM_DECOR_MAXIMIZE */ + } + + if ((styleFlags & windowIsResizable) != 0) + { + motifHints.functions |= 2; /* MWM_FUNC_RESIZE */ + motifHints.decorations |= 0x4; /* MWM_DECOR_RESIZEH */ + } + + XChangeProperty (display, wndH, hints, hints, 32, 0, (unsigned char*) &motifHints, 5); + } + + hints = XInternAtom (display, "_NET_WM_ALLOWED_ACTIONS", True); + + if (hints != None) + { + Atom netHints [6]; + int num = 0; + + netHints [num++] = XInternAtom (display, "_NET_WM_ACTION_RESIZE", (styleFlags & windowIsResizable) ? True : False); + netHints [num++] = XInternAtom (display, "_NET_WM_ACTION_FULLSCREEN", (styleFlags & windowHasMaximiseButton) ? True : False); + netHints [num++] = XInternAtom (display, "_NET_WM_ACTION_MINIMIZE", (styleFlags & windowHasMinimiseButton) ? True : False); + netHints [num++] = XInternAtom (display, "_NET_WM_ACTION_CLOSE", (styleFlags & windowHasCloseButton) ? True : False); + + XChangeProperty (display, wndH, hints, XA_ATOM, 32, PropModeReplace, + (unsigned char*) &netHints, num); + } + } + + void createWindow() + { + static bool atomsInitialised = false; + + if (! atomsInitialised) + { + atomsInitialised = true; + + wm_Protocols = XInternAtom (display, "WM_PROTOCOLS", 1); + wm_ProtocolList [TAKE_FOCUS] = XInternAtom (display, "WM_TAKE_FOCUS", 1); + wm_ProtocolList [DELETE_WINDOW] = XInternAtom (display, "WM_DELETE_WINDOW", 1); + wm_ChangeState = XInternAtom (display, "WM_CHANGE_STATE", 1); + wm_State = XInternAtom (display, "WM_STATE", 1); + wm_ActiveWin = XInternAtom (display, "_NET_ACTIVE_WINDOW", False); + + XA_XdndAware = XInternAtom (display, "XdndAware", 0); + XA_XdndEnter = XInternAtom (display, "XdndEnter", 0); + XA_XdndLeave = XInternAtom (display, "XdndLeave", 0); + XA_XdndPosition = XInternAtom (display, "XdndPosition", 0); + XA_XdndStatus = XInternAtom (display, "XdndStatus", 0); + XA_XdndDrop = XInternAtom (display, "XdndDrop", 0); + XA_XdndFinished = XInternAtom (display, "XdndFinished", 0); + XA_XdndSelection = XInternAtom (display, "XdndSelection", 0); + XA_XdndProxy = XInternAtom (display, "XdndProxy", 0); + + XA_XdndTypeList = XInternAtom (display, "XdndTypeList", 0); + XA_XdndActionList = XInternAtom (display, "XdndActionList", 0); + XA_XdndActionCopy = XInternAtom (display, "XdndActionCopy", 0); + XA_XdndActionMove = XInternAtom (display, "XdndActionMove", 0); + XA_XdndActionLink = XInternAtom (display, "XdndActionLink", 0); + XA_XdndActionAsk = XInternAtom (display, "XdndActionAsk", 0); + XA_XdndActionPrivate = XInternAtom (display, "XdndActionPrivate", 0); + XA_XdndActionDescription = XInternAtom (display, "XdndActionDescription", 0); + + XA_JXSelectionWindowProperty = XInternAtom (display, "JXSelectionWindowProperty", 0); + + XA_MimeTextPlain = XInternAtom (display, "text/plain", 0); + XA_MimeTextUriList = XInternAtom (display, "text/uri-list", 0); + XA_MimeRootDrop = XInternAtom (display, "application/x-rootwindow-drop", 0); + } + + resetDragAndDrop(); + + XA_OtherMime = XA_MimeTextPlain; // xxx why?? + allowedMimeTypeAtoms [0] = XA_MimeTextPlain; + allowedMimeTypeAtoms [1] = XA_OtherMime; + + allowedActions [0] = XA_XdndActionMove; + allowedActions [1] = XA_XdndActionCopy; + allowedActions [2] = XA_XdndActionLink; + allowedActions [3] = XA_XdndActionAsk; + allowedActions [4] = XA_XdndActionPrivate; + + // Get defaults for various properties + const int screen = DefaultScreen (display); + Window root = RootWindow (display, screen); + + // Attempt to create a 24-bit window on the default screen. If this is not + // possible then exit + XVisualInfo desiredVisual; + desiredVisual.screen = screen; + desiredVisual.depth = 24; + depthIs16Bit = false; + + int numVisuals; + XVisualInfo* visuals = XGetVisualInfo (display, VisualScreenMask | VisualDepthMask, + &desiredVisual, &numVisuals); + + if (numVisuals < 1 || visuals == 0) + { + XFree (visuals); + desiredVisual.depth = 16; + + visuals = XGetVisualInfo (display, VisualScreenMask | VisualDepthMask, + &desiredVisual, &numVisuals); + + if (numVisuals < 1 || visuals == 0) + { + Logger::outputDebugString ("ERROR: System doesn't support 24 or 16 bit RGB display.\n"); + Process::terminate(); + } + + depthIs16Bit = true; + } + + XFree (visuals); + + // Set up the window attributes + XSetWindowAttributes swa; + swa.border_pixel = 0; + swa.background_pixmap = None; + swa.colormap = DefaultColormap (display, screen); + swa.override_redirect = getComponent()->isAlwaysOnTop() ? True : False; + swa.event_mask = eventMask; + + Window wndH = XCreateWindow (display, root, + 0, 0, 1, 1, + 0, 0, InputOutput, (Visual*) CopyFromParent, + CWBorderPixel | CWColormap | CWBackPixmap | CWEventMask | CWOverrideRedirect, + &swa); + + XGrabButton (display, AnyButton, AnyModifier, wndH, False, + ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask, + GrabModeAsync, GrabModeAsync, None, None); + + // Set the window context to identify the window handle object + if (XSaveContext (display, (XID) wndH, improbableNumber, (XPointer) this)) + { + // Failed + jassertfalse + Logger::outputDebugString ("Failed to create context information for window.\n"); + XDestroyWindow (display, wndH); + wndH = 0; + } + + // Set window manager hints + XWMHints* wmHints = XAllocWMHints(); + wmHints->flags = InputHint | StateHint; + wmHints->input = True; // Locally active input model + wmHints->initial_state = NormalState; + XSetWMHints (display, wndH, wmHints); + XFree (wmHints); + + if ((styleFlags & juce_windowIsSemiTransparentFlag) != 0) + { + //xxx + } + + if ((styleFlags & windowAppearsOnTaskbar) != 0) + { + //xxx + } + + //XSetTransientForHint (display, wndH, RootWindow (display, DefaultScreen (display))); + + if ((styleFlags & windowHasTitleBar) == 0) + removeWindowDecorations (wndH); + else + addWindowButtons (wndH); + + // Set window manager protocols + XChangeProperty (display, wndH, wm_Protocols, XA_ATOM, 32, PropModeReplace, + (unsigned char*) wm_ProtocolList, 2); + + // Set drag and drop flags + XChangeProperty (display, wndH, XA_XdndTypeList, XA_ATOM, 32, PropModeReplace, + (const unsigned char*) allowedMimeTypeAtoms, numElementsInArray (allowedMimeTypeAtoms)); + + XChangeProperty (display, wndH, XA_XdndActionList, XA_ATOM, 32, PropModeReplace, + (const unsigned char*) allowedActions, numElementsInArray (allowedActions)); + + XChangeProperty (display, wndH, XA_XdndActionDescription, XA_STRING, 8, PropModeReplace, + (const unsigned char*) "", 0); + + uint32 dndVersion = ourDndVersion; + XChangeProperty (display, wndH, XA_XdndAware, XA_ATOM, 32, PropModeReplace, + (const unsigned char*) &dndVersion, 1); + + // Set window name + setWindowTitle (wndH, getComponent()->getName()); + + // Initialise the pointer and keyboard mapping + // This is not the same as the logical pointer mapping the X server uses: + // we don't mess with this. + static bool mappingInitialised = false; + + if (! mappingInitialised) + { + mappingInitialised = true; + + const int numButtons = XGetPointerMapping (display, 0, 0); + + if (numButtons == 2) + { + pointerMap[0] = LeftButton; + pointerMap[1] = RightButton; + pointerMap[2] = pointerMap[3] = pointerMap[4] = NoButton; + } + else if (numButtons >= 3) + { + pointerMap[0] = LeftButton; + pointerMap[1] = MiddleButton; + pointerMap[2] = RightButton; + + if (numButtons >= 5) + { + pointerMap[3] = WheelUp; + pointerMap[4] = WheelDown; + } + } + + getModifierMapping(); + } + + windowH = wndH; + } + + void destroyWindow() + { + XPointer handlePointer; + if (! XFindContext (display, (XID) windowH, improbableNumber, &handlePointer)) + XDeleteContext (display, (XID) windowH, improbableNumber); + + XDestroyWindow (display, windowH); + + // Wait for it to complete and then remove any events for this + // window from the event queue. + XSync (display, false); + + XEvent event; + while (XCheckWindowEvent (display, windowH, eventMask, &event) == True) + {} + } + + static int64 getEventTime (::Time t) + { + static int64 eventTimeOffset = 0x12345678; + const int64 thisMessageTime = t; + + if (eventTimeOffset == 0x12345678) + eventTimeOffset = Time::currentTimeMillis() - thisMessageTime; + + return eventTimeOffset + thisMessageTime; + } + + static void setWindowTitle (Window xwin, const char* const title) + { + XTextProperty nameProperty; + char* strings[] = { (char*) title }; + + if (XStringListToTextProperty (strings, 1, &nameProperty)) + { + XSetWMName (display, xwin, &nameProperty); + XSetWMIconName (display, xwin, &nameProperty); + } + } + + void updateBorderSize() + { + if ((styleFlags & windowHasTitleBar) == 0) + { + windowBorder = BorderSize (0); + } + else if (windowBorder.getTopAndBottom() == 0 && windowBorder.getLeftAndRight() == 0) + { + Atom hints = XInternAtom (display, "_NET_FRAME_EXTENTS", True); + + if (hints != None) + { + CARD32* sizes = 0; + unsigned long nitems, bytesLeft; + Atom actualType; + int actualFormat; + + if (XGetWindowProperty (display, windowH, hints, 0, 4, False, + XA_CARDINAL, &actualType, &actualFormat, &nitems, &bytesLeft, + (unsigned char**) &sizes) == Success) + { + if (actualFormat == 32) + windowBorder = BorderSize ((int) sizes[2], (int) sizes[0], + (int) sizes[3], (int) sizes[1]); + + XFree (sizes); + } + } + } + } + + void updateBounds() + { + jassert (windowH != 0); + if (windowH != 0) + { + Window root, child; + unsigned int bw, depth; + + if (! XGetGeometry (display, (Drawable) windowH, &root, + &wx, &wy, (unsigned int*) &ww, (unsigned int*) &wh, + &bw, &depth)) + { + wx = wy = ww = wh = 0; + } + else if (! XTranslateCoordinates (display, windowH, root, 0, 0, &wx, &wy, &child)) + { + wx = wy = 0; + } + } + } + + //============================================================================== + void resetDragAndDrop() + { + lastDropX = lastDropY = -1; + dragAndDropCurrentMimeType = 0; + dragAndDropSourceWindow = 0; + srcMimeTypeAtomList.clear(); + } + + void sendDragAndDropMessage (XClientMessageEvent& msg) + { + msg.type = ClientMessage; + msg.display = display; + msg.window = dragAndDropSourceWindow; + msg.format = 32; + msg.data.l[0] = windowH; + + XSendEvent (display, dragAndDropSourceWindow, False, 0, (XEvent*) &msg); + } + + void sendDragAndDropStatus (const bool acceptDrop, Atom dropAction) + { + XClientMessageEvent msg; + zerostruct (msg); + msg.message_type = XA_XdndStatus; + msg.data.l[1] = (acceptDrop ? 1 : 0) | 2; // 2 indicates that we want to receive position messages + //msg.data.l[2] = (0 << 16) + 0; + //msg.data.l[3] = (0 << 16) + 0; + msg.data.l[4] = dropAction; + + sendDragAndDropMessage (msg); + } + + void sendDragAndDropLeave() + { + XClientMessageEvent msg; + zerostruct (msg); + msg.message_type = XA_XdndLeave; + sendDragAndDropMessage (msg); + } + + void sendDragAndDropFinish() + { + XClientMessageEvent msg; + zerostruct (msg); + msg.message_type = XA_XdndFinished; + sendDragAndDropMessage (msg); + } + + void handleDragAndDropStatus (const XClientMessageEvent* const clientMsg) + { + if ((clientMsg->data.l[1] & 1) == 0) + { + sendDragAndDropLeave(); + return; + } + } + + void handleDragAndDropPosition (const XClientMessageEvent* const clientMsg) + { + if (dragAndDropSourceWindow == 0) + return; + + dragAndDropSourceWindow = clientMsg->data.l[0]; + + const int dropX = ((int) clientMsg->data.l[2] >> 16) - getScreenX(); + const int dropY = ((int) clientMsg->data.l[2] & 0xffff) - getScreenY(); + + if (lastDropX != dropX || lastDropY != dropY) + { + lastDropX = dropX; + lastDropY = dropY; + + dragAndDropTimestamp = clientMsg->data.l[3]; + + Atom targetAction = XA_XdndActionCopy; + + for (int i = numElementsInArray (allowedActions); --i >= 0;) + { + if ((Atom) clientMsg->data.l[4] == allowedActions[i]) + { + targetAction = allowedActions[i]; + break; + } + } + + sendDragAndDropStatus (true, targetAction); + } + } + + void handleDragAndDropDrop (const XClientMessageEvent* const clientMsg) + { + if (dragAndDropSourceWindow != None + && dragAndDropCurrentMimeType != 0) + { + dragAndDropTimestamp = clientMsg->data.l[2]; + + XConvertSelection (display, + XA_XdndSelection, + dragAndDropCurrentMimeType, + XA_JXSelectionWindowProperty, + windowH, + dragAndDropTimestamp); + } + } + + void handleDragAndDropSelection (const XEvent* const evt) + { + StringArray files; + + if (evt->xselection.property != 0) + { + StringArray lines; + + { + MemoryBlock dropData; + + for (;;) + { + Atom actual; + uint8* data = 0; + unsigned long count = 0, remaining = 0; + int format = 0; + + if (XGetWindowProperty (display, evt->xany.window, evt->xselection.property, + dropData.getSize() / 4, 65536, 1, AnyPropertyType, &actual, + &format, &count, &remaining, &data) == Success) + { + dropData.append (data, count * format / 8); + XFree (data); + + if (remaining == 0) + break; + } + else + { + XFree (data); + break; + } + } + + lines.addLines (dropData.toString()); + } + + for (int i = 0; i < lines.size(); ++i) + { + const String filename (URL::removeEscapeChars (lines[i].fromFirstOccurrenceOf (T("file://"), false, true))); + + if (filename.isNotEmpty()) + files.add (filename); + } + } + + const int lastX = lastDropX, lastY = lastDropY; + + sendDragAndDropFinish(); + resetDragAndDrop(); + + if (files.size() > 0) + handleFilesDropped (lastX, lastY, files); + } + + void handleDragAndDropEnter (const XClientMessageEvent* const clientMsg) + { + srcMimeTypeAtomList.clear(); + + dragAndDropCurrentMimeType = 0; + const int dndCurrentVersion = (int) (clientMsg->data.l[1] & 0xff000000) >> 24; + + if (dndCurrentVersion < 3 || dndCurrentVersion > ourDndVersion) + { + dragAndDropSourceWindow = 0; + return; + } + + dragAndDropSourceWindow = clientMsg->data.l[0]; + + if ((clientMsg->data.l[1] & 1) != 0) + { + Atom actual; + int format; + unsigned long count = 0, remaining = 0; + Atom* types = 0; + + XGetWindowProperty (display, dragAndDropSourceWindow, XA_XdndTypeList, + 0, 0x8000000L, False, XA_ATOM, &actual, &format, + &count, &remaining, (unsigned char**) &types); + + if (actual == XA_ATOM && format == 32 && count != 0) + { + for (unsigned int i = 0; i < count; ++i) + if (types[i] != None) + srcMimeTypeAtomList.add (types[i]); + } + + if (types != 0) + XFree (types); + } + + if (srcMimeTypeAtomList.size() == 0) + { + for (int i = 2; i < 5; ++i) + if (clientMsg->data.l[i] != None) + srcMimeTypeAtomList.add (clientMsg->data.l[i]); + + if (srcMimeTypeAtomList.size() == 0) + { + dragAndDropSourceWindow = 0; + return; + } + } + + for (int i = 0; i < srcMimeTypeAtomList.size() && dragAndDropCurrentMimeType == 0; ++i) + for (int j = 0; j < numElementsInArray (allowedMimeTypeAtoms); ++j) + if (srcMimeTypeAtomList[i] == allowedMimeTypeAtoms[j]) + dragAndDropCurrentMimeType = allowedMimeTypeAtoms[j]; + } + + int dragAndDropTimestamp, lastDropX, lastDropY; + + Atom XA_OtherMime, dragAndDropCurrentMimeType; + Window dragAndDropSourceWindow; + + Atom allowedActions [5]; + Atom allowedMimeTypeAtoms [2]; + Array srcMimeTypeAtomList; +}; + +//============================================================================== +ComponentPeer* Component::createNewPeer (int styleFlags, void* /*nativeWindowToAttachTo*/) +{ + return new LinuxComponentPeer (this, styleFlags); +} + + +//============================================================================== +// (this callback is hooked up in the messaging code) +void juce_windowMessageReceive (XEvent* event) +{ + if (event->xany.window != None) + { + LinuxComponentPeer* const peer = LinuxComponentPeer::getPeerFor (event->xany.window); + + const MessageManagerLock messLock; + + if (ComponentPeer::isValidPeer (peer)) + peer->handleWindowMessage (event); + } + else + { + switch (event->xany.type) + { + case KeymapNotify: + { + const XKeymapEvent* const keymapEvent = (const XKeymapEvent*) &event->xkeymap; + memcpy (keyStates, keymapEvent->key_vector, 32); + break; + } + + default: + break; + } + } +} + +//============================================================================== +void juce_updateMultiMonitorInfo (Array & monitorCoords, const bool clipToWorkArea) +{ +#if JUCE_USE_XINERAMA + int major_opcode, first_event, first_error; + + if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error) + && XineramaIsActive (display)) + { + int numMonitors = 0; + XineramaScreenInfo* const screens = XineramaQueryScreens (display, &numMonitors); + + if (screens != 0) + { + for (int i = numMonitors; --i >= 0;) + { + int index = screens[i].screen_number; + + if (index >= 0) + { + while (monitorCoords.size() < index) + monitorCoords.add (Rectangle (0, 0, 0, 0)); + + monitorCoords.set (index, Rectangle (screens[i].x_org, + screens[i].y_org, + screens[i].width, + screens[i].height)); + } + } + + XFree (screens); + } + } + + if (monitorCoords.size() == 0) +#endif + { + Atom hints = clipToWorkArea ? XInternAtom (display, "_NET_WORKAREA", True) + : None; + + if (hints != None) + { + const int numMonitors = ScreenCount (display); + + for (int i = 0; i < numMonitors; ++i) + { + Window root = RootWindow (display, i); + + unsigned long nitems, bytesLeft; + Atom actualType; + int actualFormat; + long* position = 0; + + if (XGetWindowProperty (display, root, hints, 0, 4, False, + XA_CARDINAL, &actualType, &actualFormat, &nitems, &bytesLeft, + (unsigned char**) &position) == Success) + { + if (actualType == XA_CARDINAL && actualFormat == 32 && nitems == 4) + monitorCoords.add (Rectangle (position[0], position[1], + position[2], position[3])); + + XFree (position); + } + } + } + + if (monitorCoords.size() == 0) + { + monitorCoords.add (Rectangle (0, 0, + DisplayWidth (display, DefaultScreen (display)), + DisplayHeight (display, DefaultScreen (display)))); + } + } +} + +//============================================================================== +bool Desktop::canUseSemiTransparentWindows() +{ + return false; +} + +void Desktop::getMousePosition (int& x, int& y) +{ + int mouseMods; + getMousePos (x, y, mouseMods); +} + +void Desktop::setMousePosition (int x, int y) +{ + Window root = RootWindow (display, DefaultScreen (display)); + XWarpPointer (display, None, root, 0, 0, 0, 0, x, y); +} + +//============================================================================== +void* juce_createMouseCursorFromImage (const Image& image, int hotspotX, int hotspotY) +{ + Window root = RootWindow (display, DefaultScreen (display)); + const unsigned int imageW = image.getWidth(); + const unsigned int imageH = image.getHeight(); + unsigned int cursorW, cursorH; + + if (! XQueryBestCursor (display, root, imageW, imageH, &cursorW, &cursorH)) + return 0; + + Image im (Image::ARGB, cursorW, cursorH, true); + Graphics g (im); + + if (imageW > cursorW || imageH > cursorH) + { + hotspotX = (hotspotX * cursorW) / imageW; + hotspotY = (hotspotY * cursorH) / imageH; + + g.drawImageWithin (&image, 0, 0, imageW, imageH, + RectanglePlacement::xLeft | RectanglePlacement::yTop | RectanglePlacement::onlyReduceInSize, + false); + } + else + { + g.drawImageAt (&image, 0, 0); + } + + const int stride = (cursorW + 7) >> 3; + unsigned char* const maskPlane = (unsigned char*) juce_calloc (stride * cursorH); + unsigned char* const sourcePlane = (unsigned char*) juce_calloc (stride * cursorH); + + bool msbfirst = (BitmapBitOrder (display) == MSBFirst); + + for (int y = cursorH; --y >= 0;) + { + for (int x = cursorW; --x >= 0;) + { + const unsigned char mask = (unsigned char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7))); + const int offset = y * stride + (x >> 3); + + const Colour c (im.getPixelAt (x, y)); + + if (c.getAlpha() >= 128) + maskPlane[offset] |= mask; + + if (c.getBrightness() >= 0.5f) + sourcePlane[offset] |= mask; + } + } + + Pixmap sourcePixmap = XCreatePixmapFromBitmapData (display, root, (char*) sourcePlane, cursorW, cursorH, 0xffff, 0, 1); + Pixmap maskPixmap = XCreatePixmapFromBitmapData (display, root, (char*) maskPlane, cursorW, cursorH, 0xffff, 0, 1); + + juce_free (maskPlane); + juce_free (sourcePlane); + + XColor white, black; + black.red = black.green = black.blue = 0; + white.red = white.green = white.blue = 0xffff; + + void* result = (void*) XCreatePixmapCursor (display, sourcePixmap, maskPixmap, &white, &black, hotspotX, hotspotY); + + XFreePixmap (display, sourcePixmap); + XFreePixmap (display, maskPixmap); + + return result; +} + +void juce_deleteMouseCursor (void* cursorHandle, bool) +{ + if (cursorHandle != None) + XFreeCursor (display, (Cursor)cursorHandle); +} + +void* juce_createStandardMouseCursor (MouseCursor::StandardCursorType type) +{ + unsigned int shape; + + switch (type) + { + case MouseCursor::NoCursor: + { + void* invisibleCursor; + + Image im (Image::ARGB, 16, 16, true); + invisibleCursor = juce_createMouseCursorFromImage (im, 0, 0); + + return invisibleCursor; + } + + case MouseCursor::NormalCursor: + return (void*) None; // Use parent cursor + + case MouseCursor::DraggingHandCursor: + { + void* dragHandCursor; + static unsigned char dragHandData[] = {71,73,70,56,57,97,16,0,16,0,145,2,0,0,0,0,255,255,255,0, + 0,0,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,52,148,47,0,200,185,16,130,90,12,74,139,107,84,123,39, + 132,117,151,116,132,146,248,60,209,138,98,22,203,114,34,236,37,52,77,217, + 247,154,191,119,110,240,193,128,193,95,163,56,60,234,98,135,2,0,59 }; + const int dragHandDataSize = 99; + + Image* im = ImageFileFormat::loadFrom ((const char*) dragHandData, dragHandDataSize); + dragHandCursor = juce_createMouseCursorFromImage (*im, 8, 7); + delete im; + + return dragHandCursor; + } + + case MouseCursor::CopyingCursor: + { + void* copyCursor; + + static unsigned char copyCursorData[] = {71,73,70,56,57,97,21,0,21,0,145,0,0,0,0,0,255,255,255,0, + 128,128,255,255,255,33,249,4,1,0,0,3,0,44,0,0,0,0,21,0, + 21,0,0,2,72,4,134,169,171,16,199,98,11,79,90,71,161,93,56,111, + 78,133,218,215,137,31,82,154,100,200,86,91,202,142,12,108,212,87,235,174, + 15,54,214,126,237,226,37,96,59,141,16,37,18,201,142,157,230,204,51,112, + 252,114,147,74,83,5,50,68,147,208,217,16,71,149,252,124,5,0,59,0,0 }; + const int copyCursorSize = 119; + + Image* im = ImageFileFormat::loadFrom ((const char*)copyCursorData, copyCursorSize); + copyCursor = juce_createMouseCursorFromImage (*im, 1, 3); + delete im; + + return copyCursor; + } + + case MouseCursor::WaitCursor: + shape = XC_watch; + break; + + case MouseCursor::IBeamCursor: + shape = XC_xterm; + break; + + case MouseCursor::PointingHandCursor: + shape = XC_hand2; + break; + + case MouseCursor::LeftRightResizeCursor: + shape = XC_sb_h_double_arrow; + break; + + case MouseCursor::UpDownResizeCursor: + shape = XC_sb_v_double_arrow; + break; + + case MouseCursor::UpDownLeftRightResizeCursor: + shape = XC_fleur; + break; + + case MouseCursor::TopEdgeResizeCursor: + shape = XC_top_side; + break; + + case MouseCursor::BottomEdgeResizeCursor: + shape = XC_bottom_side; + break; + + case MouseCursor::LeftEdgeResizeCursor: + shape = XC_left_side; + break; + + case MouseCursor::RightEdgeResizeCursor: + shape = XC_right_side; + break; + + case MouseCursor::TopLeftCornerResizeCursor: + shape = XC_top_left_corner; + break; + + case MouseCursor::TopRightCornerResizeCursor: + shape = XC_top_right_corner; + break; + + case MouseCursor::BottomLeftCornerResizeCursor: + shape = XC_bottom_left_corner; + break; + + case MouseCursor::BottomRightCornerResizeCursor: + shape = XC_bottom_right_corner; + break; + + case MouseCursor::CrosshairCursor: + shape = XC_crosshair; + break; + + default: + return (void*) None; // Use parent cursor + } + + return (void*) XCreateFontCursor (display, shape); +} + +void MouseCursor::showInWindow (ComponentPeer* peer) const +{ + LinuxComponentPeer* const lp = dynamic_cast (peer); + + if (lp != 0) + lp->showMouseCursor ((Cursor) getHandle()); +} + +void MouseCursor::showInAllWindows() const +{ + for (int i = ComponentPeer::getNumPeers(); --i >= 0;) + showInWindow (ComponentPeer::getPeer (i)); +} + +//============================================================================== +Image* juce_createIconForFile (const File& file) +{ + return 0; +} + + +//============================================================================== +#if JUCE_OPENGL + +struct OpenGLContextInfo +{ + Window embeddedWindow; + GLXContext renderContext; +}; + +void* juce_createOpenGLContext (OpenGLComponent* component, void* sharedContext) +{ + XSync (display, False); + jassert (component != 0); + + if (component == 0) + return 0; + + LinuxComponentPeer* const peer + = dynamic_cast (component->getTopLevelComponent()->getPeer()); + + if (peer == 0) + return 0; + + GLint attribList[] = + { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_ALPHA_SIZE, 8, + GLX_DEPTH_SIZE, 8, + None + }; + + XVisualInfo* const bestVisual = glXChooseVisual (display, DefaultScreen (display), attribList); + + if (bestVisual == 0) + return 0; + + OpenGLContextInfo* const oc = new OpenGLContextInfo(); + + oc->renderContext = glXCreateContext (display, bestVisual, + (sharedContext != 0) ? ((OpenGLContextInfo*) sharedContext)->renderContext + : 0, + GL_TRUE); + + Window windowH = (Window) peer->getNativeHandle(); + + Colormap colourMap = XCreateColormap (display, windowH, bestVisual->visual, AllocNone); + XSetWindowAttributes swa; + swa.colormap = colourMap; + swa.border_pixel = 0; + swa.event_mask = ExposureMask | StructureNotifyMask; + + oc->embeddedWindow = XCreateWindow (display, windowH, + 0, 0, 1, 1, 0, + bestVisual->depth, + InputOutput, + bestVisual->visual, + CWBorderPixel | CWColormap | CWEventMask, + &swa); + + XSaveContext (display, (XID) oc->embeddedWindow, improbableNumber, (XPointer) peer); + + XMapWindow (display, oc->embeddedWindow); + XFreeColormap (display, colourMap); + + XFree (bestVisual); + XSync (display, False); + + return oc; +} + +void juce_updateOpenGLWindowPos (void* context, Component* owner, Component* topComp) +{ + jassert (context != 0); + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + XMoveResizeWindow (display, oc->embeddedWindow, + owner->getScreenX() - topComp->getScreenX(), + owner->getScreenY() - topComp->getScreenY(), + jmax (1, owner->getWidth()), + jmax (1, owner->getHeight())); +} + +void juce_deleteOpenGLContext (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + { + glXDestroyContext (display, oc->renderContext); + + XUnmapWindow (display, oc->embeddedWindow); + XDestroyWindow (display, oc->embeddedWindow); + + delete oc; + } +} + +bool juce_makeOpenGLContextCurrent (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + return glXMakeCurrent (display, oc->embeddedWindow, oc->renderContext) + && XSync (display, False); + else + return glXMakeCurrent (display, None, 0); +} + +void juce_swapOpenGLBuffers (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + glXSwapBuffers (display, oc->embeddedWindow); +} + +void juce_repaintOpenGLWindow (void* context) +{ +} + +#endif + + +//============================================================================== +static void initClipboard (Window root, Atom* cutBuffers) +{ + static bool init = false; + + if (! init) + { + init = true; + + // Make sure all cut buffers exist before use + for (int i = 0; i < 8; i++) + { + XChangeProperty (display, root, cutBuffers[i], + XA_STRING, 8, PropModeAppend, NULL, 0); + } + } +} + +// Clipboard implemented currently using cut buffers +// rather than the more powerful selection method +void SystemClipboard::copyTextToClipboard (const String& clipText) +{ + Window root = RootWindow (display, DefaultScreen (display)); + Atom cutBuffers[8] = { XA_CUT_BUFFER0, XA_CUT_BUFFER1, XA_CUT_BUFFER2, XA_CUT_BUFFER3, + XA_CUT_BUFFER4, XA_CUT_BUFFER5, XA_CUT_BUFFER6, XA_CUT_BUFFER7 }; + + initClipboard (root, cutBuffers); + + XRotateWindowProperties (display, root, cutBuffers, 8, 1); + XChangeProperty (display, root, cutBuffers[0], + XA_STRING, 8, PropModeReplace, (const unsigned char*)((const char*)clipText), + clipText.length()); +} + +const String SystemClipboard::getTextFromClipboard() +{ + char* clipData; + const int bufSize = 64; // in words + int actualFormat; + int byteOffset = 0; + unsigned long bytesLeft, nitems; + Atom actualType; + String returnData; + + Window root = RootWindow (display, DefaultScreen (display)); + + Atom cutBuffers[8] = { XA_CUT_BUFFER0, XA_CUT_BUFFER1, XA_CUT_BUFFER2, XA_CUT_BUFFER3, + XA_CUT_BUFFER4, XA_CUT_BUFFER5, XA_CUT_BUFFER6, XA_CUT_BUFFER7 }; + + initClipboard (root, cutBuffers); + + do + { + if (XGetWindowProperty (display, root, cutBuffers[0], byteOffset >> 2, bufSize, + False, XA_STRING, &actualType, &actualFormat, &nitems, &bytesLeft, + (unsigned char**) &clipData) != Success + || actualType != XA_STRING + || actualFormat != 8) + return String(); + + byteOffset += nitems; + returnData += String(clipData, nitems); + XFree (clipData); + } + while (bytesLeft); + + return returnData; +} + +//============================================================================== +bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMoveFiles) +{ + jassertfalse // not implemented! + return false; +} + +bool DragAndDropContainer::performExternalDragDropOfText (const String& text) +{ + jassertfalse // not implemented! + return false; +} + +//============================================================================== +void SystemTrayIconComponent::setIconImage (const Image& newImage) +{ + if (! isOnDesktop ()) + addToDesktop (0); + + LinuxComponentPeer* const wp = dynamic_cast (getPeer()); + + if (wp != 0) + { + wp->setTaskBarIcon (newImage); + + setVisible (true); + toFront (false); + repaint(); + } +} + +void SystemTrayIconComponent::paint (Graphics& g) +{ + LinuxComponentPeer* const wp = dynamic_cast (getPeer()); + + if (wp != 0) + { + const Image* const image = wp->getTaskbarIcon(); + + if (image != 0) + g.drawImageAt (image, 0, 0, false); + } +} + +void SystemTrayIconComponent::setIconTooltip (const String& tooltip) +{ + // xxx not yet implemented! +} + + +//============================================================================== +void PlatformUtilities::beep() +{ + fprintf (stdout, "\a"); + fflush (stdout); +} + + +//============================================================================== +bool AlertWindow::showNativeDialogBox (const String& title, + const String& bodyText, + bool isOkCancel) +{ + // xxx this is supposed to pop up an alert! + Logger::outputDebugString (title + ": " + bodyText); + + // use a non-native one for the time being.. + if (isOkCancel) + return AlertWindow::showOkCancelBox (AlertWindow::NoIcon, title, bodyText); + else + AlertWindow::showMessageBox (AlertWindow::NoIcon, title, bodyText); + + return true; +} + +//============================================================================== +const int KeyPress::spaceKey = XK_space & 0xff; +const int KeyPress::returnKey = XK_Return & 0xff; +const int KeyPress::escapeKey = XK_Escape & 0xff; +const int KeyPress::backspaceKey = XK_BackSpace & 0xff; +const int KeyPress::leftKey = (XK_Left & 0xff) | extendedKeyModifier; +const int KeyPress::rightKey = (XK_Right & 0xff) | extendedKeyModifier; +const int KeyPress::upKey = (XK_Up & 0xff) | extendedKeyModifier; +const int KeyPress::downKey = (XK_Down & 0xff) | extendedKeyModifier; +const int KeyPress::pageUpKey = (XK_Page_Up & 0xff) | extendedKeyModifier; +const int KeyPress::pageDownKey = (XK_Page_Down & 0xff) | extendedKeyModifier; +const int KeyPress::endKey = (XK_End & 0xff) | extendedKeyModifier; +const int KeyPress::homeKey = (XK_Home & 0xff) | extendedKeyModifier; +const int KeyPress::insertKey = (XK_Insert & 0xff) | extendedKeyModifier; +const int KeyPress::deleteKey = (XK_Delete & 0xff) | extendedKeyModifier; +const int KeyPress::tabKey = XK_Tab & 0xff; +const int KeyPress::F1Key = (XK_F1 & 0xff) | extendedKeyModifier; +const int KeyPress::F2Key = (XK_F2 & 0xff) | extendedKeyModifier; +const int KeyPress::F3Key = (XK_F3 & 0xff) | extendedKeyModifier; +const int KeyPress::F4Key = (XK_F4 & 0xff) | extendedKeyModifier; +const int KeyPress::F5Key = (XK_F5 & 0xff) | extendedKeyModifier; +const int KeyPress::F6Key = (XK_F6 & 0xff) | extendedKeyModifier; +const int KeyPress::F7Key = (XK_F7 & 0xff) | extendedKeyModifier; +const int KeyPress::F8Key = (XK_F8 & 0xff) | extendedKeyModifier; +const int KeyPress::F9Key = (XK_F9 & 0xff) | extendedKeyModifier; +const int KeyPress::F10Key = (XK_F10 & 0xff) | extendedKeyModifier; +const int KeyPress::F11Key = (XK_F11 & 0xff) | extendedKeyModifier; +const int KeyPress::F12Key = (XK_F12 & 0xff) | extendedKeyModifier; +const int KeyPress::F13Key = (XK_F13 & 0xff) | extendedKeyModifier; +const int KeyPress::F14Key = (XK_F14 & 0xff) | extendedKeyModifier; +const int KeyPress::F15Key = (XK_F15 & 0xff) | extendedKeyModifier; +const int KeyPress::F16Key = (XK_F16 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad0 = (XK_KP_0 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad1 = (XK_KP_1 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad2 = (XK_KP_2 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad3 = (XK_KP_3 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad4 = (XK_KP_4 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad5 = (XK_KP_5 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad6 = (XK_KP_6 & 0xff) | extendedKeyModifier; +const int KeyPress::numberPad7 = (XK_KP_7 & 0xff)| extendedKeyModifier; +const int KeyPress::numberPad8 = (XK_KP_8 & 0xff)| extendedKeyModifier; +const int KeyPress::numberPad9 = (XK_KP_9 & 0xff)| extendedKeyModifier; +const int KeyPress::numberPadAdd = (XK_KP_Add & 0xff)| extendedKeyModifier; +const int KeyPress::numberPadSubtract = (XK_KP_Subtract & 0xff)| extendedKeyModifier; +const int KeyPress::numberPadMultiply = (XK_KP_Multiply & 0xff)| extendedKeyModifier; +const int KeyPress::numberPadDivide = (XK_KP_Divide & 0xff)| extendedKeyModifier; +const int KeyPress::numberPadSeparator = (XK_KP_Separator & 0xff)| extendedKeyModifier; +const int KeyPress::numberPadDecimalPoint = (XK_KP_Decimal & 0xff)| extendedKeyModifier; +const int KeyPress::playKey = (0xffeeff00) | extendedKeyModifier; +const int KeyPress::stopKey = (0xffeeff01) | extendedKeyModifier; +const int KeyPress::fastForwardKey = (0xffeeff02) | extendedKeyModifier; +const int KeyPress::rewindKey = (0xffeeff03) | extendedKeyModifier; + + +END_JUCE_NAMESPACE + +#endif diff --git a/build/linux/platform_specific_code/linuxincludes.h b/build/linux/platform_specific_code/linuxincludes.h new file mode 100644 index 0000000000..49af7ad8bc --- /dev/null +++ b/build/linux/platform_specific_code/linuxincludes.h @@ -0,0 +1,54 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __LINUXINCLUDES_JUCEHEADER__ +#define __LINUXINCLUDES_JUCEHEADER__ + +// Linux Header Files: +#include +#include +#include +#include +#include +#include + +#include "../../../juce_Config.h" + +/* Remove this macro if you're having problems compiling the cpu affinity + calls (the API for these has changed about quite a bit in various Linux + versions, and a lot of distros seem to ship with obsolete versions) +*/ +#ifndef SUPPORT_AFFINITIES + #define SUPPORT_AFFINITIES 1 +#endif + + +#endif // __LINUXINCLUDES_JUCEHEADER__ diff --git a/build/linux/runpremake b/build/linux/runpremake new file mode 100644 index 0000000000..04e5ad3ea3 --- /dev/null +++ b/build/linux/runpremake @@ -0,0 +1 @@ +premake --file juce_premake.lua --cc gcc --target gnu \ No newline at end of file diff --git a/build/macosx/Juce.xcodeproj/project.pbxproj b/build/macosx/Juce.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..934d44e058 --- /dev/null +++ b/build/macosx/Juce.xcodeproj/project.pbxproj @@ -0,0 +1,3187 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 84052DE408D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84052DE208D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.cpp */; }; + 84052DE508D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84052DE308D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.h */; }; + 8406C44609642CE100C99145 /* juce_LowLevelGraphicsContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 8406C44309642CE100C99145 /* juce_LowLevelGraphicsContext.h */; }; + 8406C44709642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8406C44409642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.cpp */; settings = {COMPILER_FLAGS = "-O3"; }; }; + 8406C44809642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8406C44509642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.h */; }; + 8407908F09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8407908D09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.cpp */; }; + 8407909009E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8407908E09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.h */; }; + 84099C9F0AE52BD000B2A05D /* juce_Sampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84099C9B0AE52BD000B2A05D /* juce_Sampler.cpp */; }; + 84099CA00AE52BD000B2A05D /* juce_Sampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 84099C9C0AE52BD000B2A05D /* juce_Sampler.h */; }; + 84099CA10AE52BD000B2A05D /* juce_Synthesiser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84099C9D0AE52BD000B2A05D /* juce_Synthesiser.cpp */; }; + 84099CA20AE52BD000B2A05D /* juce_Synthesiser.h in Headers */ = {isa = PBXBuildFile; fileRef = 84099C9E0AE52BD000B2A05D /* juce_Synthesiser.h */; }; + 840F80BC092B399D005E7B4E /* juce.h in Headers */ = {isa = PBXBuildFile; fileRef = 840F80BB092B399D005E7B4E /* juce.h */; }; + 8417EE530A6E7A280058E04E /* juce_TableHeaderComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8417EE4F0A6E7A270058E04E /* juce_TableHeaderComponent.cpp */; }; + 8417EE540A6E7A280058E04E /* juce_TableHeaderComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 8417EE500A6E7A270058E04E /* juce_TableHeaderComponent.h */; }; + 8417EE550A6E7A280058E04E /* juce_TableListBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8417EE510A6E7A280058E04E /* juce_TableListBox.cpp */; }; + 8417EE560A6E7A280058E04E /* juce_TableListBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 8417EE520A6E7A280058E04E /* juce_TableListBox.h */; }; + 8417EE590A6E7A370058E04E /* juce_StretchableObjectResizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8417EE570A6E7A370058E04E /* juce_StretchableObjectResizer.cpp */; }; + 8417EE5A0A6E7A370058E04E /* juce_StretchableObjectResizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8417EE580A6E7A370058E04E /* juce_StretchableObjectResizer.h */; }; + 84198B10096D8E2B0022A439 /* juce_AudioDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84198B0A096D8E2B0022A439 /* juce_AudioDeviceManager.cpp */; }; + 84198B11096D8E2B0022A439 /* juce_AudioDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84198B0B096D8E2B0022A439 /* juce_AudioDeviceManager.h */; }; + 84198B12096D8E2B0022A439 /* juce_AudioIODevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 84198B0C096D8E2B0022A439 /* juce_AudioIODevice.h */; }; + 84198B13096D8E2B0022A439 /* juce_MidiInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 84198B0D096D8E2B0022A439 /* juce_MidiInput.h */; }; + 84198B14096D8E2B0022A439 /* juce_MidiOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = 84198B0E096D8E2B0022A439 /* juce_MidiOutput.h */; }; + 84198BB5096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84198BB3096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.cpp */; }; + 84198BB6096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84198BB4096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.h */; }; + 841E06350AF8CE74005E6FCC /* juce_AudioDataConverters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E062F0AF8CE74005E6FCC /* juce_AudioDataConverters.cpp */; }; + 841E06360AF8CE75005E6FCC /* juce_AudioDataConverters.h in Headers */ = {isa = PBXBuildFile; fileRef = 841E06300AF8CE74005E6FCC /* juce_AudioDataConverters.h */; }; + 841E06370AF8CE75005E6FCC /* juce_AudioSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E06310AF8CE74005E6FCC /* juce_AudioSampleBuffer.cpp */; }; + 841E06380AF8CE75005E6FCC /* juce_AudioSampleBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 841E06320AF8CE74005E6FCC /* juce_AudioSampleBuffer.h */; }; + 841E06390AF8CE75005E6FCC /* juce_IIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E06330AF8CE74005E6FCC /* juce_IIRFilter.cpp */; }; + 841E063A0AF8CE75005E6FCC /* juce_IIRFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 841E06340AF8CE74005E6FCC /* juce_IIRFilter.h */; }; + 842B63BA09D8508F00255DC7 /* juce_FlacAudioFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842B63B609D8508F00255DC7 /* juce_FlacAudioFormat.cpp */; }; + 842B63BB09D8508F00255DC7 /* juce_FlacAudioFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 842B63B709D8508F00255DC7 /* juce_FlacAudioFormat.h */; }; + 842B63BC09D8508F00255DC7 /* juce_OggVorbisAudioFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842B63B809D8508F00255DC7 /* juce_OggVorbisAudioFormat.cpp */; }; + 842B63BD09D8508F00255DC7 /* juce_OggVorbisAudioFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 842B63B909D8508F00255DC7 /* juce_OggVorbisAudioFormat.h */; }; + 842D3D0E0C0D7CF200E9FFE4 /* juce_MenuBarModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842D3D0D0C0D7CF200E9FFE4 /* juce_MenuBarModel.cpp */; }; + 842F9D630A19C9AF00B1358D /* juce_ButtonPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9D570A19C9AF00B1358D /* juce_ButtonPropertyComponent.cpp */; }; + 842F9D640A19C9AF00B1358D /* juce_ButtonPropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9D580A19C9AF00B1358D /* juce_ButtonPropertyComponent.h */; }; + 842F9D650A19C9AF00B1358D /* juce_ChoicePropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9D590A19C9AF00B1358D /* juce_ChoicePropertyComponent.cpp */; }; + 842F9D660A19C9AF00B1358D /* juce_ChoicePropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9D5A0A19C9AF00B1358D /* juce_ChoicePropertyComponent.h */; }; + 842F9D670A19C9AF00B1358D /* juce_PropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9D5B0A19C9AF00B1358D /* juce_PropertyComponent.cpp */; }; + 842F9D680A19C9AF00B1358D /* juce_PropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9D5C0A19C9AF00B1358D /* juce_PropertyComponent.h */; }; + 842F9D690A19C9AF00B1358D /* juce_PropertyPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9D5D0A19C9AF00B1358D /* juce_PropertyPanel.cpp */; }; + 842F9D6A0A19C9AF00B1358D /* juce_PropertyPanel.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9D5E0A19C9AF00B1358D /* juce_PropertyPanel.h */; }; + 842F9D6B0A19C9AF00B1358D /* juce_SliderPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9D5F0A19C9AF00B1358D /* juce_SliderPropertyComponent.cpp */; }; + 842F9D6C0A19C9AF00B1358D /* juce_SliderPropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9D600A19C9AF00B1358D /* juce_SliderPropertyComponent.h */; }; + 842F9D6D0A19C9AF00B1358D /* juce_TextPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9D610A19C9AF00B1358D /* juce_TextPropertyComponent.cpp */; }; + 842F9D6E0A19C9AF00B1358D /* juce_TextPropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9D620A19C9AF00B1358D /* juce_TextPropertyComponent.h */; }; + 842F9DE20A19D2AF00B1358D /* juce_PositionedRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842F9DE00A19D2AF00B1358D /* juce_PositionedRectangle.cpp */; }; + 842F9DE30A19D2AF00B1358D /* juce_PositionedRectangle.h in Headers */ = {isa = PBXBuildFile; fileRef = 842F9DE10A19D2AF00B1358D /* juce_PositionedRectangle.h */; }; + 8440CD3E0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8440CD3C0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp */; }; + 8440CD3F0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 8440CD3D0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h */; }; + 8440CD620ACD112E0086FFD7 /* juce_SliderListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 8440CD610ACD112E0086FFD7 /* juce_SliderListener.h */; }; + 846034DE09CB374E00E255CF /* juce_InterprocessConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846034DA09CB374E00E255CF /* juce_InterprocessConnection.cpp */; }; + 846034DF09CB374E00E255CF /* juce_InterprocessConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 846034DB09CB374E00E255CF /* juce_InterprocessConnection.h */; }; + 846034E009CB374E00E255CF /* juce_InterprocessConnectionServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846034DC09CB374E00E255CF /* juce_InterprocessConnectionServer.cpp */; }; + 846034E109CB374E00E255CF /* juce_InterprocessConnectionServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 846034DD09CB374E00E255CF /* juce_InterprocessConnectionServer.h */; }; + 8463D5C1098BD2DD00F9AEC2 /* juce_MidiBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5B5098BD2DD00F9AEC2 /* juce_MidiBuffer.cpp */; }; + 8463D5C2098BD2DD00F9AEC2 /* juce_MidiBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5B6098BD2DD00F9AEC2 /* juce_MidiBuffer.h */; }; + 8463D5C3098BD2DD00F9AEC2 /* juce_MidiFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5B7098BD2DD00F9AEC2 /* juce_MidiFile.cpp */; }; + 8463D5C4098BD2DD00F9AEC2 /* juce_MidiFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5B8098BD2DD00F9AEC2 /* juce_MidiFile.h */; }; + 8463D5C5098BD2DD00F9AEC2 /* juce_MidiKeyboardState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5B9098BD2DD00F9AEC2 /* juce_MidiKeyboardState.cpp */; }; + 8463D5C6098BD2DD00F9AEC2 /* juce_MidiKeyboardState.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5BA098BD2DD00F9AEC2 /* juce_MidiKeyboardState.h */; }; + 8463D5C7098BD2DD00F9AEC2 /* juce_MidiMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5BB098BD2DD00F9AEC2 /* juce_MidiMessage.cpp */; }; + 8463D5C8098BD2DD00F9AEC2 /* juce_MidiMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5BC098BD2DD00F9AEC2 /* juce_MidiMessage.h */; }; + 8463D5C9098BD2DD00F9AEC2 /* juce_MidiMessageCollector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5BD098BD2DD00F9AEC2 /* juce_MidiMessageCollector.cpp */; }; + 8463D5CA098BD2DD00F9AEC2 /* juce_MidiMessageCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5BE098BD2DD00F9AEC2 /* juce_MidiMessageCollector.h */; }; + 8463D5CB098BD2DD00F9AEC2 /* juce_MidiMessageSequence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5BF098BD2DD00F9AEC2 /* juce_MidiMessageSequence.cpp */; }; + 8463D5CC098BD2DD00F9AEC2 /* juce_MidiMessageSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5C0098BD2DD00F9AEC2 /* juce_MidiMessageSequence.h */; }; + 8463D5D0098BD30600F9AEC2 /* juce_TopLevelWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8463D5CE098BD30600F9AEC2 /* juce_TopLevelWindow.cpp */; }; + 8463D5D1098BD30600F9AEC2 /* juce_TopLevelWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 8463D5CF098BD30600F9AEC2 /* juce_TopLevelWindow.h */; }; + 84677C7B0917A9BA0086D5D9 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C700917A9B90086D5D9 /* adler32.c */; }; + 84677C7C0917A9BA0086D5D9 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C710917A9B90086D5D9 /* compress.c */; }; + 84677C7D0917A9BA0086D5D9 /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C720917A9B90086D5D9 /* crc32.c */; }; + 84677C7E0917A9BA0086D5D9 /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C730917A9B90086D5D9 /* deflate.c */; }; + 84677C7F0917A9BA0086D5D9 /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C740917A9B90086D5D9 /* infback.c */; }; + 84677C800917A9BA0086D5D9 /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C750917A9B90086D5D9 /* inffast.c */; }; + 84677C810917A9BA0086D5D9 /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C760917A9B90086D5D9 /* inflate.c */; }; + 84677C820917A9BA0086D5D9 /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C770917A9B90086D5D9 /* inftrees.c */; }; + 84677C830917A9BA0086D5D9 /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C780917A9B90086D5D9 /* trees.c */; }; + 84677C840917A9BA0086D5D9 /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C790917A9B90086D5D9 /* uncompr.c */; }; + 84677C850917A9BA0086D5D9 /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C7A0917A9B90086D5D9 /* zutil.c */; }; + 84677C880917A9DB0086D5D9 /* zconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677C860917A9DB0086D5D9 /* zconf.h */; }; + 84677C890917A9DB0086D5D9 /* zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677C870917A9DB0086D5D9 /* zlib.h */; }; + 84677C9E0917AA440086D5D9 /* png.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C8A0917AA440086D5D9 /* png.c */; }; + 84677C9F0917AA440086D5D9 /* png.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677C8B0917AA440086D5D9 /* png.h */; }; + 84677CA00917AA440086D5D9 /* pngconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677C8C0917AA440086D5D9 /* pngconf.h */; }; + 84677CA10917AA440086D5D9 /* pngerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C8D0917AA440086D5D9 /* pngerror.c */; }; + 84677CA30917AA440086D5D9 /* pngget.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C8F0917AA440086D5D9 /* pngget.c */; }; + 84677CA40917AA440086D5D9 /* pngmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C900917AA440086D5D9 /* pngmem.c */; }; + 84677CA50917AA440086D5D9 /* pngpread.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C910917AA440086D5D9 /* pngpread.c */; }; + 84677CA60917AA440086D5D9 /* pngread.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C920917AA440086D5D9 /* pngread.c */; }; + 84677CA70917AA440086D5D9 /* pngrio.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C930917AA440086D5D9 /* pngrio.c */; }; + 84677CA80917AA440086D5D9 /* pngrtran.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C940917AA440086D5D9 /* pngrtran.c */; }; + 84677CA90917AA440086D5D9 /* pngrutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C950917AA440086D5D9 /* pngrutil.c */; }; + 84677CAA0917AA440086D5D9 /* pngset.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C960917AA440086D5D9 /* pngset.c */; }; + 84677CAC0917AA440086D5D9 /* pngtrans.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C980917AA440086D5D9 /* pngtrans.c */; }; + 84677CAE0917AA440086D5D9 /* pngwio.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C9A0917AA440086D5D9 /* pngwio.c */; }; + 84677CAF0917AA440086D5D9 /* pngwrite.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C9B0917AA440086D5D9 /* pngwrite.c */; }; + 84677CB00917AA440086D5D9 /* pngwtran.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C9C0917AA440086D5D9 /* pngwtran.c */; }; + 84677CB10917AA440086D5D9 /* pngwutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677C9D0917AA440086D5D9 /* pngwutil.c */; }; + 84677CEB0917AB5F0086D5D9 /* jcapimin.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CB70917AB5E0086D5D9 /* jcapimin.c */; }; + 84677CEC0917AB5F0086D5D9 /* jcapistd.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CB80917AB5E0086D5D9 /* jcapistd.c */; }; + 84677CED0917AB5F0086D5D9 /* jccoefct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CB90917AB5E0086D5D9 /* jccoefct.c */; }; + 84677CEE0917AB5F0086D5D9 /* jccolor.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CBA0917AB5E0086D5D9 /* jccolor.c */; }; + 84677CEF0917AB5F0086D5D9 /* jcdctmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CBB0917AB5E0086D5D9 /* jcdctmgr.c */; }; + 84677CF00917AB5F0086D5D9 /* jchuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CBC0917AB5E0086D5D9 /* jchuff.c */; }; + 84677CF10917AB5F0086D5D9 /* jcinit.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CBD0917AB5E0086D5D9 /* jcinit.c */; }; + 84677CF20917AB5F0086D5D9 /* jcmainct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CBE0917AB5E0086D5D9 /* jcmainct.c */; }; + 84677CF30917AB5F0086D5D9 /* jcmarker.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CBF0917AB5E0086D5D9 /* jcmarker.c */; }; + 84677CF40917AB5F0086D5D9 /* jcmaster.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC00917AB5E0086D5D9 /* jcmaster.c */; }; + 84677CF50917AB5F0086D5D9 /* jcomapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC10917AB5E0086D5D9 /* jcomapi.c */; }; + 84677CF60917AB5F0086D5D9 /* jcparam.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC20917AB5E0086D5D9 /* jcparam.c */; }; + 84677CF70917AB5F0086D5D9 /* jcphuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC30917AB5E0086D5D9 /* jcphuff.c */; }; + 84677CF80917AB5F0086D5D9 /* jcprepct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC40917AB5E0086D5D9 /* jcprepct.c */; }; + 84677CF90917AB5F0086D5D9 /* jcsample.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC50917AB5E0086D5D9 /* jcsample.c */; }; + 84677CFA0917AB5F0086D5D9 /* jctrans.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC60917AB5E0086D5D9 /* jctrans.c */; }; + 84677CFB0917AB5F0086D5D9 /* jdapimin.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC70917AB5E0086D5D9 /* jdapimin.c */; }; + 84677CFC0917AB5F0086D5D9 /* jdapistd.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC80917AB5E0086D5D9 /* jdapistd.c */; }; + 84677CFD0917AB5F0086D5D9 /* jdatasrc.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CC90917AB5E0086D5D9 /* jdatasrc.c */; }; + 84677CFE0917AB5F0086D5D9 /* jdcoefct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CCA0917AB5E0086D5D9 /* jdcoefct.c */; }; + 84677CFF0917AB5F0086D5D9 /* jdcolor.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CCB0917AB5E0086D5D9 /* jdcolor.c */; }; + 84677D000917AB5F0086D5D9 /* jddctmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CCC0917AB5F0086D5D9 /* jddctmgr.c */; }; + 84677D010917AB5F0086D5D9 /* jdhuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CCD0917AB5F0086D5D9 /* jdhuff.c */; }; + 84677D020917AB5F0086D5D9 /* jdinput.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CCE0917AB5F0086D5D9 /* jdinput.c */; }; + 84677D030917AB5F0086D5D9 /* jdmainct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CCF0917AB5F0086D5D9 /* jdmainct.c */; }; + 84677D040917AB5F0086D5D9 /* jdmarker.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD00917AB5F0086D5D9 /* jdmarker.c */; }; + 84677D050917AB5F0086D5D9 /* jdmaster.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD10917AB5F0086D5D9 /* jdmaster.c */; }; + 84677D060917AB5F0086D5D9 /* jdmerge.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD20917AB5F0086D5D9 /* jdmerge.c */; }; + 84677D070917AB5F0086D5D9 /* jdphuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD30917AB5F0086D5D9 /* jdphuff.c */; }; + 84677D080917AB5F0086D5D9 /* jdpostct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD40917AB5F0086D5D9 /* jdpostct.c */; }; + 84677D090917AB5F0086D5D9 /* jdsample.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD50917AB5F0086D5D9 /* jdsample.c */; }; + 84677D0A0917AB5F0086D5D9 /* jdtrans.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD60917AB5F0086D5D9 /* jdtrans.c */; }; + 84677D0B0917AB5F0086D5D9 /* jerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD70917AB5F0086D5D9 /* jerror.c */; }; + 84677D0C0917AB5F0086D5D9 /* jfdctflt.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD80917AB5F0086D5D9 /* jfdctflt.c */; }; + 84677D0D0917AB5F0086D5D9 /* jfdctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CD90917AB5F0086D5D9 /* jfdctfst.c */; }; + 84677D0E0917AB5F0086D5D9 /* jfdctint.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CDA0917AB5F0086D5D9 /* jfdctint.c */; }; + 84677D0F0917AB5F0086D5D9 /* jidctflt.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CDB0917AB5F0086D5D9 /* jidctflt.c */; }; + 84677D100917AB5F0086D5D9 /* jidctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CDC0917AB5F0086D5D9 /* jidctfst.c */; }; + 84677D110917AB5F0086D5D9 /* jidctint.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CDD0917AB5F0086D5D9 /* jidctint.c */; }; + 84677D120917AB5F0086D5D9 /* jidctred.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CDE0917AB5F0086D5D9 /* jidctred.c */; }; + 84677D130917AB5F0086D5D9 /* jinclude.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677CDF0917AB5F0086D5D9 /* jinclude.h */; }; + 84677D140917AB5F0086D5D9 /* jmemmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CE00917AB5F0086D5D9 /* jmemmgr.c */; }; + 84677D150917AB5F0086D5D9 /* jmemnobs.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CE10917AB5F0086D5D9 /* jmemnobs.c */; }; + 84677D180917AB5F0086D5D9 /* jpeglib.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677CE40917AB5F0086D5D9 /* jpeglib.h */; }; + 84677D190917AB5F0086D5D9 /* jquant1.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CE50917AB5F0086D5D9 /* jquant1.c */; }; + 84677D1A0917AB5F0086D5D9 /* jquant2.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CE60917AB5F0086D5D9 /* jquant2.c */; }; + 84677D1B0917AB5F0086D5D9 /* jutils.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CE70917AB5F0086D5D9 /* jutils.c */; }; + 84677D1C0917AB5F0086D5D9 /* jversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677CE80917AB5F0086D5D9 /* jversion.h */; }; + 84677D1D0917AB5F0086D5D9 /* transupp.c in Sources */ = {isa = PBXBuildFile; fileRef = 84677CE90917AB5F0086D5D9 /* transupp.c */; }; + 84677D1E0917AB5F0086D5D9 /* transupp.h in Headers */ = {isa = PBXBuildFile; fileRef = 84677CEA0917AB5F0086D5D9 /* transupp.h */; }; + 846927DA0A49ABD300314975 /* juce_CharacterFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846927D80A49ABD300314975 /* juce_CharacterFunctions.cpp */; }; + 846927DB0A49ABD300314975 /* juce_CharacterFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 846927D90A49ABD300314975 /* juce_CharacterFunctions.h */; }; + 846927DE0A49ABE600314975 /* juce_RectanglePlacement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846927DC0A49ABE600314975 /* juce_RectanglePlacement.cpp */; }; + 846927DF0A49ABE600314975 /* juce_RectanglePlacement.h in Headers */ = {isa = PBXBuildFile; fileRef = 846927DD0A49ABE600314975 /* juce_RectanglePlacement.h */; }; + 846927E10A49ABFD00314975 /* juce_SVGParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846927E00A49ABFD00314975 /* juce_SVGParser.cpp */; }; + 84A06BAD09CAD6A3006A43BD /* juce_AudioIODevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A06BAA09CAD6A3006A43BD /* juce_AudioIODevice.cpp */; }; + 84A06BAE09CAD6A3006A43BD /* juce_AudioIODeviceType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A06BAB09CAD6A3006A43BD /* juce_AudioIODeviceType.cpp */; }; + 84A06BAF09CAD6A3006A43BD /* juce_AudioIODeviceType.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A06BAC09CAD6A3006A43BD /* juce_AudioIODeviceType.h */; }; + 84A06BE309CADB06006A43BD /* juce_mac_NamedPipe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A06BE209CADB06006A43BD /* juce_mac_NamedPipe.cpp */; }; + 84A4882908A22E2400752A2B /* juce_mac_CoreAudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4881E08A22E2400752A2B /* juce_mac_CoreAudio.cpp */; }; + 84A4882A08A22E2400752A2B /* juce_mac_CoreMidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4881F08A22E2400752A2B /* juce_mac_CoreMidi.cpp */; }; + 84A4882B08A22E2400752A2B /* juce_mac_FileChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882008A22E2400752A2B /* juce_mac_FileChooser.cpp */; }; + 84A4882C08A22E2400752A2B /* juce_mac_Files.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882108A22E2400752A2B /* juce_mac_Files.cpp */; }; + 84A4882D08A22E2400752A2B /* juce_mac_Fonts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882208A22E2400752A2B /* juce_mac_Fonts.cpp */; }; + 84A4882E08A22E2400752A2B /* juce_mac_Messaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882308A22E2400752A2B /* juce_mac_Messaging.cpp */; }; + 84A4882F08A22E2400752A2B /* juce_mac_Network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882408A22E2400752A2B /* juce_mac_Network.cpp */; }; + 84A4883008A22E2400752A2B /* juce_mac_SystemStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882508A22E2400752A2B /* juce_mac_SystemStats.cpp */; }; + 84A4883108A22E2400752A2B /* juce_mac_Threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882608A22E2400752A2B /* juce_mac_Threads.cpp */; }; + 84A4883208A22E2400752A2B /* juce_mac_Windowing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4882708A22E2400752A2B /* juce_mac_Windowing.cpp */; }; + 84A48A2808A22E4B00752A2B /* juce_Application.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4883508A22E4900752A2B /* juce_Application.cpp */; }; + 84A48A2908A22E4B00752A2B /* juce_Application.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4883608A22E4900752A2B /* juce_Application.h */; }; + 84A48A2A08A22E4B00752A2B /* juce_DeletedAtShutdown.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4883708A22E4900752A2B /* juce_DeletedAtShutdown.cpp */; }; + 84A48A2B08A22E4B00752A2B /* juce_DeletedAtShutdown.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4883808A22E4900752A2B /* juce_DeletedAtShutdown.h */; }; + 84A48A2D08A22E4B00752A2B /* juce_SystemClipboard.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4883A08A22E4900752A2B /* juce_SystemClipboard.h */; }; + 84A48A2E08A22E4B00752A2B /* juce_AiffAudioFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4883D08A22E4900752A2B /* juce_AiffAudioFormat.cpp */; }; + 84A48A2F08A22E4B00752A2B /* juce_AiffAudioFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4883E08A22E4900752A2B /* juce_AiffAudioFormat.h */; }; + 84A48A3008A22E4B00752A2B /* juce_AudioCDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4883F08A22E4900752A2B /* juce_AudioCDReader.cpp */; }; + 84A48A3108A22E4B00752A2B /* juce_AudioCDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884008A22E4900752A2B /* juce_AudioCDReader.h */; }; + 84A48A3208A22E4B00752A2B /* juce_AudioFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4884108A22E4900752A2B /* juce_AudioFormat.cpp */; }; + 84A48A3308A22E4B00752A2B /* juce_AudioFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884208A22E4900752A2B /* juce_AudioFormat.h */; }; + 84A48A3408A22E4B00752A2B /* juce_AudioFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884308A22E4900752A2B /* juce_AudioFormatReader.h */; }; + 84A48A3508A22E4B00752A2B /* juce_AudioFormatWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884408A22E4900752A2B /* juce_AudioFormatWriter.h */; }; + 84A48A3608A22E4B00752A2B /* juce_AudioSubsectionReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4884508A22E4900752A2B /* juce_AudioSubsectionReader.cpp */; }; + 84A48A3708A22E4B00752A2B /* juce_AudioSubsectionReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884608A22E4900752A2B /* juce_AudioSubsectionReader.h */; }; + 84A48A3808A22E4B00752A2B /* juce_WavAudioFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4884708A22E4900752A2B /* juce_WavAudioFormat.cpp */; }; + 84A48A3908A22E4B00752A2B /* juce_WavAudioFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884808A22E4900752A2B /* juce_WavAudioFormat.h */; }; + 84A48A3A08A22E4B00752A2B /* juce_AudioFormatReaderSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4884A08A22E4900752A2B /* juce_AudioFormatReaderSource.cpp */; }; + 84A48A3B08A22E4B00752A2B /* juce_AudioFormatReaderSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884B08A22E4900752A2B /* juce_AudioFormatReaderSource.h */; }; + 84A48A3C08A22E4B00752A2B /* juce_AudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884C08A22E4900752A2B /* juce_AudioSource.h */; }; + 84A48A3D08A22E4B00752A2B /* juce_AudioSourcePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4884D08A22E4900752A2B /* juce_AudioSourcePlayer.cpp */; }; + 84A48A3E08A22E4B00752A2B /* juce_AudioSourcePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4884E08A22E4900752A2B /* juce_AudioSourcePlayer.h */; }; + 84A48A3F08A22E4B00752A2B /* juce_AudioTransportSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4884F08A22E4900752A2B /* juce_AudioTransportSource.cpp */; }; + 84A48A4008A22E4B00752A2B /* juce_AudioTransportSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4885008A22E4900752A2B /* juce_AudioTransportSource.h */; }; + 84A48A4108A22E4B00752A2B /* juce_BufferingAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4885108A22E4900752A2B /* juce_BufferingAudioSource.cpp */; }; + 84A48A4208A22E4B00752A2B /* juce_BufferingAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4885208A22E4900752A2B /* juce_BufferingAudioSource.h */; }; + 84A48A4308A22E4B00752A2B /* juce_MixerAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4885308A22E4900752A2B /* juce_MixerAudioSource.cpp */; }; + 84A48A4408A22E4B00752A2B /* juce_MixerAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4885408A22E4900752A2B /* juce_MixerAudioSource.h */; }; + 84A48A4508A22E4B00752A2B /* juce_PositionableAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4885508A22E4900752A2B /* juce_PositionableAudioSource.h */; }; + 84A48A4608A22E4B00752A2B /* juce_ResamplingAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4885608A22E4900752A2B /* juce_ResamplingAudioSource.cpp */; }; + 84A48A4708A22E4B00752A2B /* juce_ResamplingAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4885708A22E4900752A2B /* juce_ResamplingAudioSource.h */; }; + 84A48A5408A22E4B00752A2B /* juce_ActionBroadcaster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4886508A22E4900752A2B /* juce_ActionBroadcaster.cpp */; }; + 84A48A5508A22E4B00752A2B /* juce_ActionBroadcaster.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4886608A22E4900752A2B /* juce_ActionBroadcaster.h */; }; + 84A48A5608A22E4B00752A2B /* juce_ActionListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4886708A22E4900752A2B /* juce_ActionListener.h */; }; + 84A48A5708A22E4B00752A2B /* juce_ActionListenerList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4886808A22E4900752A2B /* juce_ActionListenerList.cpp */; }; + 84A48A5808A22E4B00752A2B /* juce_ActionListenerList.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4886908A22E4900752A2B /* juce_ActionListenerList.h */; }; + 84A48A5908A22E4B00752A2B /* juce_AsyncUpdater.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4886A08A22E4900752A2B /* juce_AsyncUpdater.cpp */; }; + 84A48A5A08A22E4B00752A2B /* juce_AsyncUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4886B08A22E4900752A2B /* juce_AsyncUpdater.h */; }; + 84A48A5B08A22E4B00752A2B /* juce_ChangeBroadcaster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4886C08A22E4900752A2B /* juce_ChangeBroadcaster.cpp */; }; + 84A48A5C08A22E4B00752A2B /* juce_ChangeBroadcaster.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4886D08A22E4900752A2B /* juce_ChangeBroadcaster.h */; }; + 84A48A5D08A22E4B00752A2B /* juce_ChangeListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4886E08A22E4900752A2B /* juce_ChangeListener.h */; }; + 84A48A5E08A22E4B00752A2B /* juce_ChangeListenerList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4886F08A22E4900752A2B /* juce_ChangeListenerList.cpp */; }; + 84A48A5F08A22E4B00752A2B /* juce_ChangeListenerList.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887008A22E4900752A2B /* juce_ChangeListenerList.h */; }; + 84A48A6008A22E4B00752A2B /* juce_Message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4887108A22E4900752A2B /* juce_Message.cpp */; }; + 84A48A6108A22E4B00752A2B /* juce_Message.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887208A22E4900752A2B /* juce_Message.h */; }; + 84A48A6208A22E4B00752A2B /* juce_MessageListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4887308A22E4900752A2B /* juce_MessageListener.cpp */; }; + 84A48A6308A22E4B00752A2B /* juce_MessageListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887408A22E4900752A2B /* juce_MessageListener.h */; }; + 84A48A6408A22E4B00752A2B /* juce_MessageManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4887508A22E4900752A2B /* juce_MessageManager.cpp */; }; + 84A48A6508A22E4B00752A2B /* juce_MessageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887608A22E4900752A2B /* juce_MessageManager.h */; }; + 84A48A6608A22E4B00752A2B /* juce_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4887708A22E4900752A2B /* juce_Timer.cpp */; }; + 84A48A6708A22E4B00752A2B /* juce_Timer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887808A22E4900752A2B /* juce_Timer.h */; }; + 84A48A6808A22E4B00752A2B /* juce_ArrowButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4887C08A22E4900752A2B /* juce_ArrowButton.cpp */; }; + 84A48A6908A22E4B00752A2B /* juce_ArrowButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887D08A22E4900752A2B /* juce_ArrowButton.h */; }; + 84A48A6A08A22E4B00752A2B /* juce_Button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4887E08A22E4900752A2B /* juce_Button.cpp */; }; + 84A48A6B08A22E4B00752A2B /* juce_Button.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4887F08A22E4900752A2B /* juce_Button.h */; }; + 84A48A6C08A22E4B00752A2B /* juce_DrawableButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888008A22E4900752A2B /* juce_DrawableButton.cpp */; }; + 84A48A6D08A22E4B00752A2B /* juce_DrawableButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888108A22E4900752A2B /* juce_DrawableButton.h */; }; + 84A48A6E08A22E4B00752A2B /* juce_HyperlinkButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888208A22E4900752A2B /* juce_HyperlinkButton.cpp */; }; + 84A48A6F08A22E4B00752A2B /* juce_HyperlinkButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888308A22E4900752A2B /* juce_HyperlinkButton.h */; }; + 84A48A7008A22E4B00752A2B /* juce_ImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888408A22E4900752A2B /* juce_ImageButton.cpp */; }; + 84A48A7108A22E4B00752A2B /* juce_ImageButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888508A22E4900752A2B /* juce_ImageButton.h */; }; + 84A48A7208A22E4B00752A2B /* juce_ShapeButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888608A22E4900752A2B /* juce_ShapeButton.cpp */; }; + 84A48A7308A22E4B00752A2B /* juce_ShapeButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888708A22E4900752A2B /* juce_ShapeButton.h */; }; + 84A48A7408A22E4B00752A2B /* juce_TextButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888808A22E4900752A2B /* juce_TextButton.cpp */; }; + 84A48A7508A22E4B00752A2B /* juce_TextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888908A22E4900752A2B /* juce_TextButton.h */; }; + 84A48A7608A22E4B00752A2B /* juce_ToggleButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888A08A22E4900752A2B /* juce_ToggleButton.cpp */; }; + 84A48A7708A22E4B00752A2B /* juce_ToggleButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888B08A22E4900752A2B /* juce_ToggleButton.h */; }; + 84A48A7808A22E4B00752A2B /* juce_ComboBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4888D08A22E4900752A2B /* juce_ComboBox.cpp */; }; + 84A48A7908A22E4B00752A2B /* juce_ComboBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4888E08A22E4900752A2B /* juce_ComboBox.h */; }; + 84A48A7C08A22E4B00752A2B /* juce_Label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889108A22E4900752A2B /* juce_Label.cpp */; }; + 84A48A7D08A22E4B00752A2B /* juce_Label.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4889208A22E4900752A2B /* juce_Label.h */; }; + 84A48A7E08A22E4B00752A2B /* juce_ListBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889308A22E4900752A2B /* juce_ListBox.cpp */; }; + 84A48A7F08A22E4B00752A2B /* juce_ListBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4889408A22E4900752A2B /* juce_ListBox.h */; }; + 84A48A8008A22E4B00752A2B /* juce_ProgressBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889508A22E4900752A2B /* juce_ProgressBar.cpp */; }; + 84A48A8108A22E4B00752A2B /* juce_ProgressBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4889608A22E4900752A2B /* juce_ProgressBar.h */; }; + 84A48A8408A22E4B00752A2B /* juce_Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889908A22E4900752A2B /* juce_Slider.cpp */; }; + 84A48A8508A22E4B00752A2B /* juce_Slider.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4889A08A22E4900752A2B /* juce_Slider.h */; }; + 84A48A8608A22E4B00752A2B /* juce_TextEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889B08A22E4900752A2B /* juce_TextEditor.cpp */; }; + 84A48A8708A22E4B00752A2B /* juce_TextEditor.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4889C08A22E4900752A2B /* juce_TextEditor.h */; }; + 84A48A8808A22E4B00752A2B /* juce_TreeView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889D08A22E4900752A2B /* juce_TreeView.cpp */; }; + 84A48A8908A22E4B00752A2B /* juce_TreeView.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4889E08A22E4900752A2B /* juce_TreeView.h */; }; + 84A48A8A08A22E4B00752A2B /* juce_Component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4889F08A22E4900752A2B /* juce_Component.cpp */; }; + 84A48A8B08A22E4B00752A2B /* juce_Component.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488A008A22E4900752A2B /* juce_Component.h */; }; + 84A48A8C08A22E4B00752A2B /* juce_ComponentDeletionWatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488A108A22E4900752A2B /* juce_ComponentDeletionWatcher.h */; }; + 84A48A8D08A22E4B00752A2B /* juce_ComponentListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488A208A22E4900752A2B /* juce_ComponentListener.cpp */; }; + 84A48A8E08A22E4B00752A2B /* juce_ComponentListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488A308A22E4900752A2B /* juce_ComponentListener.h */; }; + 84A48A8F08A22E4B00752A2B /* juce_Desktop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488A408A22E4900752A2B /* juce_Desktop.cpp */; }; + 84A48A9008A22E4B00752A2B /* juce_Desktop.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488A508A22E4900752A2B /* juce_Desktop.h */; }; + 84A48A9108A22E4B00752A2B /* juce_KeyListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488A708A22E4900752A2B /* juce_KeyListener.cpp */; }; + 84A48A9208A22E4B00752A2B /* juce_KeyListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488A808A22E4900752A2B /* juce_KeyListener.h */; }; + 84A48A9308A22E4B00752A2B /* juce_KeyMappingEditorComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488A908A22E4900752A2B /* juce_KeyMappingEditorComponent.cpp */; }; + 84A48A9408A22E4B00752A2B /* juce_KeyMappingEditorComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488AA08A22E4900752A2B /* juce_KeyMappingEditorComponent.h */; }; + 84A48A9508A22E4B00752A2B /* juce_KeyPress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488AB08A22E4900752A2B /* juce_KeyPress.cpp */; }; + 84A48A9608A22E4B00752A2B /* juce_KeyPress.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488AC08A22E4900752A2B /* juce_KeyPress.h */; }; + 84A48A9708A22E4B00752A2B /* juce_KeyPressMappingSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488AD08A22E4900752A2B /* juce_KeyPressMappingSet.cpp */; }; + 84A48A9808A22E4B00752A2B /* juce_KeyPressMappingSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488AE08A22E4900752A2B /* juce_KeyPressMappingSet.h */; }; + 84A48A9908A22E4B00752A2B /* juce_ModifierKeys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488AF08A22E4900752A2B /* juce_ModifierKeys.cpp */; }; + 84A48A9A08A22E4B00752A2B /* juce_ModifierKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488B008A22E4900752A2B /* juce_ModifierKeys.h */; }; + 84A48A9B08A22E4B00752A2B /* juce_GroupComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488B208A22E4900752A2B /* juce_GroupComponent.cpp */; }; + 84A48A9C08A22E4B00752A2B /* juce_GroupComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488B308A22E4900752A2B /* juce_GroupComponent.h */; }; + 84A48A9E08A22E4B00752A2B /* juce_ResizableBorderComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488B508A22E4900752A2B /* juce_ResizableBorderComponent.cpp */; }; + 84A48A9F08A22E4B00752A2B /* juce_ResizableBorderComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488B608A22E4900752A2B /* juce_ResizableBorderComponent.h */; }; + 84A48AA008A22E4B00752A2B /* juce_ResizableCornerComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488B708A22E4900752A2B /* juce_ResizableCornerComponent.cpp */; }; + 84A48AA108A22E4B00752A2B /* juce_ResizableCornerComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488B808A22E4900752A2B /* juce_ResizableCornerComponent.h */; }; + 84A48AA208A22E4B00752A2B /* juce_ScrollBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488B908A22E4900752A2B /* juce_ScrollBar.cpp */; }; + 84A48AA308A22E4B00752A2B /* juce_ScrollBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488BA08A22E4900752A2B /* juce_ScrollBar.h */; }; + 84A48AA408A22E4B00752A2B /* juce_StretchableLayoutManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488BB08A22E4900752A2B /* juce_StretchableLayoutManager.cpp */; }; + 84A48AA508A22E4B00752A2B /* juce_StretchableLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488BC08A22E4900752A2B /* juce_StretchableLayoutManager.h */; }; + 84A48AA608A22E4B00752A2B /* juce_StretchableLayoutResizerBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488BD08A22E4900752A2B /* juce_StretchableLayoutResizerBar.cpp */; }; + 84A48AA708A22E4B00752A2B /* juce_StretchableLayoutResizerBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488BE08A22E4900752A2B /* juce_StretchableLayoutResizerBar.h */; }; + 84A48AA808A22E4B00752A2B /* juce_TabbedButtonBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488BF08A22E4900752A2B /* juce_TabbedButtonBar.cpp */; }; + 84A48AA908A22E4B00752A2B /* juce_TabbedButtonBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488C008A22E4900752A2B /* juce_TabbedButtonBar.h */; }; + 84A48AAA08A22E4B00752A2B /* juce_TabbedComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488C108A22E4900752A2B /* juce_TabbedComponent.cpp */; }; + 84A48AAB08A22E4B00752A2B /* juce_TabbedComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488C208A22E4900752A2B /* juce_TabbedComponent.h */; }; + 84A48AAC08A22E4B00752A2B /* juce_Viewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488C308A22E4900752A2B /* juce_Viewport.cpp */; }; + 84A48AAD08A22E4B00752A2B /* juce_Viewport.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488C408A22E4900752A2B /* juce_Viewport.h */; }; + 84A48AAE08A22E4B00752A2B /* juce_LookAndFeel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488C608A22E4900752A2B /* juce_LookAndFeel.cpp */; }; + 84A48AAF08A22E4B00752A2B /* juce_LookAndFeel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488C708A22E4900752A2B /* juce_LookAndFeel.h */; }; + 84A48AB008A22E4B00752A2B /* juce_ShinyLookAndFeel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488C808A22E4900752A2B /* juce_ShinyLookAndFeel.cpp */; }; + 84A48AB108A22E4B00752A2B /* juce_ShinyLookAndFeel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488C908A22E4900752A2B /* juce_ShinyLookAndFeel.h */; }; + 84A48AB208A22E4B00752A2B /* juce_MenuBarComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488CB08A22E4900752A2B /* juce_MenuBarComponent.cpp */; }; + 84A48AB308A22E4B00752A2B /* juce_MenuBarComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488CC08A22E4900752A2B /* juce_MenuBarComponent.h */; }; + 84A48AB408A22E4B00752A2B /* juce_MenuBarModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488CD08A22E4900752A2B /* juce_MenuBarModel.h */; }; + 84A48AB508A22E4B00752A2B /* juce_PopupMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488CE08A22E4900752A2B /* juce_PopupMenu.cpp */; }; + 84A48AB608A22E4B00752A2B /* juce_PopupMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488CF08A22E4900752A2B /* juce_PopupMenu.h */; }; + 84A48AB708A22E4B00752A2B /* juce_PopupMenuCustomComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488D008A22E4900752A2B /* juce_PopupMenuCustomComponent.h */; }; + 84A48AB808A22E4B00752A2B /* juce_ComponentDragger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488D208A22E4900752A2B /* juce_ComponentDragger.cpp */; }; + 84A48AB908A22E4B00752A2B /* juce_ComponentDragger.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488D308A22E4900752A2B /* juce_ComponentDragger.h */; }; + 84A48ABA08A22E4B00752A2B /* juce_DragAndDropContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488D408A22E4900752A2B /* juce_DragAndDropContainer.cpp */; }; + 84A48ABB08A22E4B00752A2B /* juce_DragAndDropContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488D508A22E4900752A2B /* juce_DragAndDropContainer.h */; }; + 84A48ABC08A22E4B00752A2B /* juce_DragAndDropTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488D608A22E4900752A2B /* juce_DragAndDropTarget.h */; }; + 84A48ABD08A22E4B00752A2B /* juce_MouseCursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488D708A22E4900752A2B /* juce_MouseCursor.cpp */; }; + 84A48ABE08A22E4B00752A2B /* juce_MouseCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488D808A22E4900752A2B /* juce_MouseCursor.h */; }; + 84A48ABF08A22E4B00752A2B /* juce_MouseEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488D908A22E4900752A2B /* juce_MouseEvent.cpp */; }; + 84A48AC008A22E4B00752A2B /* juce_MouseEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488DA08A22E4900752A2B /* juce_MouseEvent.h */; }; + 84A48AC108A22E4B00752A2B /* juce_MouseHoverDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488DB08A22E4900752A2B /* juce_MouseHoverDetector.cpp */; }; + 84A48AC208A22E4B00752A2B /* juce_MouseHoverDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488DC08A22E4900752A2B /* juce_MouseHoverDetector.h */; }; + 84A48AC308A22E4B00752A2B /* juce_MouseListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488DD08A22E4900752A2B /* juce_MouseListener.cpp */; }; + 84A48AC408A22E4B00752A2B /* juce_MouseListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488DE08A22E4900752A2B /* juce_MouseListener.h */; }; + 84A48AC508A22E4B00752A2B /* juce_BubbleComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488E008A22E4900752A2B /* juce_BubbleComponent.cpp */; }; + 84A48AC608A22E4B00752A2B /* juce_BubbleComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488E108A22E4900752A2B /* juce_BubbleComponent.h */; }; + 84A48AC708A22E4B00752A2B /* juce_BubbleMessageComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488E208A22E4900752A2B /* juce_BubbleMessageComponent.cpp */; }; + 84A48AC808A22E4B00752A2B /* juce_BubbleMessageComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488E308A22E4900752A2B /* juce_BubbleMessageComponent.h */; }; + 84A48AC908A22E4B00752A2B /* juce_ColourSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488E408A22E4900752A2B /* juce_ColourSelector.cpp */; }; + 84A48ACA08A22E4B00752A2B /* juce_ColourSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488E508A22E4900752A2B /* juce_ColourSelector.h */; }; + 84A48ACB08A22E4B00752A2B /* juce_DropShadower.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488E608A22E4900752A2B /* juce_DropShadower.cpp */; }; + 84A48ACC08A22E4B00752A2B /* juce_DropShadower.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488E708A22E4900752A2B /* juce_DropShadower.h */; }; + 84A48ACD08A22E4B00752A2B /* juce_OpenGLComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488E808A22E4900752A2B /* juce_OpenGLComponent.cpp */; }; + 84A48ACE08A22E4B00752A2B /* juce_OpenGLComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488E908A22E4900752A2B /* juce_OpenGLComponent.h */; }; + 84A48ACF08A22E4B00752A2B /* juce_PreferencesPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488EA08A22E4900752A2B /* juce_PreferencesPanel.cpp */; }; + 84A48AD008A22E4B00752A2B /* juce_PreferencesPanel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488EB08A22E4900752A2B /* juce_PreferencesPanel.h */; }; + 84A48AD108A22E4B00752A2B /* juce_QuickTimeMovieComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488EC08A22E4900752A2B /* juce_QuickTimeMovieComponent.cpp */; }; + 84A48AD208A22E4B00752A2B /* juce_QuickTimeMovieComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488ED08A22E4900752A2B /* juce_QuickTimeMovieComponent.h */; }; + 84A48AD308A22E4B00752A2B /* juce_AlertWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488EF08A22E4900752A2B /* juce_AlertWindow.cpp */; }; + 84A48AD408A22E4B00752A2B /* juce_AlertWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488F008A22E4900752A2B /* juce_AlertWindow.h */; }; + 84A48AD508A22E4B00752A2B /* juce_DialogWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488F108A22E4900752A2B /* juce_DialogWindow.cpp */; }; + 84A48AD608A22E4B00752A2B /* juce_DialogWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488F208A22E4900752A2B /* juce_DialogWindow.h */; }; + 84A48ADB08A22E4B00752A2B /* juce_ResizableWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488F708A22E4900752A2B /* juce_ResizableWindow.cpp */; }; + 84A48ADC08A22E4B00752A2B /* juce_ResizableWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488F808A22E4900752A2B /* juce_ResizableWindow.h */; }; + 84A48ADD08A22E4B00752A2B /* juce_SplashScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488F908A22E4900752A2B /* juce_SplashScreen.cpp */; }; + 84A48ADE08A22E4B00752A2B /* juce_SplashScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488FA08A22E4900752A2B /* juce_SplashScreen.h */; }; + 84A48ADF08A22E4B00752A2B /* juce_ThreadWithProgressWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488FB08A22E4900752A2B /* juce_ThreadWithProgressWindow.cpp */; }; + 84A48AE008A22E4B00752A2B /* juce_ThreadWithProgressWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488FC08A22E4900752A2B /* juce_ThreadWithProgressWindow.h */; }; + 84A48AE108A22E4B00752A2B /* juce_TooltipWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A488FD08A22E4900752A2B /* juce_TooltipWindow.cpp */; }; + 84A48AE208A22E4B00752A2B /* juce_TooltipWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A488FE08A22E4900752A2B /* juce_TooltipWindow.h */; }; + 84A48AE308A22E4B00752A2B /* juce_Brush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890108A22E4900752A2B /* juce_Brush.cpp */; }; + 84A48AE408A22E4B00752A2B /* juce_Brush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890208A22E4900752A2B /* juce_Brush.h */; }; + 84A48AE508A22E4B00752A2B /* juce_GradientBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890308A22E4900752A2B /* juce_GradientBrush.cpp */; }; + 84A48AE608A22E4B00752A2B /* juce_GradientBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890408A22E4900752A2B /* juce_GradientBrush.h */; }; + 84A48AE708A22E4B00752A2B /* juce_ImageBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890508A22E4900752A2B /* juce_ImageBrush.cpp */; }; + 84A48AE808A22E4B00752A2B /* juce_ImageBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890608A22E4900752A2B /* juce_ImageBrush.h */; }; + 84A48AE908A22E4B00752A2B /* juce_SolidColourBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890708A22E4900752A2B /* juce_SolidColourBrush.cpp */; }; + 84A48AEA08A22E4B00752A2B /* juce_SolidColourBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890808A22E4900752A2B /* juce_SolidColourBrush.h */; }; + 84A48AEB08A22E4B00752A2B /* juce_Colour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890A08A22E4900752A2B /* juce_Colour.cpp */; }; + 84A48AEC08A22E4B00752A2B /* juce_Colour.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890B08A22E4900752A2B /* juce_Colour.h */; }; + 84A48AED08A22E4B00752A2B /* juce_ColourGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890C08A22E4900752A2B /* juce_ColourGradient.cpp */; }; + 84A48AEE08A22E4B00752A2B /* juce_ColourGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890D08A22E4900752A2B /* juce_ColourGradient.h */; }; + 84A48AEF08A22E4B00752A2B /* juce_Colours.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4890E08A22E4900752A2B /* juce_Colours.cpp */; }; + 84A48AF008A22E4B00752A2B /* juce_Colours.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4890F08A22E4900752A2B /* juce_Colours.h */; }; + 84A48AF108A22E4B00752A2B /* juce_PixelFormats.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891008A22E4900752A2B /* juce_PixelFormats.h */; }; + 84A48AF208A22E4B00752A2B /* juce_EdgeTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891208A22E4900752A2B /* juce_EdgeTable.cpp */; }; + 84A48AF308A22E4B00752A2B /* juce_EdgeTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891308A22E4900752A2B /* juce_EdgeTable.h */; }; + 84A48AF408A22E4B00752A2B /* juce_Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891408A22E4900752A2B /* juce_Graphics.cpp */; }; + 84A48AF508A22E4B00752A2B /* juce_Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891508A22E4900752A2B /* juce_Graphics.h */; }; + 84A48AF608A22E4B00752A2B /* juce_Justification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891608A22E4900752A2B /* juce_Justification.cpp */; }; + 84A48AF708A22E4B00752A2B /* juce_Justification.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891708A22E4900752A2B /* juce_Justification.h */; }; + 84A48AF808A22E4B00752A2B /* juce_Drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891908A22E4900752A2B /* juce_Drawable.cpp */; }; + 84A48AF908A22E4B00752A2B /* juce_Drawable.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891A08A22E4900752A2B /* juce_Drawable.h */; }; + 84A48AFA08A22E4B00752A2B /* juce_DrawableComposite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891B08A22E4A00752A2B /* juce_DrawableComposite.cpp */; }; + 84A48AFB08A22E4B00752A2B /* juce_DrawableComposite.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891C08A22E4A00752A2B /* juce_DrawableComposite.h */; }; + 84A48AFC08A22E4B00752A2B /* juce_DrawableImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891D08A22E4A00752A2B /* juce_DrawableImage.cpp */; }; + 84A48AFD08A22E4B00752A2B /* juce_DrawableImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4891E08A22E4A00752A2B /* juce_DrawableImage.h */; }; + 84A48AFE08A22E4B00752A2B /* juce_DrawablePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4891F08A22E4A00752A2B /* juce_DrawablePath.cpp */; }; + 84A48AFF08A22E4B00752A2B /* juce_DrawablePath.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892008A22E4A00752A2B /* juce_DrawablePath.h */; }; + 84A48B0008A22E4B00752A2B /* juce_DrawableText.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4892108A22E4A00752A2B /* juce_DrawableText.cpp */; }; + 84A48B0108A22E4B00752A2B /* juce_DrawableText.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892208A22E4A00752A2B /* juce_DrawableText.h */; }; + 84A48B0208A22E4B00752A2B /* juce_DropShadowEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4892408A22E4A00752A2B /* juce_DropShadowEffect.cpp */; }; + 84A48B0308A22E4B00752A2B /* juce_DropShadowEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892508A22E4A00752A2B /* juce_DropShadowEffect.h */; }; + 84A48B0408A22E4B00752A2B /* juce_GlowEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4892608A22E4A00752A2B /* juce_GlowEffect.cpp */; }; + 84A48B0508A22E4B00752A2B /* juce_GlowEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892708A22E4A00752A2B /* juce_GlowEffect.h */; }; + 84A48B0608A22E4B00752A2B /* juce_ImageEffectFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892808A22E4A00752A2B /* juce_ImageEffectFilter.h */; }; + 84A48B0708A22E4B00752A2B /* juce_ReduceOpacityEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4892908A22E4A00752A2B /* juce_ReduceOpacityEffect.cpp */; }; + 84A48B0808A22E4B00752A2B /* juce_ReduceOpacityEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892A08A22E4A00752A2B /* juce_ReduceOpacityEffect.h */; }; + 84A48B0908A22E4B00752A2B /* juce_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4892C08A22E4A00752A2B /* juce_Font.cpp */; }; + 84A48B0A08A22E4B00752A2B /* juce_Font.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892D08A22E4A00752A2B /* juce_Font.h */; }; + 84A48B0B08A22E4B00752A2B /* juce_GlyphArrangement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4892E08A22E4A00752A2B /* juce_GlyphArrangement.cpp */; }; + 84A48B0C08A22E4B00752A2B /* juce_GlyphArrangement.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4892F08A22E4A00752A2B /* juce_GlyphArrangement.h */; }; + 84A48B0D08A22E4B00752A2B /* juce_TextLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893008A22E4A00752A2B /* juce_TextLayout.cpp */; }; + 84A48B0E08A22E4B00752A2B /* juce_TextLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893108A22E4A00752A2B /* juce_TextLayout.h */; }; + 84A48B0F08A22E4B00752A2B /* juce_Typeface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893208A22E4A00752A2B /* juce_Typeface.cpp */; }; + 84A48B1008A22E4B00752A2B /* juce_Typeface.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893308A22E4A00752A2B /* juce_Typeface.h */; }; + 84A48B1108A22E4B00752A2B /* juce_AffineTransform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893508A22E4A00752A2B /* juce_AffineTransform.cpp */; }; + 84A48B1208A22E4B00752A2B /* juce_AffineTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893608A22E4A00752A2B /* juce_AffineTransform.h */; }; + 84A48B1308A22E4B00752A2B /* juce_Line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893708A22E4A00752A2B /* juce_Line.cpp */; }; + 84A48B1408A22E4B00752A2B /* juce_Line.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893808A22E4A00752A2B /* juce_Line.h */; }; + 84A48B1508A22E4B00752A2B /* juce_Path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893908A22E4A00752A2B /* juce_Path.cpp */; }; + 84A48B1608A22E4B00752A2B /* juce_Path.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893A08A22E4A00752A2B /* juce_Path.h */; }; + 84A48B1708A22E4B00752A2B /* juce_PathIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893B08A22E4A00752A2B /* juce_PathIterator.cpp */; }; + 84A48B1808A22E4B00752A2B /* juce_PathIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893C08A22E4A00752A2B /* juce_PathIterator.h */; }; + 84A48B1908A22E4B00752A2B /* juce_PathStrokeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893D08A22E4A00752A2B /* juce_PathStrokeType.cpp */; }; + 84A48B1A08A22E4B00752A2B /* juce_PathStrokeType.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4893E08A22E4A00752A2B /* juce_PathStrokeType.h */; }; + 84A48B1B08A22E4B00752A2B /* juce_Point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4893F08A22E4A00752A2B /* juce_Point.cpp */; }; + 84A48B1C08A22E4B00752A2B /* juce_Point.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4894008A22E4A00752A2B /* juce_Point.h */; }; + 84A48B1D08A22E4B00752A2B /* juce_Rectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4894108A22E4A00752A2B /* juce_Rectangle.cpp */; }; + 84A48B1E08A22E4B00752A2B /* juce_Rectangle.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4894208A22E4A00752A2B /* juce_Rectangle.h */; }; + 84A48B1F08A22E4B00752A2B /* juce_RectangleList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4894308A22E4A00752A2B /* juce_RectangleList.cpp */; }; + 84A48B2008A22E4B00752A2B /* juce_RectangleList.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4894408A22E4A00752A2B /* juce_RectangleList.h */; }; + 84A48B4908A22E4B00752A2B /* juce_GIFLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4897208A22E4A00752A2B /* juce_GIFLoader.cpp */; }; + 84A48B4A08A22E4B00752A2B /* juce_GIFLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4897308A22E4A00752A2B /* juce_GIFLoader.h */; }; + 84A48B4B08A22E4B00752A2B /* juce_JPEGLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4897408A22E4A00752A2B /* juce_JPEGLoader.cpp */; }; + 84A48B4C08A22E4B00752A2B /* juce_PNGLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4897508A22E4A00752A2B /* juce_PNGLoader.cpp */; }; + 84A48B5A08A22E4B00752A2B /* juce_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4898608A22E4A00752A2B /* juce_Image.cpp */; }; + 84A48B5B08A22E4B00752A2B /* juce_Image.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4898708A22E4A00752A2B /* juce_Image.h */; }; + 84A48B5C08A22E4B00752A2B /* juce_ImageCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4898808A22E4A00752A2B /* juce_ImageCache.cpp */; }; + 84A48B5D08A22E4B00752A2B /* juce_ImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4898908A22E4A00752A2B /* juce_ImageCache.h */; }; + 84A48B5E08A22E4B00752A2B /* juce_ImageConvolutionKernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4898A08A22E4A00752A2B /* juce_ImageConvolutionKernel.cpp */; }; + 84A48B5F08A22E4B00752A2B /* juce_ImageConvolutionKernel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4898B08A22E4A00752A2B /* juce_ImageConvolutionKernel.h */; }; + 84A48B6008A22E4B00752A2B /* juce_ImageFileFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4898C08A22E4A00752A2B /* juce_ImageFileFormat.cpp */; }; + 84A48B6108A22E4B00752A2B /* juce_ImageFileFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4898D08A22E4A00752A2B /* juce_ImageFileFormat.h */; }; + 84A48B6A08A22E4B00752A2B /* juce_Atomic.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4899908A22E4A00752A2B /* juce_Atomic.h */; }; + 84A48B6B08A22E4B00752A2B /* juce_DataConversions.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4899A08A22E4A00752A2B /* juce_DataConversions.h */; }; + 84A48B6C08A22E4B00752A2B /* juce_FileLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4899B08A22E4A00752A2B /* juce_FileLogger.cpp */; }; + 84A48B6D08A22E4B00752A2B /* juce_FileLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4899C08A22E4A00752A2B /* juce_FileLogger.h */; }; + 84A48B6E08A22E4B00752A2B /* juce_Initialisation.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4899D08A22E4A00752A2B /* juce_Initialisation.h */; }; + 84A48B6F08A22E4B00752A2B /* juce_Logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A4899E08A22E4A00752A2B /* juce_Logger.cpp */; }; + 84A48B7008A22E4B00752A2B /* juce_Logger.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A4899F08A22E4A00752A2B /* juce_Logger.h */; }; + 84A48B7108A22E4B00752A2B /* juce_MathsFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A008A22E4A00752A2B /* juce_MathsFunctions.h */; }; + 84A48B7208A22E4B00752A2B /* juce_Memory.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A108A22E4A00752A2B /* juce_Memory.h */; }; + 84A48B7308A22E4B00752A2B /* juce_PlatformDefs.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A208A22E4A00752A2B /* juce_PlatformDefs.h */; }; + 84A48B7408A22E4B00752A2B /* juce_Random.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489A308A22E4A00752A2B /* juce_Random.cpp */; }; + 84A48B7508A22E4B00752A2B /* juce_Random.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A408A22E4A00752A2B /* juce_Random.h */; }; + 84A48B7608A22E4B00752A2B /* juce_RelativeTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489A508A22E4A00752A2B /* juce_RelativeTime.cpp */; }; + 84A48B7708A22E4B00752A2B /* juce_RelativeTime.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A608A22E4A00752A2B /* juce_RelativeTime.h */; }; + 84A48B7808A22E4B00752A2B /* juce_Singleton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A708A22E4A00752A2B /* juce_Singleton.h */; }; + 84A48B7908A22E4B00752A2B /* juce_StandardHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489A808A22E4A00752A2B /* juce_StandardHeader.h */; }; + 84A48B7A08A22E4B00752A2B /* juce_SystemStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489A908A22E4A00752A2B /* juce_SystemStats.cpp */; }; + 84A48B7B08A22E4B00752A2B /* juce_SystemStats.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489AA08A22E4A00752A2B /* juce_SystemStats.h */; }; + 84A48B7C08A22E4B00752A2B /* juce_Time.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489AB08A22E4A00752A2B /* juce_Time.cpp */; }; + 84A48B7D08A22E4B00752A2B /* juce_Time.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489AC08A22E4A00752A2B /* juce_Time.h */; }; + 84A48B7E08A22E4B00752A2B /* juce_Array.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489AE08A22E4A00752A2B /* juce_Array.h */; }; + 84A48B7F08A22E4B00752A2B /* juce_ArrayAllocationBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489AF08A22E4A00752A2B /* juce_ArrayAllocationBase.h */; }; + 84A48B8008A22E4B00752A2B /* juce_BitArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489B008A22E4A00752A2B /* juce_BitArray.cpp */; }; + 84A48B8108A22E4B00752A2B /* juce_BitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B108A22E4A00752A2B /* juce_BitArray.h */; }; + 84A48B8208A22E4B00752A2B /* juce_ElementComparator.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B208A22E4A00752A2B /* juce_ElementComparator.h */; }; + 84A48B8308A22E4B00752A2B /* juce_MemoryBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489B308A22E4A00752A2B /* juce_MemoryBlock.cpp */; }; + 84A48B8408A22E4B00752A2B /* juce_MemoryBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B408A22E4A00752A2B /* juce_MemoryBlock.h */; }; + 84A48B8508A22E4B00752A2B /* juce_OwnedArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B508A22E4A00752A2B /* juce_OwnedArray.h */; }; + 84A48B8608A22E4B00752A2B /* juce_PropertySet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489B608A22E4A00752A2B /* juce_PropertySet.cpp */; }; + 84A48B8708A22E4B00752A2B /* juce_PropertySet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B708A22E4A00752A2B /* juce_PropertySet.h */; }; + 84A48B8808A22E4B00752A2B /* juce_ReferenceCountedArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B808A22E4A00752A2B /* juce_ReferenceCountedArray.h */; }; + 84A48B8908A22E4B00752A2B /* juce_ReferenceCountedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489B908A22E4A00752A2B /* juce_ReferenceCountedObject.h */; }; + 84A48B8A08A22E4B00752A2B /* juce_SortedSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489BA08A22E4A00752A2B /* juce_SortedSet.h */; }; + 84A48B8B08A22E4B00752A2B /* juce_SparseSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489BB08A22E4A00752A2B /* juce_SparseSet.h */; }; + 84A48B8C08A22E4B00752A2B /* juce_VoidArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489BC08A22E4A00752A2B /* juce_VoidArray.h */; }; + 84A48B8D08A22E4B00752A2B /* juce_BlowFish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489BE08A22E4A00752A2B /* juce_BlowFish.cpp */; }; + 84A48B8E08A22E4B00752A2B /* juce_BlowFish.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489BF08A22E4A00752A2B /* juce_BlowFish.h */; }; + 84A48B8F08A22E4B00752A2B /* juce_MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489C008A22E4A00752A2B /* juce_MD5.cpp */; }; + 84A48B9008A22E4B00752A2B /* juce_MD5.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489C108A22E4A00752A2B /* juce_MD5.h */; }; + 84A48B9108A22E4B00752A2B /* juce_Primes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489C208A22E4A00752A2B /* juce_Primes.cpp */; }; + 84A48B9208A22E4B00752A2B /* juce_Primes.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489C308A22E4A00752A2B /* juce_Primes.h */; }; + 84A48B9308A22E4B00752A2B /* juce_RSAKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489C408A22E4A00752A2B /* juce_RSAKey.cpp */; }; + 84A48B9408A22E4B00752A2B /* juce_RSAKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489C508A22E4A00752A2B /* juce_RSAKey.h */; }; + 84A48B9508A22E4B00752A2B /* juce_DirectoryIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489C808A22E4A00752A2B /* juce_DirectoryIterator.cpp */; }; + 84A48B9608A22E4B00752A2B /* juce_DirectoryIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489C908A22E4A00752A2B /* juce_DirectoryIterator.h */; }; + 84A48B9708A22E4B00752A2B /* juce_File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489CA08A22E4A00752A2B /* juce_File.cpp */; }; + 84A48B9808A22E4B00752A2B /* juce_File.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489CB08A22E4A00752A2B /* juce_File.h */; }; + 84A48B9908A22E4B00752A2B /* juce_FileInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489CC08A22E4A00752A2B /* juce_FileInputStream.cpp */; }; + 84A48B9A08A22E4B00752A2B /* juce_FileInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489CD08A22E4A00752A2B /* juce_FileInputStream.h */; }; + 84A48B9B08A22E4B00752A2B /* juce_FileOutputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489CE08A22E4A00752A2B /* juce_FileOutputStream.cpp */; }; + 84A48B9C08A22E4B00752A2B /* juce_FileOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489CF08A22E4A00752A2B /* juce_FileOutputStream.h */; }; + 84A48B9D08A22E4B00752A2B /* juce_FileSearchPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489D008A22E4A00752A2B /* juce_FileSearchPath.cpp */; }; + 84A48B9E08A22E4B00752A2B /* juce_FileSearchPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489D108A22E4A00752A2B /* juce_FileSearchPath.h */; }; + 84A48B9F08A22E4B00752A2B /* juce_InputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489D208A22E4A00752A2B /* juce_InputStream.cpp */; }; + 84A48BA008A22E4B00752A2B /* juce_InputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489D308A22E4A00752A2B /* juce_InputStream.h */; }; + 84A48BA108A22E4B00752A2B /* juce_OutputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489D408A22E4A00752A2B /* juce_OutputStream.cpp */; }; + 84A48BA208A22E4B00752A2B /* juce_OutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489D508A22E4A00752A2B /* juce_OutputStream.h */; }; + 84A48BA308A22E4B00752A2B /* juce_URL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489D708A22E4A00752A2B /* juce_URL.cpp */; }; + 84A48BA408A22E4B00752A2B /* juce_URL.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489D808A22E4A00752A2B /* juce_URL.h */; }; + 84A48BA508A22E4B00752A2B /* juce_BufferedInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489DA08A22E4A00752A2B /* juce_BufferedInputStream.cpp */; }; + 84A48BA608A22E4B00752A2B /* juce_BufferedInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489DB08A22E4A00752A2B /* juce_BufferedInputStream.h */; }; + 84A48BA708A22E4B00752A2B /* juce_GZIPCompressorOutputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489DC08A22E4A00752A2B /* juce_GZIPCompressorOutputStream.cpp */; }; + 84A48BA808A22E4B00752A2B /* juce_GZIPCompressorOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489DD08A22E4A00752A2B /* juce_GZIPCompressorOutputStream.h */; }; + 84A48BA908A22E4B00752A2B /* juce_GZIPDecompressorInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489DE08A22E4A00752A2B /* juce_GZIPDecompressorInputStream.cpp */; }; + 84A48BAA08A22E4B00752A2B /* juce_GZIPDecompressorInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489DF08A22E4A00752A2B /* juce_GZIPDecompressorInputStream.h */; }; + 84A48BAB08A22E4B00752A2B /* juce_MemoryInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489E008A22E4A00752A2B /* juce_MemoryInputStream.cpp */; }; + 84A48BAC08A22E4B00752A2B /* juce_MemoryInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489E108A22E4A00752A2B /* juce_MemoryInputStream.h */; }; + 84A48BAD08A22E4B00752A2B /* juce_MemoryOutputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489E208A22E4A00752A2B /* juce_MemoryOutputStream.cpp */; }; + 84A48BAE08A22E4B00752A2B /* juce_MemoryOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489E308A22E4A00752A2B /* juce_MemoryOutputStream.h */; }; + 84A48BAF08A22E4B00752A2B /* juce_SubregionStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A489E408A22E4A00752A2B /* juce_SubregionStream.cpp */; }; + 84A48BB008A22E4B00752A2B /* juce_SubregionStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A489E508A22E4A00752A2B /* juce_SubregionStream.h */; }; + 84A48BC808A22E4B00752A2B /* juce_PerformanceCounter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0008A22E4A00752A2B /* juce_PerformanceCounter.cpp */; }; + 84A48BC908A22E4B00752A2B /* juce_PerformanceCounter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0108A22E4A00752A2B /* juce_PerformanceCounter.h */; }; + 84A48BCA08A22E4B00752A2B /* juce_PlatformUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0208A22E4A00752A2B /* juce_PlatformUtilities.h */; }; + 84A48BCB08A22E4B00752A2B /* juce_Uuid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0308A22E4A00752A2B /* juce_Uuid.cpp */; }; + 84A48BCC08A22E4B00752A2B /* juce_Uuid.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0408A22E4A00752A2B /* juce_Uuid.h */; }; + 84A48BCD08A22E4B00752A2B /* juce_ZipFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0508A22E4A00752A2B /* juce_ZipFile.cpp */; }; + 84A48BCE08A22E4B00752A2B /* juce_ZipFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0608A22E4A00752A2B /* juce_ZipFile.h */; }; + 84A48BCF08A22E4B00752A2B /* juce_LocalisedStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0808A22E4A00752A2B /* juce_LocalisedStrings.cpp */; }; + 84A48BD008A22E4B00752A2B /* juce_LocalisedStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0908A22E4A00752A2B /* juce_LocalisedStrings.h */; }; + 84A48BD108A22E4B00752A2B /* juce_String.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0A08A22E4A00752A2B /* juce_String.cpp */; }; + 84A48BD208A22E4B00752A2B /* juce_String.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0B08A22E4A00752A2B /* juce_String.h */; }; + 84A48BD308A22E4B00752A2B /* juce_StringArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0C08A22E4A00752A2B /* juce_StringArray.cpp */; }; + 84A48BD408A22E4B00752A2B /* juce_StringArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0D08A22E4A00752A2B /* juce_StringArray.h */; }; + 84A48BD508A22E4B00752A2B /* juce_StringPairArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A0E08A22E4A00752A2B /* juce_StringPairArray.cpp */; }; + 84A48BD608A22E4B00752A2B /* juce_StringPairArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A0F08A22E4A00752A2B /* juce_StringPairArray.h */; }; + 84A48BD808A22E4B00752A2B /* juce_XmlDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A1108A22E4A00752A2B /* juce_XmlDocument.cpp */; }; + 84A48BD908A22E4B00752A2B /* juce_XmlDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1208A22E4A00752A2B /* juce_XmlDocument.h */; }; + 84A48BDA08A22E4B00752A2B /* juce_XmlElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A1308A22E4A00752A2B /* juce_XmlElement.cpp */; }; + 84A48BDB08A22E4B00752A2B /* juce_XmlElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1408A22E4A00752A2B /* juce_XmlElement.h */; }; + 84A48BDD08A22E4B00752A2B /* juce_CriticalSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1708A22E4A00752A2B /* juce_CriticalSection.h */; }; + 84A48BDE08A22E4B00752A2B /* juce_InterProcessLock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A1808A22E4A00752A2B /* juce_InterProcessLock.cpp */; }; + 84A48BDF08A22E4B00752A2B /* juce_InterProcessLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1908A22E4A00752A2B /* juce_InterProcessLock.h */; }; + 84A48BE108A22E4B00752A2B /* juce_Process.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1B08A22E4A00752A2B /* juce_Process.h */; }; + 84A48BE208A22E4B00752A2B /* juce_ReadWriteLock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A1C08A22E4A00752A2B /* juce_ReadWriteLock.cpp */; }; + 84A48BE308A22E4B00752A2B /* juce_ReadWriteLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1D08A22E4A00752A2B /* juce_ReadWriteLock.h */; }; + 84A48BE408A22E4B00752A2B /* juce_ScopedLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1E08A22E4A00752A2B /* juce_ScopedLock.h */; }; + 84A48BE508A22E4B00752A2B /* juce_ScopedReadLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A1F08A22E4A00752A2B /* juce_ScopedReadLock.h */; }; + 84A48BE608A22E4B00752A2B /* juce_ScopedWriteLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A2008A22E4A00752A2B /* juce_ScopedWriteLock.h */; }; + 84A48BE708A22E4B00752A2B /* juce_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A2108A22E4A00752A2B /* juce_Thread.cpp */; }; + 84A48BE808A22E4B00752A2B /* juce_Thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A2208A22E4A00752A2B /* juce_Thread.h */; }; + 84A48BE908A22E4B00752A2B /* juce_ThreadPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A2308A22E4A00752A2B /* juce_ThreadPool.cpp */; }; + 84A48BEA08A22E4B00752A2B /* juce_ThreadPool.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A2408A22E4A00752A2B /* juce_ThreadPool.h */; }; + 84A48BEB08A22E4B00752A2B /* juce_TimeSliceThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A48A2508A22E4A00752A2B /* juce_TimeSliceThread.cpp */; }; + 84A48BEC08A22E4B00752A2B /* juce_TimeSliceThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A2608A22E4A00752A2B /* juce_TimeSliceThread.h */; }; + 84A48BED08A22E4B00752A2B /* juce_WaitableEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A48A2708A22E4A00752A2B /* juce_WaitableEvent.h */; }; + 84C0EA5E0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C0EA5C0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.cpp */; }; + 84C0EA5F0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84C0EA5D0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.h */; }; + 84D296BD09B763190026C535 /* juce_PropertiesFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84D296BB09B763190026C535 /* juce_PropertiesFile.cpp */; }; + 84D296BE09B763190026C535 /* juce_PropertiesFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D296BC09B763190026C535 /* juce_PropertiesFile.h */; }; + 84E8209409729D2A0097675B /* juce_AudioFormatManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84E8209209729D2A0097675B /* juce_AudioFormatManager.cpp */; }; + 84E8209509729D2A0097675B /* juce_AudioFormatManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84E8209309729D2A0097675B /* juce_AudioFormatManager.h */; }; + 84F1B8DA09499F1400AD8EDE /* juce_MidiKeyboardComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1B8D809499F1400AD8EDE /* juce_MidiKeyboardComponent.cpp */; }; + 84F1B8DB09499F1400AD8EDE /* juce_MidiKeyboardComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1B8D909499F1400AD8EDE /* juce_MidiKeyboardComponent.h */; }; + 84F1F05D0A36CE96008CCC5E /* juce_FilenameComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1F05B0A36CE96008CCC5E /* juce_FilenameComponent.cpp */; }; + 84F1F05E0A36CE96008CCC5E /* juce_FilenameComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1F05C0A36CE96008CCC5E /* juce_FilenameComponent.h */; }; + 84F1F0610A36CF06008CCC5E /* juce_BooleanPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1F05F0A36CF06008CCC5E /* juce_BooleanPropertyComponent.cpp */; }; + 84F1F0620A36CF06008CCC5E /* juce_BooleanPropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1F0600A36CF06008CCC5E /* juce_BooleanPropertyComponent.h */; }; + 84F1F0650A36CF32008CCC5E /* juce_MagnifierComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1F0630A36CF31008CCC5E /* juce_MagnifierComponent.cpp */; }; + 84F1F0660A36CF32008CCC5E /* juce_MagnifierComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1F0640A36CF31008CCC5E /* juce_MagnifierComponent.h */; }; + 84F1F0690A36CF45008CCC5E /* juce_KeyboardFocusTraverser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1F0670A36CF45008CCC5E /* juce_KeyboardFocusTraverser.cpp */; }; + 84F1F06A0A36CF45008CCC5E /* juce_KeyboardFocusTraverser.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1F0680A36CF45008CCC5E /* juce_KeyboardFocusTraverser.h */; }; + 84F46B7E098685BD0079F3FA /* juce_ComponentBoundsConstrainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F46B7C098685BD0079F3FA /* juce_ComponentBoundsConstrainer.cpp */; }; + 84F46B7F098685BD0079F3FA /* juce_ComponentBoundsConstrainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F46B7D098685BD0079F3FA /* juce_ComponentBoundsConstrainer.h */; }; + 84F525000B32A8D500597B73 /* juce_ApplicationProperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F524FE0B32A8D500597B73 /* juce_ApplicationProperties.cpp */; }; + 84F525010B32A8D500597B73 /* juce_ApplicationProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F524FF0B32A8D500597B73 /* juce_ApplicationProperties.h */; }; + 84F5552A0A2235E100A8311C /* juce_MultiDocumentPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F555280A2235E100A8311C /* juce_MultiDocumentPanel.cpp */; }; + 84F5552B0A2235E100A8311C /* juce_MultiDocumentPanel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F555290A2235E100A8311C /* juce_MultiDocumentPanel.h */; }; + 84F5598409CACFDD00AC5000 /* juce_Socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F5598209CACFDD00AC5000 /* juce_Socket.cpp */; }; + 84F5598509CACFDD00AC5000 /* juce_Socket.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F5598309CACFDD00AC5000 /* juce_Socket.h */; }; + 84F5598809CACFF700AC5000 /* juce_NamedPipe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F5598609CACFF700AC5000 /* juce_NamedPipe.cpp */; }; + 84F5598909CACFF700AC5000 /* juce_NamedPipe.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F5598709CACFF700AC5000 /* juce_NamedPipe.h */; }; + 84F589950A01491F00B80939 /* juce_TooltipClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F589940A01491F00B80939 /* juce_TooltipClient.h */; }; + 84F5899F0A01493600B80939 /* juce_ApplicationCommandID.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F589980A01493600B80939 /* juce_ApplicationCommandID.h */; }; + 84F589A00A01493600B80939 /* juce_ApplicationCommandInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F589990A01493600B80939 /* juce_ApplicationCommandInfo.cpp */; }; + 84F589A10A01493600B80939 /* juce_ApplicationCommandInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F5899A0A01493600B80939 /* juce_ApplicationCommandInfo.h */; }; + 84F589A20A01493600B80939 /* juce_ApplicationCommandManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F5899B0A01493600B80939 /* juce_ApplicationCommandManager.cpp */; }; + 84F589A30A01493600B80939 /* juce_ApplicationCommandManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F5899C0A01493600B80939 /* juce_ApplicationCommandManager.h */; }; + 84F589A40A01493600B80939 /* juce_ApplicationCommandTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F5899D0A01493600B80939 /* juce_ApplicationCommandTarget.cpp */; }; + 84F589A50A01493600B80939 /* juce_ApplicationCommandTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F5899E0A01493600B80939 /* juce_ApplicationCommandTarget.h */; }; + 84F593AE09855679008153BA /* juce_DocumentWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F593AC09855679008153BA /* juce_DocumentWindow.cpp */; }; + 84F593AF09855679008153BA /* juce_DocumentWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F593AD09855679008153BA /* juce_DocumentWindow.h */; }; + 84F593B109855693008153BA /* juce_LassoComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F593B009855693008153BA /* juce_LassoComponent.h */; }; + 84F690EF0B3444E500ABAE1C /* bitbuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E10B3444E500ABAE1C /* bitbuffer.c */; }; + 84F690F00B3444E500ABAE1C /* bitmath.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E20B3444E500ABAE1C /* bitmath.c */; }; + 84F690F10B3444E500ABAE1C /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E30B3444E500ABAE1C /* cpu.c */; }; + 84F690F20B3444E500ABAE1C /* crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E40B3444E500ABAE1C /* crc.c */; }; + 84F690F30B3444E500ABAE1C /* fixed.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E50B3444E500ABAE1C /* fixed.c */; }; + 84F690F40B3444E500ABAE1C /* float.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E60B3444E500ABAE1C /* float.c */; }; + 84F690F50B3444E500ABAE1C /* format.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E70B3444E500ABAE1C /* format.c */; }; + 84F690F60B3444E500ABAE1C /* lpc_flac.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E80B3444E500ABAE1C /* lpc_flac.c */; }; + 84F690F70B3444E500ABAE1C /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690E90B3444E500ABAE1C /* md5.c */; }; + 84F690F80B3444E500ABAE1C /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690EA0B3444E500ABAE1C /* memory.c */; }; + 84F690F90B3444E500ABAE1C /* stream_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690EB0B3444E500ABAE1C /* stream_decoder.c */; }; + 84F690FA0B3444E500ABAE1C /* stream_encoder_framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690EC0B3444E500ABAE1C /* stream_encoder_framing.c */; }; + 84F690FB0B3444E500ABAE1C /* stream_encoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690ED0B3444E500ABAE1C /* stream_encoder.c */; }; + 84F690FC0B3444E500ABAE1C /* window_flac.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690EE0B3444E500ABAE1C /* window_flac.c */; }; + 84F690FF0B3444F800ABAE1C /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690FD0B3444F800ABAE1C /* bitwise.c */; }; + 84F691000B3444F800ABAE1C /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F690FE0B3444F800ABAE1C /* framing.c */; }; + 84F691170B34453600ABAE1C /* analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691010B34453600ABAE1C /* analysis.c */; }; + 84F691180B34453600ABAE1C /* bitrate.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691020B34453600ABAE1C /* bitrate.c */; }; + 84F691190B34453600ABAE1C /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691030B34453600ABAE1C /* block.c */; }; + 84F6911A0B34453600ABAE1C /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691040B34453600ABAE1C /* codebook.c */; }; + 84F6911B0B34453600ABAE1C /* envelope.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691050B34453600ABAE1C /* envelope.c */; }; + 84F6911C0B34453600ABAE1C /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691060B34453600ABAE1C /* floor0.c */; }; + 84F6911D0B34453600ABAE1C /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691070B34453600ABAE1C /* floor1.c */; }; + 84F6911E0B34453600ABAE1C /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691080B34453600ABAE1C /* info.c */; }; + 84F6911F0B34453600ABAE1C /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691090B34453600ABAE1C /* lpc.c */; }; + 84F691200B34453600ABAE1C /* lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F6910A0B34453600ABAE1C /* lsp.c */; }; + 84F691210B34453600ABAE1C /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F6910B0B34453600ABAE1C /* mapping0.c */; }; + 84F691220B34453600ABAE1C /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F6910C0B34453600ABAE1C /* mdct.c */; }; + 84F691230B34453600ABAE1C /* psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F6910D0B34453600ABAE1C /* psy.c */; }; + 84F691240B34453600ABAE1C /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F6910E0B34453600ABAE1C /* registry.c */; }; + 84F691250B34453600ABAE1C /* res0.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F6910F0B34453600ABAE1C /* res0.c */; }; + 84F691260B34453600ABAE1C /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691100B34453600ABAE1C /* sharedbook.c */; }; + 84F691270B34453600ABAE1C /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691110B34453600ABAE1C /* smallft.c */; }; + 84F691280B34453600ABAE1C /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691120B34453600ABAE1C /* synthesis.c */; }; + 84F6912A0B34453600ABAE1C /* vorbisenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691140B34453600ABAE1C /* vorbisenc.c */; }; + 84F6912B0B34453600ABAE1C /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691150B34453600ABAE1C /* vorbisfile.c */; }; + 84F6912C0B34453600ABAE1C /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = 84F691160B34453600ABAE1C /* window.c */; }; + 84F6B7540C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F6B7520C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.cpp */; }; + 84F6B7550C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F6B7530C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.h */; }; + 84F7A7AF0A8383A100D36246 /* juce_ToolbarButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F7A7AD0A8383A100D36246 /* juce_ToolbarButton.cpp */; }; + 84F7A7B00A8383A100D36246 /* juce_ToolbarButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7AE0A8383A100D36246 /* juce_ToolbarButton.h */; }; + 84F7A7B80A8383C200D36246 /* juce_Toolbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F7A7B10A8383C200D36246 /* juce_Toolbar.cpp */; }; + 84F7A7B90A8383C200D36246 /* juce_Toolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7B20A8383C200D36246 /* juce_Toolbar.h */; }; + 84F7A7BA0A8383C200D36246 /* juce_ToolbarItemComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F7A7B30A8383C200D36246 /* juce_ToolbarItemComponent.cpp */; }; + 84F7A7BB0A8383C200D36246 /* juce_ToolbarItemComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7B40A8383C200D36246 /* juce_ToolbarItemComponent.h */; }; + 84F7A7BC0A8383C200D36246 /* juce_ToolbarItemFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7B50A8383C200D36246 /* juce_ToolbarItemFactory.h */; }; + 84F7A7BD0A8383C200D36246 /* juce_ToolbarItemPalette.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F7A7B60A8383C200D36246 /* juce_ToolbarItemPalette.cpp */; }; + 84F7A7BE0A8383C200D36246 /* juce_ToolbarItemPalette.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7B70A8383C200D36246 /* juce_ToolbarItemPalette.h */; }; + 84F7A7C10A8383E000D36246 /* juce_MultiTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F7A7BF0A8383E000D36246 /* juce_MultiTimer.cpp */; }; + 84F7A7C20A8383E000D36246 /* juce_MultiTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7C00A8383E000D36246 /* juce_MultiTimer.h */; }; + 84F7A7EF0A838CC900D36246 /* juce_ComponentAnimator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F7A7ED0A838CC900D36246 /* juce_ComponentAnimator.cpp */; }; + 84F7A7F00A838CC900D36246 /* juce_ComponentAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F7A7EE0A838CC900D36246 /* juce_ComponentAnimator.h */; }; + 84F8DAD0099C963A00E911ED /* juce_ComponentPeer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F8DACE099C963A00E911ED /* juce_ComponentPeer.cpp */; }; + 84F8DAD1099C963A00E911ED /* juce_ComponentPeer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F8DACF099C963A00E911ED /* juce_ComponentPeer.h */; }; + 84FC318F09B749FD00B75141 /* juce_FileBasedDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC318709B749FD00B75141 /* juce_FileBasedDocument.cpp */; }; + 84FC319009B749FD00B75141 /* juce_FileBasedDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC318809B749FD00B75141 /* juce_FileBasedDocument.h */; }; + 84FC319109B749FD00B75141 /* juce_RecentlyOpenedFilesList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC318909B749FD00B75141 /* juce_RecentlyOpenedFilesList.cpp */; }; + 84FC319209B749FD00B75141 /* juce_RecentlyOpenedFilesList.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC318A09B749FD00B75141 /* juce_RecentlyOpenedFilesList.h */; }; + 84FC319309B749FD00B75141 /* juce_SelectedItemSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC318B09B749FD00B75141 /* juce_SelectedItemSet.h */; }; + 84FC319409B749FD00B75141 /* juce_UndoableAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC318C09B749FD00B75141 /* juce_UndoableAction.h */; }; + 84FC319509B749FD00B75141 /* juce_UndoManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC318D09B749FD00B75141 /* juce_UndoManager.cpp */; }; + 84FC319609B749FD00B75141 /* juce_UndoManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC318E09B749FD00B75141 /* juce_UndoManager.h */; }; + 84FC31AA09B74A5C00B75141 /* juce_DirectoryContentsList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC319809B74A5C00B75141 /* juce_DirectoryContentsList.cpp */; }; + 84FC31AB09B74A5C00B75141 /* juce_DirectoryContentsList.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC319909B74A5C00B75141 /* juce_DirectoryContentsList.h */; }; + 84FC31AC09B74A5C00B75141 /* juce_FileBrowserComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC319A09B74A5C00B75141 /* juce_FileBrowserComponent.cpp */; }; + 84FC31AD09B74A5C00B75141 /* juce_FileBrowserComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC319B09B74A5C00B75141 /* juce_FileBrowserComponent.h */; }; + 84FC31AE09B74A5C00B75141 /* juce_FileBrowserListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC319C09B74A5C00B75141 /* juce_FileBrowserListener.h */; }; + 84FC31AF09B74A5C00B75141 /* juce_FileChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC319D09B74A5C00B75141 /* juce_FileChooser.cpp */; }; + 84FC31B009B74A5C00B75141 /* juce_FileChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC319E09B74A5C00B75141 /* juce_FileChooser.h */; }; + 84FC31B109B74A5C00B75141 /* juce_FileChooserDialogBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC319F09B74A5C00B75141 /* juce_FileChooserDialogBox.cpp */; }; + 84FC31B209B74A5C00B75141 /* juce_FileChooserDialogBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31A009B74A5C00B75141 /* juce_FileChooserDialogBox.h */; }; + 84FC31B309B74A5C00B75141 /* juce_FileFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC31A109B74A5C00B75141 /* juce_FileFilter.cpp */; }; + 84FC31B409B74A5C00B75141 /* juce_FileFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31A209B74A5C00B75141 /* juce_FileFilter.h */; }; + 84FC31B509B74A5C00B75141 /* juce_FileListComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC31A309B74A5C00B75141 /* juce_FileListComponent.cpp */; }; + 84FC31B609B74A5C00B75141 /* juce_FileListComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31A409B74A5C00B75141 /* juce_FileListComponent.h */; }; + 84FC31B709B74A5C00B75141 /* juce_FilePreviewComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31A509B74A5C00B75141 /* juce_FilePreviewComponent.h */; }; + 84FC31B809B74A5C00B75141 /* juce_ImagePreviewComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC31A609B74A5C00B75141 /* juce_ImagePreviewComponent.cpp */; }; + 84FC31B909B74A5C00B75141 /* juce_ImagePreviewComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31A709B74A5C00B75141 /* juce_ImagePreviewComponent.h */; }; + 84FC31BA09B74A5C00B75141 /* juce_WildcardFileFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC31A809B74A5C00B75141 /* juce_WildcardFileFilter.cpp */; }; + 84FC31BB09B74A5C00B75141 /* juce_WildcardFileFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31A909B74A5C00B75141 /* juce_WildcardFileFilter.h */; }; + 84FC31BE09B74A7700B75141 /* juce_BorderSize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84FC31BC09B74A7700B75141 /* juce_BorderSize.cpp */; }; + 84FC31BF09B74A7700B75141 /* juce_BorderSize.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FC31BD09B74A7700B75141 /* juce_BorderSize.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 84052DE208D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ToneGeneratorAudioSource.cpp; sourceTree = ""; }; + 84052DE308D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ToneGeneratorAudioSource.h; sourceTree = ""; }; + 8406C44309642CE100C99145 /* juce_LowLevelGraphicsContext.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_LowLevelGraphicsContext.h; sourceTree = ""; }; + 8406C44409642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_LowLevelGraphicsSoftwareRenderer.cpp; sourceTree = ""; }; + 8406C44509642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_LowLevelGraphicsSoftwareRenderer.h; sourceTree = ""; }; + 8407908D09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_LowLevelGraphicsPostScriptRenderer.cpp; sourceTree = ""; }; + 8407908E09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_LowLevelGraphicsPostScriptRenderer.h; sourceTree = ""; }; + 84099C9B0AE52BD000B2A05D /* juce_Sampler.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_Sampler.cpp; sourceTree = ""; }; + 84099C9C0AE52BD000B2A05D /* juce_Sampler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_Sampler.h; sourceTree = ""; }; + 84099C9D0AE52BD000B2A05D /* juce_Synthesiser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_Synthesiser.cpp; sourceTree = ""; }; + 84099C9E0AE52BD000B2A05D /* juce_Synthesiser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_Synthesiser.h; sourceTree = ""; }; + 840F80BB092B399D005E7B4E /* juce.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce.h; path = ../../juce.h; sourceTree = SOURCE_ROOT; }; + 8417EE4F0A6E7A270058E04E /* juce_TableHeaderComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_TableHeaderComponent.cpp; sourceTree = ""; }; + 8417EE500A6E7A270058E04E /* juce_TableHeaderComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_TableHeaderComponent.h; sourceTree = ""; }; + 8417EE510A6E7A280058E04E /* juce_TableListBox.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_TableListBox.cpp; sourceTree = ""; }; + 8417EE520A6E7A280058E04E /* juce_TableListBox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_TableListBox.h; sourceTree = ""; }; + 8417EE570A6E7A370058E04E /* juce_StretchableObjectResizer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_StretchableObjectResizer.cpp; sourceTree = ""; }; + 8417EE580A6E7A370058E04E /* juce_StretchableObjectResizer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_StretchableObjectResizer.h; sourceTree = ""; }; + 84198B0A096D8E2B0022A439 /* juce_AudioDeviceManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioDeviceManager.cpp; sourceTree = ""; }; + 84198B0B096D8E2B0022A439 /* juce_AudioDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioDeviceManager.h; sourceTree = ""; }; + 84198B0C096D8E2B0022A439 /* juce_AudioIODevice.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioIODevice.h; sourceTree = ""; }; + 84198B0D096D8E2B0022A439 /* juce_MidiInput.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_MidiInput.h; sourceTree = ""; }; + 84198B0E096D8E2B0022A439 /* juce_MidiOutput.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_MidiOutput.h; sourceTree = ""; }; + 84198BB3096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioDeviceSelectorComponent.cpp; sourceTree = ""; }; + 84198BB4096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioDeviceSelectorComponent.h; sourceTree = ""; }; + 841E062F0AF8CE74005E6FCC /* juce_AudioDataConverters.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioDataConverters.cpp; sourceTree = ""; }; + 841E06300AF8CE74005E6FCC /* juce_AudioDataConverters.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioDataConverters.h; sourceTree = ""; }; + 841E06310AF8CE74005E6FCC /* juce_AudioSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioSampleBuffer.cpp; sourceTree = ""; }; + 841E06320AF8CE74005E6FCC /* juce_AudioSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioSampleBuffer.h; sourceTree = ""; }; + 841E06330AF8CE74005E6FCC /* juce_IIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_IIRFilter.cpp; sourceTree = ""; }; + 841E06340AF8CE74005E6FCC /* juce_IIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_IIRFilter.h; sourceTree = ""; }; + 842B63B609D8508F00255DC7 /* juce_FlacAudioFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_FlacAudioFormat.cpp; sourceTree = ""; }; + 842B63B709D8508F00255DC7 /* juce_FlacAudioFormat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_FlacAudioFormat.h; sourceTree = ""; }; + 842B63B809D8508F00255DC7 /* juce_OggVorbisAudioFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_OggVorbisAudioFormat.cpp; sourceTree = ""; }; + 842B63B909D8508F00255DC7 /* juce_OggVorbisAudioFormat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_OggVorbisAudioFormat.h; sourceTree = ""; }; + 842B64EA09D87B7900255DC7 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = juce.xcconfig; sourceTree = ""; }; + 842D3D0D0C0D7CF200E9FFE4 /* juce_MenuBarModel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_MenuBarModel.cpp; sourceTree = ""; }; + 842F9D570A19C9AF00B1358D /* juce_ButtonPropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ButtonPropertyComponent.cpp; sourceTree = ""; }; + 842F9D580A19C9AF00B1358D /* juce_ButtonPropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ButtonPropertyComponent.h; sourceTree = ""; }; + 842F9D590A19C9AF00B1358D /* juce_ChoicePropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ChoicePropertyComponent.cpp; sourceTree = ""; }; + 842F9D5A0A19C9AF00B1358D /* juce_ChoicePropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ChoicePropertyComponent.h; sourceTree = ""; }; + 842F9D5B0A19C9AF00B1358D /* juce_PropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_PropertyComponent.cpp; sourceTree = ""; }; + 842F9D5C0A19C9AF00B1358D /* juce_PropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_PropertyComponent.h; sourceTree = ""; }; + 842F9D5D0A19C9AF00B1358D /* juce_PropertyPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_PropertyPanel.cpp; sourceTree = ""; }; + 842F9D5E0A19C9AF00B1358D /* juce_PropertyPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_PropertyPanel.h; sourceTree = ""; }; + 842F9D5F0A19C9AF00B1358D /* juce_SliderPropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_SliderPropertyComponent.cpp; sourceTree = ""; }; + 842F9D600A19C9AF00B1358D /* juce_SliderPropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_SliderPropertyComponent.h; sourceTree = ""; }; + 842F9D610A19C9AF00B1358D /* juce_TextPropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_TextPropertyComponent.cpp; sourceTree = ""; }; + 842F9D620A19C9AF00B1358D /* juce_TextPropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_TextPropertyComponent.h; sourceTree = ""; }; + 842F9DE00A19D2AF00B1358D /* juce_PositionedRectangle.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_PositionedRectangle.cpp; sourceTree = ""; }; + 842F9DE10A19D2AF00B1358D /* juce_PositionedRectangle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_PositionedRectangle.h; sourceTree = ""; }; + 8440CD3C0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ComponentMovementWatcher.cpp; sourceTree = ""; }; + 8440CD3D0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ComponentMovementWatcher.h; sourceTree = ""; }; + 8440CD610ACD112E0086FFD7 /* juce_SliderListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_SliderListener.h; sourceTree = ""; }; + 8456EC6508A2A6C80087C412 /* juce_Config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Config.h; path = ../../juce_Config.h; sourceTree = SOURCE_ROOT; }; + 8456EC6908A2A6F00087C412 /* JUCE changelist.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "JUCE changelist.txt"; path = "../../docs/JUCE changelist.txt"; sourceTree = SOURCE_ROOT; }; + 846034DA09CB374E00E255CF /* juce_InterprocessConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_InterprocessConnection.cpp; sourceTree = ""; }; + 846034DB09CB374E00E255CF /* juce_InterprocessConnection.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_InterprocessConnection.h; sourceTree = ""; }; + 846034DC09CB374E00E255CF /* juce_InterprocessConnectionServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_InterprocessConnectionServer.cpp; sourceTree = ""; }; + 846034DD09CB374E00E255CF /* juce_InterprocessConnectionServer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_InterprocessConnectionServer.h; sourceTree = ""; }; + 8463D5B5098BD2DD00F9AEC2 /* juce_MidiBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = midi/juce_MidiBuffer.cpp; sourceTree = ""; }; + 8463D5B6098BD2DD00F9AEC2 /* juce_MidiBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = midi/juce_MidiBuffer.h; sourceTree = ""; }; + 8463D5B7098BD2DD00F9AEC2 /* juce_MidiFile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = midi/juce_MidiFile.cpp; sourceTree = ""; }; + 8463D5B8098BD2DD00F9AEC2 /* juce_MidiFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MidiFile.h; path = midi/juce_MidiFile.h; sourceTree = ""; }; + 8463D5B9098BD2DD00F9AEC2 /* juce_MidiKeyboardState.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardState.cpp; path = midi/juce_MidiKeyboardState.cpp; sourceTree = ""; }; + 8463D5BA098BD2DD00F9AEC2 /* juce_MidiKeyboardState.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MidiKeyboardState.h; path = midi/juce_MidiKeyboardState.h; sourceTree = ""; }; + 8463D5BB098BD2DD00F9AEC2 /* juce_MidiMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessage.cpp; path = midi/juce_MidiMessage.cpp; sourceTree = ""; }; + 8463D5BC098BD2DD00F9AEC2 /* juce_MidiMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessage.h; path = midi/juce_MidiMessage.h; sourceTree = ""; }; + 8463D5BD098BD2DD00F9AEC2 /* juce_MidiMessageCollector.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessageCollector.cpp; path = midi/juce_MidiMessageCollector.cpp; sourceTree = ""; }; + 8463D5BE098BD2DD00F9AEC2 /* juce_MidiMessageCollector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessageCollector.h; path = midi/juce_MidiMessageCollector.h; sourceTree = ""; }; + 8463D5BF098BD2DD00F9AEC2 /* juce_MidiMessageSequence.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessageSequence.cpp; path = midi/juce_MidiMessageSequence.cpp; sourceTree = ""; }; + 8463D5C0098BD2DD00F9AEC2 /* juce_MidiMessageSequence.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessageSequence.h; path = midi/juce_MidiMessageSequence.h; sourceTree = ""; }; + 8463D5CE098BD30600F9AEC2 /* juce_TopLevelWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_TopLevelWindow.cpp; sourceTree = ""; }; + 8463D5CF098BD30600F9AEC2 /* juce_TopLevelWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_TopLevelWindow.h; sourceTree = ""; }; + 84677C700917A9B90086D5D9 /* adler32.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = adler32.c; sourceTree = ""; }; + 84677C710917A9B90086D5D9 /* compress.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = compress.c; sourceTree = ""; }; + 84677C720917A9B90086D5D9 /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = crc32.c; sourceTree = ""; }; + 84677C730917A9B90086D5D9 /* deflate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = deflate.c; sourceTree = ""; }; + 84677C740917A9B90086D5D9 /* infback.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = infback.c; sourceTree = ""; }; + 84677C750917A9B90086D5D9 /* inffast.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = inffast.c; sourceTree = ""; }; + 84677C760917A9B90086D5D9 /* inflate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = inflate.c; sourceTree = ""; }; + 84677C770917A9B90086D5D9 /* inftrees.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = inftrees.c; sourceTree = ""; }; + 84677C780917A9B90086D5D9 /* trees.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = trees.c; sourceTree = ""; }; + 84677C790917A9B90086D5D9 /* uncompr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = uncompr.c; sourceTree = ""; }; + 84677C7A0917A9B90086D5D9 /* zutil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = zutil.c; sourceTree = ""; }; + 84677C860917A9DB0086D5D9 /* zconf.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = zconf.h; sourceTree = ""; }; + 84677C870917A9DB0086D5D9 /* zlib.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = zlib.h; sourceTree = ""; }; + 84677C8A0917AA440086D5D9 /* png.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = png.c; sourceTree = ""; }; + 84677C8B0917AA440086D5D9 /* png.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = png.h; sourceTree = ""; }; + 84677C8C0917AA440086D5D9 /* pngconf.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = pngconf.h; sourceTree = ""; }; + 84677C8D0917AA440086D5D9 /* pngerror.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngerror.c; sourceTree = ""; }; + 84677C8F0917AA440086D5D9 /* pngget.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngget.c; sourceTree = ""; }; + 84677C900917AA440086D5D9 /* pngmem.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngmem.c; sourceTree = ""; }; + 84677C910917AA440086D5D9 /* pngpread.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngpread.c; sourceTree = ""; }; + 84677C920917AA440086D5D9 /* pngread.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngread.c; sourceTree = ""; }; + 84677C930917AA440086D5D9 /* pngrio.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngrio.c; sourceTree = ""; }; + 84677C940917AA440086D5D9 /* pngrtran.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngrtran.c; sourceTree = ""; }; + 84677C950917AA440086D5D9 /* pngrutil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngrutil.c; sourceTree = ""; }; + 84677C960917AA440086D5D9 /* pngset.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngset.c; sourceTree = ""; }; + 84677C980917AA440086D5D9 /* pngtrans.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngtrans.c; sourceTree = ""; }; + 84677C9A0917AA440086D5D9 /* pngwio.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngwio.c; sourceTree = ""; }; + 84677C9B0917AA440086D5D9 /* pngwrite.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngwrite.c; sourceTree = ""; }; + 84677C9C0917AA440086D5D9 /* pngwtran.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngwtran.c; sourceTree = ""; }; + 84677C9D0917AA440086D5D9 /* pngwutil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = pngwutil.c; sourceTree = ""; }; + 84677CB70917AB5E0086D5D9 /* jcapimin.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcapimin.c; sourceTree = ""; }; + 84677CB80917AB5E0086D5D9 /* jcapistd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcapistd.c; sourceTree = ""; }; + 84677CB90917AB5E0086D5D9 /* jccoefct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jccoefct.c; sourceTree = ""; }; + 84677CBA0917AB5E0086D5D9 /* jccolor.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jccolor.c; sourceTree = ""; }; + 84677CBB0917AB5E0086D5D9 /* jcdctmgr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcdctmgr.c; sourceTree = ""; }; + 84677CBC0917AB5E0086D5D9 /* jchuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jchuff.c; sourceTree = ""; }; + 84677CBD0917AB5E0086D5D9 /* jcinit.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcinit.c; sourceTree = ""; }; + 84677CBE0917AB5E0086D5D9 /* jcmainct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcmainct.c; sourceTree = ""; }; + 84677CBF0917AB5E0086D5D9 /* jcmarker.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcmarker.c; sourceTree = ""; }; + 84677CC00917AB5E0086D5D9 /* jcmaster.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcmaster.c; sourceTree = ""; }; + 84677CC10917AB5E0086D5D9 /* jcomapi.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcomapi.c; sourceTree = ""; }; + 84677CC20917AB5E0086D5D9 /* jcparam.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcparam.c; sourceTree = ""; }; + 84677CC30917AB5E0086D5D9 /* jcphuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcphuff.c; sourceTree = ""; }; + 84677CC40917AB5E0086D5D9 /* jcprepct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcprepct.c; sourceTree = ""; }; + 84677CC50917AB5E0086D5D9 /* jcsample.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jcsample.c; sourceTree = ""; }; + 84677CC60917AB5E0086D5D9 /* jctrans.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jctrans.c; sourceTree = ""; }; + 84677CC70917AB5E0086D5D9 /* jdapimin.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdapimin.c; sourceTree = ""; }; + 84677CC80917AB5E0086D5D9 /* jdapistd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdapistd.c; sourceTree = ""; }; + 84677CC90917AB5E0086D5D9 /* jdatasrc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdatasrc.c; sourceTree = ""; }; + 84677CCA0917AB5E0086D5D9 /* jdcoefct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdcoefct.c; sourceTree = ""; }; + 84677CCB0917AB5E0086D5D9 /* jdcolor.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdcolor.c; sourceTree = ""; }; + 84677CCC0917AB5F0086D5D9 /* jddctmgr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jddctmgr.c; sourceTree = ""; }; + 84677CCD0917AB5F0086D5D9 /* jdhuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdhuff.c; sourceTree = ""; }; + 84677CCE0917AB5F0086D5D9 /* jdinput.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdinput.c; sourceTree = ""; }; + 84677CCF0917AB5F0086D5D9 /* jdmainct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdmainct.c; sourceTree = ""; }; + 84677CD00917AB5F0086D5D9 /* jdmarker.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdmarker.c; sourceTree = ""; }; + 84677CD10917AB5F0086D5D9 /* jdmaster.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdmaster.c; sourceTree = ""; }; + 84677CD20917AB5F0086D5D9 /* jdmerge.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdmerge.c; sourceTree = ""; }; + 84677CD30917AB5F0086D5D9 /* jdphuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdphuff.c; sourceTree = ""; }; + 84677CD40917AB5F0086D5D9 /* jdpostct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdpostct.c; sourceTree = ""; }; + 84677CD50917AB5F0086D5D9 /* jdsample.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdsample.c; sourceTree = ""; }; + 84677CD60917AB5F0086D5D9 /* jdtrans.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jdtrans.c; sourceTree = ""; }; + 84677CD70917AB5F0086D5D9 /* jerror.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jerror.c; sourceTree = ""; }; + 84677CD80917AB5F0086D5D9 /* jfdctflt.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jfdctflt.c; sourceTree = ""; }; + 84677CD90917AB5F0086D5D9 /* jfdctfst.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jfdctfst.c; sourceTree = ""; }; + 84677CDA0917AB5F0086D5D9 /* jfdctint.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jfdctint.c; sourceTree = ""; }; + 84677CDB0917AB5F0086D5D9 /* jidctflt.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jidctflt.c; sourceTree = ""; }; + 84677CDC0917AB5F0086D5D9 /* jidctfst.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jidctfst.c; sourceTree = ""; }; + 84677CDD0917AB5F0086D5D9 /* jidctint.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jidctint.c; sourceTree = ""; }; + 84677CDE0917AB5F0086D5D9 /* jidctred.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jidctred.c; sourceTree = ""; }; + 84677CDF0917AB5F0086D5D9 /* jinclude.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jinclude.h; sourceTree = ""; }; + 84677CE00917AB5F0086D5D9 /* jmemmgr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jmemmgr.c; sourceTree = ""; }; + 84677CE10917AB5F0086D5D9 /* jmemnobs.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jmemnobs.c; sourceTree = ""; }; + 84677CE40917AB5F0086D5D9 /* jpeglib.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jpeglib.h; sourceTree = ""; }; + 84677CE50917AB5F0086D5D9 /* jquant1.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jquant1.c; sourceTree = ""; }; + 84677CE60917AB5F0086D5D9 /* jquant2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jquant2.c; sourceTree = ""; }; + 84677CE70917AB5F0086D5D9 /* jutils.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = jutils.c; sourceTree = ""; }; + 84677CE80917AB5F0086D5D9 /* jversion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jversion.h; sourceTree = ""; }; + 84677CE90917AB5F0086D5D9 /* transupp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = transupp.c; sourceTree = ""; }; + 84677CEA0917AB5F0086D5D9 /* transupp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = transupp.h; sourceTree = ""; }; + 846927D80A49ABD300314975 /* juce_CharacterFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_CharacterFunctions.cpp; sourceTree = ""; }; + 846927D90A49ABD300314975 /* juce_CharacterFunctions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_CharacterFunctions.h; sourceTree = ""; }; + 846927DC0A49ABE600314975 /* juce_RectanglePlacement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_RectanglePlacement.cpp; sourceTree = ""; }; + 846927DD0A49ABE600314975 /* juce_RectanglePlacement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_RectanglePlacement.h; sourceTree = ""; }; + 846927E00A49ABFD00314975 /* juce_SVGParser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_SVGParser.cpp; sourceTree = ""; }; + 84A06BAA09CAD6A3006A43BD /* juce_AudioIODevice.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioIODevice.cpp; sourceTree = ""; }; + 84A06BAB09CAD6A3006A43BD /* juce_AudioIODeviceType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioIODeviceType.cpp; sourceTree = ""; }; + 84A06BAC09CAD6A3006A43BD /* juce_AudioIODeviceType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioIODeviceType.h; sourceTree = ""; }; + 84A06BE209CADB06006A43BD /* juce_mac_NamedPipe.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_mac_NamedPipe.cpp; sourceTree = ""; }; + 84A4881E08A22E2400752A2B /* juce_mac_CoreAudio.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_CoreAudio.cpp; path = platform_specific_code/juce_mac_CoreAudio.cpp; sourceTree = SOURCE_ROOT; }; + 84A4881F08A22E2400752A2B /* juce_mac_CoreMidi.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_CoreMidi.cpp; path = platform_specific_code/juce_mac_CoreMidi.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882008A22E2400752A2B /* juce_mac_FileChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_FileChooser.cpp; path = platform_specific_code/juce_mac_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882108A22E2400752A2B /* juce_mac_Files.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_Files.cpp; path = platform_specific_code/juce_mac_Files.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882208A22E2400752A2B /* juce_mac_Fonts.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_Fonts.cpp; path = platform_specific_code/juce_mac_Fonts.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882308A22E2400752A2B /* juce_mac_Messaging.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_Messaging.cpp; path = platform_specific_code/juce_mac_Messaging.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882408A22E2400752A2B /* juce_mac_Network.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_Network.cpp; path = platform_specific_code/juce_mac_Network.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882508A22E2400752A2B /* juce_mac_SystemStats.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_SystemStats.cpp; path = platform_specific_code/juce_mac_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882608A22E2400752A2B /* juce_mac_Threads.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_Threads.cpp; path = platform_specific_code/juce_mac_Threads.cpp; sourceTree = SOURCE_ROOT; }; + 84A4882708A22E2400752A2B /* juce_mac_Windowing.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_Windowing.cpp; path = platform_specific_code/juce_mac_Windowing.cpp; sourceTree = SOURCE_ROOT; }; + 84A4883508A22E4900752A2B /* juce_Application.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Application.cpp; path = ../../src/juce_appframework/application/juce_Application.cpp; sourceTree = SOURCE_ROOT; }; + 84A4883608A22E4900752A2B /* juce_Application.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Application.h; path = ../../src/juce_appframework/application/juce_Application.h; sourceTree = SOURCE_ROOT; }; + 84A4883708A22E4900752A2B /* juce_DeletedAtShutdown.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DeletedAtShutdown.cpp; path = ../../src/juce_appframework/application/juce_DeletedAtShutdown.cpp; sourceTree = SOURCE_ROOT; }; + 84A4883808A22E4900752A2B /* juce_DeletedAtShutdown.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DeletedAtShutdown.h; path = ../../src/juce_appframework/application/juce_DeletedAtShutdown.h; sourceTree = SOURCE_ROOT; }; + 84A4883A08A22E4900752A2B /* juce_SystemClipboard.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SystemClipboard.h; path = ../../src/juce_appframework/application/juce_SystemClipboard.h; sourceTree = SOURCE_ROOT; }; + 84A4883D08A22E4900752A2B /* juce_AiffAudioFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AiffAudioFormat.cpp; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; + 84A4883E08A22E4900752A2B /* juce_AiffAudioFormat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AiffAudioFormat.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.h; sourceTree = SOURCE_ROOT; }; + 84A4883F08A22E4900752A2B /* juce_AudioCDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioCDReader.cpp; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; }; + 84A4884008A22E4900752A2B /* juce_AudioCDReader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDReader.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.h; sourceTree = SOURCE_ROOT; }; + 84A4884108A22E4900752A2B /* juce_AudioFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormat.cpp; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.cpp; sourceTree = SOURCE_ROOT; }; + 84A4884208A22E4900752A2B /* juce_AudioFormat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormat.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.h; sourceTree = SOURCE_ROOT; }; + 84A4884308A22E4900752A2B /* juce_AudioFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatReader.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormatReader.h; sourceTree = SOURCE_ROOT; }; + 84A4884408A22E4900752A2B /* juce_AudioFormatWriter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatWriter.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormatWriter.h; sourceTree = SOURCE_ROOT; }; + 84A4884508A22E4900752A2B /* juce_AudioSubsectionReader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioSubsectionReader.cpp; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.cpp; sourceTree = SOURCE_ROOT; }; + 84A4884608A22E4900752A2B /* juce_AudioSubsectionReader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioSubsectionReader.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.h; sourceTree = SOURCE_ROOT; }; + 84A4884708A22E4900752A2B /* juce_WavAudioFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WavAudioFormat.cpp; path = ../../src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; + 84A4884808A22E4900752A2B /* juce_WavAudioFormat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_WavAudioFormat.h; path = ../../src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.h; sourceTree = SOURCE_ROOT; }; + 84A4884A08A22E4900752A2B /* juce_AudioFormatReaderSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormatReaderSource.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.cpp; sourceTree = SOURCE_ROOT; }; + 84A4884B08A22E4900752A2B /* juce_AudioFormatReaderSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatReaderSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.h; sourceTree = SOURCE_ROOT; }; + 84A4884C08A22E4900752A2B /* juce_AudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioSource.h; sourceTree = SOURCE_ROOT; }; + 84A4884D08A22E4900752A2B /* juce_AudioSourcePlayer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioSourcePlayer.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.cpp; sourceTree = SOURCE_ROOT; }; + 84A4884E08A22E4900752A2B /* juce_AudioSourcePlayer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioSourcePlayer.h; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.h; sourceTree = SOURCE_ROOT; }; + 84A4884F08A22E4900752A2B /* juce_AudioTransportSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioTransportSource.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp; sourceTree = SOURCE_ROOT; }; + 84A4885008A22E4900752A2B /* juce_AudioTransportSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioTransportSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.h; sourceTree = SOURCE_ROOT; }; + 84A4885108A22E4900752A2B /* juce_BufferingAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferingAudioSource.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; + 84A4885208A22E4900752A2B /* juce_BufferingAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_BufferingAudioSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.h; sourceTree = SOURCE_ROOT; }; + 84A4885308A22E4900752A2B /* juce_MixerAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MixerAudioSource.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.cpp; sourceTree = SOURCE_ROOT; }; + 84A4885408A22E4900752A2B /* juce_MixerAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MixerAudioSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.h; sourceTree = SOURCE_ROOT; }; + 84A4885508A22E4900752A2B /* juce_PositionableAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; + 84A4885608A22E4900752A2B /* juce_ResamplingAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; + 84A4885708A22E4900752A2B /* juce_ResamplingAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; + 84A4886508A22E4900752A2B /* juce_ActionBroadcaster.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../src/juce_appframework/events/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; + 84A4886608A22E4900752A2B /* juce_ActionBroadcaster.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../src/juce_appframework/events/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; + 84A4886708A22E4900752A2B /* juce_ActionListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../src/juce_appframework/events/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; + 84A4886808A22E4900752A2B /* juce_ActionListenerList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionListenerList.cpp; path = ../../src/juce_appframework/events/juce_ActionListenerList.cpp; sourceTree = SOURCE_ROOT; }; + 84A4886908A22E4900752A2B /* juce_ActionListenerList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ActionListenerList.h; path = ../../src/juce_appframework/events/juce_ActionListenerList.h; sourceTree = SOURCE_ROOT; }; + 84A4886A08A22E4900752A2B /* juce_AsyncUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../src/juce_appframework/events/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; + 84A4886B08A22E4900752A2B /* juce_AsyncUpdater.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../src/juce_appframework/events/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; + 84A4886C08A22E4900752A2B /* juce_ChangeBroadcaster.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeBroadcaster.cpp; path = ../../src/juce_appframework/events/juce_ChangeBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; + 84A4886D08A22E4900752A2B /* juce_ChangeBroadcaster.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ChangeBroadcaster.h; path = ../../src/juce_appframework/events/juce_ChangeBroadcaster.h; sourceTree = SOURCE_ROOT; }; + 84A4886E08A22E4900752A2B /* juce_ChangeListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListener.h; path = ../../src/juce_appframework/events/juce_ChangeListener.h; sourceTree = SOURCE_ROOT; }; + 84A4886F08A22E4900752A2B /* juce_ChangeListenerList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeListenerList.cpp; path = ../../src/juce_appframework/events/juce_ChangeListenerList.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887008A22E4900752A2B /* juce_ChangeListenerList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListenerList.h; path = ../../src/juce_appframework/events/juce_ChangeListenerList.h; sourceTree = SOURCE_ROOT; }; + 84A4887108A22E4900752A2B /* juce_Message.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Message.cpp; path = ../../src/juce_appframework/events/juce_Message.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887208A22E4900752A2B /* juce_Message.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Message.h; path = ../../src/juce_appframework/events/juce_Message.h; sourceTree = SOURCE_ROOT; }; + 84A4887308A22E4900752A2B /* juce_MessageListener.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MessageListener.cpp; path = ../../src/juce_appframework/events/juce_MessageListener.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887408A22E4900752A2B /* juce_MessageListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MessageListener.h; path = ../../src/juce_appframework/events/juce_MessageListener.h; sourceTree = SOURCE_ROOT; }; + 84A4887508A22E4900752A2B /* juce_MessageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MessageManager.cpp; path = ../../src/juce_appframework/events/juce_MessageManager.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887608A22E4900752A2B /* juce_MessageManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MessageManager.h; path = ../../src/juce_appframework/events/juce_MessageManager.h; sourceTree = SOURCE_ROOT; }; + 84A4887708A22E4900752A2B /* juce_Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Timer.cpp; path = ../../src/juce_appframework/events/juce_Timer.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887808A22E4900752A2B /* juce_Timer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Timer.h; path = ../../src/juce_appframework/events/juce_Timer.h; sourceTree = SOURCE_ROOT; }; + 84A4887C08A22E4900752A2B /* juce_ArrowButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ArrowButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_ArrowButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887D08A22E4900752A2B /* juce_ArrowButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ArrowButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_ArrowButton.h; sourceTree = SOURCE_ROOT; }; + 84A4887E08A22E4900752A2B /* juce_Button.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Button.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_Button.cpp; sourceTree = SOURCE_ROOT; }; + 84A4887F08A22E4900752A2B /* juce_Button.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Button.h; path = ../../src/juce_appframework/gui/components/buttons/juce_Button.h; sourceTree = SOURCE_ROOT; }; + 84A4888008A22E4900752A2B /* juce_DrawableButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888108A22E4900752A2B /* juce_DrawableButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DrawableButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_DrawableButton.h; sourceTree = SOURCE_ROOT; }; + 84A4888208A22E4900752A2B /* juce_HyperlinkButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_HyperlinkButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888308A22E4900752A2B /* juce_HyperlinkButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_HyperlinkButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.h; sourceTree = SOURCE_ROOT; }; + 84A4888408A22E4900752A2B /* juce_ImageButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888508A22E4900752A2B /* juce_ImageButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImageButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_ImageButton.h; sourceTree = SOURCE_ROOT; }; + 84A4888608A22E4900752A2B /* juce_ShapeButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ShapeButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_ShapeButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888708A22E4900752A2B /* juce_ShapeButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ShapeButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_ShapeButton.h; sourceTree = SOURCE_ROOT; }; + 84A4888808A22E4900752A2B /* juce_TextButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_TextButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888908A22E4900752A2B /* juce_TextButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TextButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_TextButton.h; sourceTree = SOURCE_ROOT; }; + 84A4888A08A22E4900752A2B /* juce_ToggleButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToggleButton.cpp; path = ../../src/juce_appframework/gui/components/buttons/juce_ToggleButton.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888B08A22E4900752A2B /* juce_ToggleButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ToggleButton.h; path = ../../src/juce_appframework/gui/components/buttons/juce_ToggleButton.h; sourceTree = SOURCE_ROOT; }; + 84A4888D08A22E4900752A2B /* juce_ComboBox.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComboBox.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_ComboBox.cpp; sourceTree = SOURCE_ROOT; }; + 84A4888E08A22E4900752A2B /* juce_ComboBox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ComboBox.h; path = ../../src/juce_appframework/gui/components/controls/juce_ComboBox.h; sourceTree = SOURCE_ROOT; }; + 84A4889108A22E4900752A2B /* juce_Label.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Label.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_Label.cpp; sourceTree = SOURCE_ROOT; }; + 84A4889208A22E4900752A2B /* juce_Label.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Label.h; path = ../../src/juce_appframework/gui/components/controls/juce_Label.h; sourceTree = SOURCE_ROOT; }; + 84A4889308A22E4900752A2B /* juce_ListBox.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ListBox.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_ListBox.cpp; sourceTree = SOURCE_ROOT; }; + 84A4889408A22E4900752A2B /* juce_ListBox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ListBox.h; path = ../../src/juce_appframework/gui/components/controls/juce_ListBox.h; sourceTree = SOURCE_ROOT; }; + 84A4889508A22E4900752A2B /* juce_ProgressBar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ProgressBar.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_ProgressBar.cpp; sourceTree = SOURCE_ROOT; }; + 84A4889608A22E4900752A2B /* juce_ProgressBar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ProgressBar.h; path = ../../src/juce_appframework/gui/components/controls/juce_ProgressBar.h; sourceTree = SOURCE_ROOT; }; + 84A4889908A22E4900752A2B /* juce_Slider.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Slider.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_Slider.cpp; sourceTree = SOURCE_ROOT; }; + 84A4889A08A22E4900752A2B /* juce_Slider.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Slider.h; path = ../../src/juce_appframework/gui/components/controls/juce_Slider.h; sourceTree = SOURCE_ROOT; }; + 84A4889B08A22E4900752A2B /* juce_TextEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextEditor.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_TextEditor.cpp; sourceTree = SOURCE_ROOT; }; + 84A4889C08A22E4900752A2B /* juce_TextEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TextEditor.h; path = ../../src/juce_appframework/gui/components/controls/juce_TextEditor.h; sourceTree = SOURCE_ROOT; }; + 84A4889D08A22E4900752A2B /* juce_TreeView.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TreeView.cpp; path = ../../src/juce_appframework/gui/components/controls/juce_TreeView.cpp; sourceTree = SOURCE_ROOT; }; + 84A4889E08A22E4900752A2B /* juce_TreeView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TreeView.h; path = ../../src/juce_appframework/gui/components/controls/juce_TreeView.h; sourceTree = SOURCE_ROOT; }; + 84A4889F08A22E4900752A2B /* juce_Component.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Component.cpp; path = ../../src/juce_appframework/gui/components/juce_Component.cpp; sourceTree = SOURCE_ROOT; }; + 84A488A008A22E4900752A2B /* juce_Component.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Component.h; path = ../../src/juce_appframework/gui/components/juce_Component.h; sourceTree = SOURCE_ROOT; }; + 84A488A108A22E4900752A2B /* juce_ComponentDeletionWatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ComponentDeletionWatcher.h; path = ../../src/juce_appframework/gui/components/juce_ComponentDeletionWatcher.h; sourceTree = SOURCE_ROOT; }; + 84A488A208A22E4900752A2B /* juce_ComponentListener.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentListener.cpp; path = ../../src/juce_appframework/gui/components/juce_ComponentListener.cpp; sourceTree = SOURCE_ROOT; }; + 84A488A308A22E4900752A2B /* juce_ComponentListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ComponentListener.h; path = ../../src/juce_appframework/gui/components/juce_ComponentListener.h; sourceTree = SOURCE_ROOT; }; + 84A488A408A22E4900752A2B /* juce_Desktop.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Desktop.cpp; path = ../../src/juce_appframework/gui/components/juce_Desktop.cpp; sourceTree = SOURCE_ROOT; }; + 84A488A508A22E4900752A2B /* juce_Desktop.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Desktop.h; path = ../../src/juce_appframework/gui/components/juce_Desktop.h; sourceTree = SOURCE_ROOT; }; + 84A488A708A22E4900752A2B /* juce_KeyListener.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyListener.cpp; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyListener.cpp; sourceTree = SOURCE_ROOT; }; + 84A488A808A22E4900752A2B /* juce_KeyListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_KeyListener.h; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyListener.h; sourceTree = SOURCE_ROOT; }; + 84A488A908A22E4900752A2B /* juce_KeyMappingEditorComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyMappingEditorComponent.cpp; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488AA08A22E4900752A2B /* juce_KeyMappingEditorComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_KeyMappingEditorComponent.h; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488AB08A22E4900752A2B /* juce_KeyPress.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPress.cpp; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.cpp; sourceTree = SOURCE_ROOT; }; + 84A488AC08A22E4900752A2B /* juce_KeyPress.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_KeyPress.h; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.h; sourceTree = SOURCE_ROOT; }; + 84A488AD08A22E4900752A2B /* juce_KeyPressMappingSet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPressMappingSet.cpp; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.cpp; sourceTree = SOURCE_ROOT; }; + 84A488AE08A22E4900752A2B /* juce_KeyPressMappingSet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_KeyPressMappingSet.h; path = ../../src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.h; sourceTree = SOURCE_ROOT; }; + 84A488AF08A22E4900752A2B /* juce_ModifierKeys.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ModifierKeys.cpp; path = ../../src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.cpp; sourceTree = SOURCE_ROOT; }; + 84A488B008A22E4900752A2B /* juce_ModifierKeys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ModifierKeys.h; path = ../../src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.h; sourceTree = SOURCE_ROOT; }; + 84A488B208A22E4900752A2B /* juce_GroupComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GroupComponent.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_GroupComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488B308A22E4900752A2B /* juce_GroupComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GroupComponent.h; path = ../../src/juce_appframework/gui/components/layout/juce_GroupComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488B508A22E4900752A2B /* juce_ResizableBorderComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableBorderComponent.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488B608A22E4900752A2B /* juce_ResizableBorderComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ResizableBorderComponent.h; path = ../../src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488B708A22E4900752A2B /* juce_ResizableCornerComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableCornerComponent.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488B808A22E4900752A2B /* juce_ResizableCornerComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ResizableCornerComponent.h; path = ../../src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488B908A22E4900752A2B /* juce_ScrollBar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ScrollBar.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_ScrollBar.cpp; sourceTree = SOURCE_ROOT; }; + 84A488BA08A22E4900752A2B /* juce_ScrollBar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ScrollBar.h; path = ../../src/juce_appframework/gui/components/layout/juce_ScrollBar.h; sourceTree = SOURCE_ROOT; }; + 84A488BB08A22E4900752A2B /* juce_StretchableLayoutManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutManager.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.cpp; sourceTree = SOURCE_ROOT; }; + 84A488BC08A22E4900752A2B /* juce_StretchableLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutManager.h; path = ../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.h; sourceTree = SOURCE_ROOT; }; + 84A488BD08A22E4900752A2B /* juce_StretchableLayoutResizerBar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutResizerBar.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.cpp; sourceTree = SOURCE_ROOT; }; + 84A488BE08A22E4900752A2B /* juce_StretchableLayoutResizerBar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutResizerBar.h; path = ../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.h; sourceTree = SOURCE_ROOT; }; + 84A488BF08A22E4900752A2B /* juce_TabbedButtonBar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedButtonBar.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.cpp; sourceTree = SOURCE_ROOT; }; + 84A488C008A22E4900752A2B /* juce_TabbedButtonBar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TabbedButtonBar.h; path = ../../src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.h; sourceTree = SOURCE_ROOT; }; + 84A488C108A22E4900752A2B /* juce_TabbedComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedComponent.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_TabbedComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488C208A22E4900752A2B /* juce_TabbedComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TabbedComponent.h; path = ../../src/juce_appframework/gui/components/layout/juce_TabbedComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488C308A22E4900752A2B /* juce_Viewport.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Viewport.cpp; path = ../../src/juce_appframework/gui/components/layout/juce_Viewport.cpp; sourceTree = SOURCE_ROOT; }; + 84A488C408A22E4900752A2B /* juce_Viewport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Viewport.h; path = ../../src/juce_appframework/gui/components/layout/juce_Viewport.h; sourceTree = SOURCE_ROOT; }; + 84A488C608A22E4900752A2B /* juce_LookAndFeel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LookAndFeel.cpp; path = ../../src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp; sourceTree = SOURCE_ROOT; }; + 84A488C708A22E4900752A2B /* juce_LookAndFeel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_LookAndFeel.h; path = ../../src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.h; sourceTree = SOURCE_ROOT; }; + 84A488C808A22E4900752A2B /* juce_ShinyLookAndFeel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ShinyLookAndFeel.cpp; path = ../../src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.cpp; sourceTree = SOURCE_ROOT; }; + 84A488C908A22E4900752A2B /* juce_ShinyLookAndFeel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ShinyLookAndFeel.h; path = ../../src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.h; sourceTree = SOURCE_ROOT; }; + 84A488CB08A22E4900752A2B /* juce_MenuBarComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MenuBarComponent.cpp; path = ../../src/juce_appframework/gui/components/menus/juce_MenuBarComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488CC08A22E4900752A2B /* juce_MenuBarComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MenuBarComponent.h; path = ../../src/juce_appframework/gui/components/menus/juce_MenuBarComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488CD08A22E4900752A2B /* juce_MenuBarModel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MenuBarModel.h; path = ../../src/juce_appframework/gui/components/menus/juce_MenuBarModel.h; sourceTree = SOURCE_ROOT; }; + 84A488CE08A22E4900752A2B /* juce_PopupMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PopupMenu.cpp; path = ../../src/juce_appframework/gui/components/menus/juce_PopupMenu.cpp; sourceTree = SOURCE_ROOT; }; + 84A488CF08A22E4900752A2B /* juce_PopupMenu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PopupMenu.h; path = ../../src/juce_appframework/gui/components/menus/juce_PopupMenu.h; sourceTree = SOURCE_ROOT; }; + 84A488D008A22E4900752A2B /* juce_PopupMenuCustomComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PopupMenuCustomComponent.h; path = ../../src/juce_appframework/gui/components/menus/juce_PopupMenuCustomComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488D208A22E4900752A2B /* juce_ComponentDragger.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentDragger.cpp; path = ../../src/juce_appframework/gui/components/mouse/juce_ComponentDragger.cpp; sourceTree = SOURCE_ROOT; }; + 84A488D308A22E4900752A2B /* juce_ComponentDragger.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ComponentDragger.h; path = ../../src/juce_appframework/gui/components/mouse/juce_ComponentDragger.h; sourceTree = SOURCE_ROOT; }; + 84A488D408A22E4900752A2B /* juce_DragAndDropContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DragAndDropContainer.cpp; path = ../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.cpp; sourceTree = SOURCE_ROOT; }; + 84A488D508A22E4900752A2B /* juce_DragAndDropContainer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DragAndDropContainer.h; path = ../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.h; sourceTree = SOURCE_ROOT; }; + 84A488D608A22E4900752A2B /* juce_DragAndDropTarget.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DragAndDropTarget.h; path = ../../src/juce_appframework/gui/components/mouse/juce_DragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; + 84A488D708A22E4900752A2B /* juce_MouseCursor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseCursor.cpp; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseCursor.cpp; sourceTree = SOURCE_ROOT; }; + 84A488D808A22E4900752A2B /* juce_MouseCursor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MouseCursor.h; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseCursor.h; sourceTree = SOURCE_ROOT; }; + 84A488D908A22E4900752A2B /* juce_MouseEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseEvent.cpp; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseEvent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488DA08A22E4900752A2B /* juce_MouseEvent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MouseEvent.h; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseEvent.h; sourceTree = SOURCE_ROOT; }; + 84A488DB08A22E4900752A2B /* juce_MouseHoverDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseHoverDetector.cpp; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.cpp; sourceTree = SOURCE_ROOT; }; + 84A488DC08A22E4900752A2B /* juce_MouseHoverDetector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MouseHoverDetector.h; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.h; sourceTree = SOURCE_ROOT; }; + 84A488DD08A22E4900752A2B /* juce_MouseListener.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseListener.cpp; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseListener.cpp; sourceTree = SOURCE_ROOT; }; + 84A488DE08A22E4900752A2B /* juce_MouseListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MouseListener.h; path = ../../src/juce_appframework/gui/components/mouse/juce_MouseListener.h; sourceTree = SOURCE_ROOT; }; + 84A488E008A22E4900752A2B /* juce_BubbleComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BubbleComponent.cpp; path = ../../src/juce_appframework/gui/components/special/juce_BubbleComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488E108A22E4900752A2B /* juce_BubbleComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_BubbleComponent.h; path = ../../src/juce_appframework/gui/components/special/juce_BubbleComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488E208A22E4900752A2B /* juce_BubbleMessageComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BubbleMessageComponent.cpp; path = ../../src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488E308A22E4900752A2B /* juce_BubbleMessageComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_BubbleMessageComponent.h; path = ../../src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488E408A22E4900752A2B /* juce_ColourSelector.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourSelector.cpp; path = ../../src/juce_appframework/gui/components/special/juce_ColourSelector.cpp; sourceTree = SOURCE_ROOT; }; + 84A488E508A22E4900752A2B /* juce_ColourSelector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ColourSelector.h; path = ../../src/juce_appframework/gui/components/special/juce_ColourSelector.h; sourceTree = SOURCE_ROOT; }; + 84A488E608A22E4900752A2B /* juce_DropShadower.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadower.cpp; path = ../../src/juce_appframework/gui/components/special/juce_DropShadower.cpp; sourceTree = SOURCE_ROOT; }; + 84A488E708A22E4900752A2B /* juce_DropShadower.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DropShadower.h; path = ../../src/juce_appframework/gui/components/special/juce_DropShadower.h; sourceTree = SOURCE_ROOT; }; + 84A488E808A22E4900752A2B /* juce_OpenGLComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLComponent.cpp; path = ../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488E908A22E4900752A2B /* juce_OpenGLComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLComponent.h; path = ../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488EA08A22E4900752A2B /* juce_PreferencesPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PreferencesPanel.cpp; path = ../../src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp; sourceTree = SOURCE_ROOT; }; + 84A488EB08A22E4900752A2B /* juce_PreferencesPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PreferencesPanel.h; path = ../../src/juce_appframework/gui/components/special/juce_PreferencesPanel.h; sourceTree = SOURCE_ROOT; }; + 84A488EC08A22E4900752A2B /* juce_QuickTimeMovieComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_QuickTimeMovieComponent.cpp; path = ../../src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84A488ED08A22E4900752A2B /* juce_QuickTimeMovieComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_QuickTimeMovieComponent.h; path = ../../src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.h; sourceTree = SOURCE_ROOT; }; + 84A488EF08A22E4900752A2B /* juce_AlertWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AlertWindow.cpp; path = ../../src/juce_appframework/gui/components/windows/juce_AlertWindow.cpp; sourceTree = SOURCE_ROOT; }; + 84A488F008A22E4900752A2B /* juce_AlertWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AlertWindow.h; path = ../../src/juce_appframework/gui/components/windows/juce_AlertWindow.h; sourceTree = SOURCE_ROOT; }; + 84A488F108A22E4900752A2B /* juce_DialogWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DialogWindow.cpp; path = ../../src/juce_appframework/gui/components/windows/juce_DialogWindow.cpp; sourceTree = SOURCE_ROOT; }; + 84A488F208A22E4900752A2B /* juce_DialogWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DialogWindow.h; path = ../../src/juce_appframework/gui/components/windows/juce_DialogWindow.h; sourceTree = SOURCE_ROOT; }; + 84A488F708A22E4900752A2B /* juce_ResizableWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableWindow.cpp; path = ../../src/juce_appframework/gui/components/windows/juce_ResizableWindow.cpp; sourceTree = SOURCE_ROOT; }; + 84A488F808A22E4900752A2B /* juce_ResizableWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ResizableWindow.h; path = ../../src/juce_appframework/gui/components/windows/juce_ResizableWindow.h; sourceTree = SOURCE_ROOT; }; + 84A488F908A22E4900752A2B /* juce_SplashScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SplashScreen.cpp; path = ../../src/juce_appframework/gui/components/windows/juce_SplashScreen.cpp; sourceTree = SOURCE_ROOT; }; + 84A488FA08A22E4900752A2B /* juce_SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SplashScreen.h; path = ../../src/juce_appframework/gui/components/windows/juce_SplashScreen.h; sourceTree = SOURCE_ROOT; }; + 84A488FB08A22E4900752A2B /* juce_ThreadWithProgressWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ThreadWithProgressWindow.cpp; path = ../../src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.cpp; sourceTree = SOURCE_ROOT; }; + 84A488FC08A22E4900752A2B /* juce_ThreadWithProgressWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ThreadWithProgressWindow.h; path = ../../src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.h; sourceTree = SOURCE_ROOT; }; + 84A488FD08A22E4900752A2B /* juce_TooltipWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TooltipWindow.cpp; path = ../../src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp; sourceTree = SOURCE_ROOT; }; + 84A488FE08A22E4900752A2B /* juce_TooltipWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TooltipWindow.h; path = ../../src/juce_appframework/gui/components/windows/juce_TooltipWindow.h; sourceTree = SOURCE_ROOT; }; + 84A4890108A22E4900752A2B /* juce_Brush.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Brush.cpp; path = ../../src/juce_appframework/gui/graphics/brushes/juce_Brush.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890208A22E4900752A2B /* juce_Brush.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Brush.h; path = ../../src/juce_appframework/gui/graphics/brushes/juce_Brush.h; sourceTree = SOURCE_ROOT; }; + 84A4890308A22E4900752A2B /* juce_GradientBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GradientBrush.cpp; path = ../../src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890408A22E4900752A2B /* juce_GradientBrush.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GradientBrush.h; path = ../../src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.h; sourceTree = SOURCE_ROOT; }; + 84A4890508A22E4900752A2B /* juce_ImageBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageBrush.cpp; path = ../../src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890608A22E4900752A2B /* juce_ImageBrush.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImageBrush.h; path = ../../src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.h; sourceTree = SOURCE_ROOT; }; + 84A4890708A22E4900752A2B /* juce_SolidColourBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SolidColourBrush.cpp; path = ../../src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890808A22E4900752A2B /* juce_SolidColourBrush.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SolidColourBrush.h; path = ../../src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.h; sourceTree = SOURCE_ROOT; }; + 84A4890A08A22E4900752A2B /* juce_Colour.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colour.cpp; path = ../../src/juce_appframework/gui/graphics/colour/juce_Colour.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890B08A22E4900752A2B /* juce_Colour.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Colour.h; path = ../../src/juce_appframework/gui/graphics/colour/juce_Colour.h; sourceTree = SOURCE_ROOT; }; + 84A4890C08A22E4900752A2B /* juce_ColourGradient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourGradient.cpp; path = ../../src/juce_appframework/gui/graphics/colour/juce_ColourGradient.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890D08A22E4900752A2B /* juce_ColourGradient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ColourGradient.h; path = ../../src/juce_appframework/gui/graphics/colour/juce_ColourGradient.h; sourceTree = SOURCE_ROOT; }; + 84A4890E08A22E4900752A2B /* juce_Colours.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colours.cpp; path = ../../src/juce_appframework/gui/graphics/colour/juce_Colours.cpp; sourceTree = SOURCE_ROOT; }; + 84A4890F08A22E4900752A2B /* juce_Colours.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Colours.h; path = ../../src/juce_appframework/gui/graphics/colour/juce_Colours.h; sourceTree = SOURCE_ROOT; }; + 84A4891008A22E4900752A2B /* juce_PixelFormats.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PixelFormats.h; path = ../../src/juce_appframework/gui/graphics/colour/juce_PixelFormats.h; sourceTree = SOURCE_ROOT; }; + 84A4891208A22E4900752A2B /* juce_EdgeTable.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_EdgeTable.cpp; path = ../../src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.cpp; sourceTree = SOURCE_ROOT; }; + 84A4891308A22E4900752A2B /* juce_EdgeTable.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_EdgeTable.h; path = ../../src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.h; sourceTree = SOURCE_ROOT; }; + 84A4891408A22E4900752A2B /* juce_Graphics.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Graphics.cpp; path = ../../src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp; sourceTree = SOURCE_ROOT; }; + 84A4891508A22E4900752A2B /* juce_Graphics.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Graphics.h; path = ../../src/juce_appframework/gui/graphics/contexts/juce_Graphics.h; sourceTree = SOURCE_ROOT; }; + 84A4891608A22E4900752A2B /* juce_Justification.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Justification.cpp; path = ../../src/juce_appframework/gui/graphics/contexts/juce_Justification.cpp; sourceTree = SOURCE_ROOT; }; + 84A4891708A22E4900752A2B /* juce_Justification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Justification.h; path = ../../src/juce_appframework/gui/graphics/contexts/juce_Justification.h; sourceTree = SOURCE_ROOT; }; + 84A4891908A22E4900752A2B /* juce_Drawable.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Drawable.cpp; path = ../../src/juce_appframework/gui/graphics/drawables/juce_Drawable.cpp; sourceTree = SOURCE_ROOT; }; + 84A4891A08A22E4900752A2B /* juce_Drawable.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Drawable.h; path = ../../src/juce_appframework/gui/graphics/drawables/juce_Drawable.h; sourceTree = SOURCE_ROOT; }; + 84A4891B08A22E4A00752A2B /* juce_DrawableComposite.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableComposite.cpp; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.cpp; sourceTree = SOURCE_ROOT; }; + 84A4891C08A22E4A00752A2B /* juce_DrawableComposite.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DrawableComposite.h; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.h; sourceTree = SOURCE_ROOT; }; + 84A4891D08A22E4A00752A2B /* juce_DrawableImage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableImage.cpp; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.cpp; sourceTree = SOURCE_ROOT; }; + 84A4891E08A22E4A00752A2B /* juce_DrawableImage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DrawableImage.h; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.h; sourceTree = SOURCE_ROOT; }; + 84A4891F08A22E4A00752A2B /* juce_DrawablePath.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawablePath.cpp; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892008A22E4A00752A2B /* juce_DrawablePath.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DrawablePath.h; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.h; sourceTree = SOURCE_ROOT; }; + 84A4892108A22E4A00752A2B /* juce_DrawableText.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableText.cpp; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableText.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892208A22E4A00752A2B /* juce_DrawableText.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DrawableText.h; path = ../../src/juce_appframework/gui/graphics/drawables/juce_DrawableText.h; sourceTree = SOURCE_ROOT; }; + 84A4892408A22E4A00752A2B /* juce_DropShadowEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadowEffect.cpp; path = ../../src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892508A22E4A00752A2B /* juce_DropShadowEffect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DropShadowEffect.h; path = ../../src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.h; sourceTree = SOURCE_ROOT; }; + 84A4892608A22E4A00752A2B /* juce_GlowEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GlowEffect.cpp; path = ../../src/juce_appframework/gui/graphics/effects/juce_GlowEffect.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892708A22E4A00752A2B /* juce_GlowEffect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GlowEffect.h; path = ../../src/juce_appframework/gui/graphics/effects/juce_GlowEffect.h; sourceTree = SOURCE_ROOT; }; + 84A4892808A22E4A00752A2B /* juce_ImageEffectFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImageEffectFilter.h; path = ../../src/juce_appframework/gui/graphics/effects/juce_ImageEffectFilter.h; sourceTree = SOURCE_ROOT; }; + 84A4892908A22E4A00752A2B /* juce_ReduceOpacityEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReduceOpacityEffect.cpp; path = ../../src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892A08A22E4A00752A2B /* juce_ReduceOpacityEffect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ReduceOpacityEffect.h; path = ../../src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.h; sourceTree = SOURCE_ROOT; }; + 84A4892C08A22E4A00752A2B /* juce_Font.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Font.cpp; path = ../../src/juce_appframework/gui/graphics/fonts/juce_Font.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892D08A22E4A00752A2B /* juce_Font.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Font.h; path = ../../src/juce_appframework/gui/graphics/fonts/juce_Font.h; sourceTree = SOURCE_ROOT; }; + 84A4892E08A22E4A00752A2B /* juce_GlyphArrangement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GlyphArrangement.cpp; path = ../../src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.cpp; sourceTree = SOURCE_ROOT; }; + 84A4892F08A22E4A00752A2B /* juce_GlyphArrangement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GlyphArrangement.h; path = ../../src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.h; sourceTree = SOURCE_ROOT; }; + 84A4893008A22E4A00752A2B /* juce_TextLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextLayout.cpp; path = ../../src/juce_appframework/gui/graphics/fonts/juce_TextLayout.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893108A22E4A00752A2B /* juce_TextLayout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TextLayout.h; path = ../../src/juce_appframework/gui/graphics/fonts/juce_TextLayout.h; sourceTree = SOURCE_ROOT; }; + 84A4893208A22E4A00752A2B /* juce_Typeface.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Typeface.cpp; path = ../../src/juce_appframework/gui/graphics/fonts/juce_Typeface.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893308A22E4A00752A2B /* juce_Typeface.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Typeface.h; path = ../../src/juce_appframework/gui/graphics/fonts/juce_Typeface.h; sourceTree = SOURCE_ROOT; }; + 84A4893508A22E4A00752A2B /* juce_AffineTransform.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AffineTransform.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893608A22E4A00752A2B /* juce_AffineTransform.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AffineTransform.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.h; sourceTree = SOURCE_ROOT; }; + 84A4893708A22E4A00752A2B /* juce_Line.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Line.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Line.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893808A22E4A00752A2B /* juce_Line.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Line.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Line.h; sourceTree = SOURCE_ROOT; }; + 84A4893908A22E4A00752A2B /* juce_Path.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Path.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Path.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893A08A22E4A00752A2B /* juce_Path.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Path.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Path.h; sourceTree = SOURCE_ROOT; }; + 84A4893B08A22E4A00752A2B /* juce_PathIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathIterator.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_PathIterator.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893C08A22E4A00752A2B /* juce_PathIterator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PathIterator.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_PathIterator.h; sourceTree = SOURCE_ROOT; }; + 84A4893D08A22E4A00752A2B /* juce_PathStrokeType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathStrokeType.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.cpp; sourceTree = SOURCE_ROOT; }; + 84A4893E08A22E4A00752A2B /* juce_PathStrokeType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PathStrokeType.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.h; sourceTree = SOURCE_ROOT; }; + 84A4893F08A22E4A00752A2B /* juce_Point.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Point.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Point.cpp; sourceTree = SOURCE_ROOT; }; + 84A4894008A22E4A00752A2B /* juce_Point.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Point.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Point.h; sourceTree = SOURCE_ROOT; }; + 84A4894108A22E4A00752A2B /* juce_Rectangle.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Rectangle.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Rectangle.cpp; sourceTree = SOURCE_ROOT; }; + 84A4894208A22E4A00752A2B /* juce_Rectangle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Rectangle.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_Rectangle.h; sourceTree = SOURCE_ROOT; }; + 84A4894308A22E4A00752A2B /* juce_RectangleList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RectangleList.cpp; path = ../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.cpp; sourceTree = SOURCE_ROOT; }; + 84A4894408A22E4A00752A2B /* juce_RectangleList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_RectangleList.h; path = ../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.h; sourceTree = SOURCE_ROOT; }; + 84A4897208A22E4A00752A2B /* juce_GIFLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GIFLoader.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp; sourceTree = SOURCE_ROOT; }; + 84A4897308A22E4A00752A2B /* juce_GIFLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GIFLoader.h; path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.h; sourceTree = SOURCE_ROOT; }; + 84A4897408A22E4A00752A2B /* juce_JPEGLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_JPEGLoader.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_JPEGLoader.cpp; sourceTree = SOURCE_ROOT; }; + 84A4897508A22E4A00752A2B /* juce_PNGLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PNGLoader.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_PNGLoader.cpp; sourceTree = SOURCE_ROOT; }; + 84A4898608A22E4A00752A2B /* juce_Image.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Image.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/juce_Image.cpp; sourceTree = SOURCE_ROOT; }; + 84A4898708A22E4A00752A2B /* juce_Image.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Image.h; path = ../../src/juce_appframework/gui/graphics/imaging/juce_Image.h; sourceTree = SOURCE_ROOT; }; + 84A4898808A22E4A00752A2B /* juce_ImageCache.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageCache.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/juce_ImageCache.cpp; sourceTree = SOURCE_ROOT; }; + 84A4898908A22E4A00752A2B /* juce_ImageCache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImageCache.h; path = ../../src/juce_appframework/gui/graphics/imaging/juce_ImageCache.h; sourceTree = SOURCE_ROOT; }; + 84A4898A08A22E4A00752A2B /* juce_ImageConvolutionKernel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageConvolutionKernel.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.cpp; sourceTree = SOURCE_ROOT; }; + 84A4898B08A22E4A00752A2B /* juce_ImageConvolutionKernel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImageConvolutionKernel.h; path = ../../src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.h; sourceTree = SOURCE_ROOT; }; + 84A4898C08A22E4A00752A2B /* juce_ImageFileFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageFileFormat.cpp; path = ../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.cpp; sourceTree = SOURCE_ROOT; }; + 84A4898D08A22E4A00752A2B /* juce_ImageFileFormat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImageFileFormat.h; path = ../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.h; sourceTree = SOURCE_ROOT; }; + 84A4899908A22E4A00752A2B /* juce_Atomic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Atomic.h; path = ../../src/juce_core/basics/juce_Atomic.h; sourceTree = SOURCE_ROOT; }; + 84A4899A08A22E4A00752A2B /* juce_DataConversions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DataConversions.h; path = ../../src/juce_core/basics/juce_DataConversions.h; sourceTree = SOURCE_ROOT; }; + 84A4899B08A22E4A00752A2B /* juce_FileLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileLogger.cpp; path = ../../src/juce_core/basics/juce_FileLogger.cpp; sourceTree = SOURCE_ROOT; }; + 84A4899C08A22E4A00752A2B /* juce_FileLogger.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileLogger.h; path = ../../src/juce_core/basics/juce_FileLogger.h; sourceTree = SOURCE_ROOT; }; + 84A4899D08A22E4A00752A2B /* juce_Initialisation.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Initialisation.h; path = ../../src/juce_core/basics/juce_Initialisation.h; sourceTree = SOURCE_ROOT; }; + 84A4899E08A22E4A00752A2B /* juce_Logger.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Logger.cpp; path = ../../src/juce_core/basics/juce_Logger.cpp; sourceTree = SOURCE_ROOT; }; + 84A4899F08A22E4A00752A2B /* juce_Logger.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Logger.h; path = ../../src/juce_core/basics/juce_Logger.h; sourceTree = SOURCE_ROOT; }; + 84A489A008A22E4A00752A2B /* juce_MathsFunctions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MathsFunctions.h; path = ../../src/juce_core/basics/juce_MathsFunctions.h; sourceTree = SOURCE_ROOT; }; + 84A489A108A22E4A00752A2B /* juce_Memory.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Memory.h; path = ../../src/juce_core/basics/juce_Memory.h; sourceTree = SOURCE_ROOT; }; + 84A489A208A22E4A00752A2B /* juce_PlatformDefs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PlatformDefs.h; path = ../../src/juce_core/basics/juce_PlatformDefs.h; sourceTree = SOURCE_ROOT; }; + 84A489A308A22E4A00752A2B /* juce_Random.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Random.cpp; path = ../../src/juce_core/basics/juce_Random.cpp; sourceTree = SOURCE_ROOT; }; + 84A489A408A22E4A00752A2B /* juce_Random.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Random.h; path = ../../src/juce_core/basics/juce_Random.h; sourceTree = SOURCE_ROOT; }; + 84A489A508A22E4A00752A2B /* juce_RelativeTime.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeTime.cpp; path = ../../src/juce_core/basics/juce_RelativeTime.cpp; sourceTree = SOURCE_ROOT; }; + 84A489A608A22E4A00752A2B /* juce_RelativeTime.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_RelativeTime.h; sourceTree = ""; }; + 84A489A708A22E4A00752A2B /* juce_Singleton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Singleton.h; path = ../../src/juce_core/basics/juce_Singleton.h; sourceTree = SOURCE_ROOT; }; + 84A489A808A22E4A00752A2B /* juce_StandardHeader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_StandardHeader.h; path = ../../src/juce_core/basics/juce_StandardHeader.h; sourceTree = SOURCE_ROOT; }; + 84A489A908A22E4A00752A2B /* juce_SystemStats.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemStats.cpp; path = ../../src/juce_core/basics/juce_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; + 84A489AA08A22E4A00752A2B /* juce_SystemStats.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SystemStats.h; path = ../../src/juce_core/basics/juce_SystemStats.h; sourceTree = SOURCE_ROOT; }; + 84A489AB08A22E4A00752A2B /* juce_Time.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Time.cpp; path = ../../src/juce_core/basics/juce_Time.cpp; sourceTree = SOURCE_ROOT; }; + 84A489AC08A22E4A00752A2B /* juce_Time.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Time.h; path = ../../src/juce_core/basics/juce_Time.h; sourceTree = SOURCE_ROOT; }; + 84A489AE08A22E4A00752A2B /* juce_Array.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Array.h; path = ../../src/juce_core/containers/juce_Array.h; sourceTree = SOURCE_ROOT; }; + 84A489AF08A22E4A00752A2B /* juce_ArrayAllocationBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ArrayAllocationBase.h; path = ../../src/juce_core/containers/juce_ArrayAllocationBase.h; sourceTree = SOURCE_ROOT; }; + 84A489B008A22E4A00752A2B /* juce_BitArray.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BitArray.cpp; path = ../../src/juce_core/containers/juce_BitArray.cpp; sourceTree = SOURCE_ROOT; }; + 84A489B108A22E4A00752A2B /* juce_BitArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_BitArray.h; path = ../../src/juce_core/containers/juce_BitArray.h; sourceTree = SOURCE_ROOT; }; + 84A489B208A22E4A00752A2B /* juce_ElementComparator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ElementComparator.h; path = ../../src/juce_core/containers/juce_ElementComparator.h; sourceTree = SOURCE_ROOT; }; + 84A489B308A22E4A00752A2B /* juce_MemoryBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryBlock.cpp; path = ../../src/juce_core/containers/juce_MemoryBlock.cpp; sourceTree = SOURCE_ROOT; }; + 84A489B408A22E4A00752A2B /* juce_MemoryBlock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MemoryBlock.h; path = ../../src/juce_core/containers/juce_MemoryBlock.h; sourceTree = SOURCE_ROOT; }; + 84A489B508A22E4A00752A2B /* juce_OwnedArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_OwnedArray.h; path = ../../src/juce_core/containers/juce_OwnedArray.h; sourceTree = SOURCE_ROOT; }; + 84A489B608A22E4A00752A2B /* juce_PropertySet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertySet.cpp; path = ../../src/juce_core/containers/juce_PropertySet.cpp; sourceTree = SOURCE_ROOT; }; + 84A489B708A22E4A00752A2B /* juce_PropertySet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PropertySet.h; path = ../../src/juce_core/containers/juce_PropertySet.h; sourceTree = SOURCE_ROOT; }; + 84A489B808A22E4A00752A2B /* juce_ReferenceCountedArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedArray.h; path = ../../src/juce_core/containers/juce_ReferenceCountedArray.h; sourceTree = SOURCE_ROOT; }; + 84A489B908A22E4A00752A2B /* juce_ReferenceCountedObject.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedObject.h; path = ../../src/juce_core/containers/juce_ReferenceCountedObject.h; sourceTree = SOURCE_ROOT; }; + 84A489BA08A22E4A00752A2B /* juce_SortedSet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SortedSet.h; path = ../../src/juce_core/containers/juce_SortedSet.h; sourceTree = SOURCE_ROOT; }; + 84A489BB08A22E4A00752A2B /* juce_SparseSet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SparseSet.h; path = ../../src/juce_core/containers/juce_SparseSet.h; sourceTree = SOURCE_ROOT; }; + 84A489BC08A22E4A00752A2B /* juce_VoidArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_VoidArray.h; path = ../../src/juce_core/containers/juce_VoidArray.h; sourceTree = SOURCE_ROOT; }; + 84A489BE08A22E4A00752A2B /* juce_BlowFish.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BlowFish.cpp; path = ../../src/juce_core/cryptography/juce_BlowFish.cpp; sourceTree = SOURCE_ROOT; }; + 84A489BF08A22E4A00752A2B /* juce_BlowFish.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_BlowFish.h; path = ../../src/juce_core/cryptography/juce_BlowFish.h; sourceTree = SOURCE_ROOT; }; + 84A489C008A22E4A00752A2B /* juce_MD5.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MD5.cpp; path = ../../src/juce_core/cryptography/juce_MD5.cpp; sourceTree = SOURCE_ROOT; }; + 84A489C108A22E4A00752A2B /* juce_MD5.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MD5.h; path = ../../src/juce_core/cryptography/juce_MD5.h; sourceTree = SOURCE_ROOT; }; + 84A489C208A22E4A00752A2B /* juce_Primes.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Primes.cpp; path = ../../src/juce_core/cryptography/juce_Primes.cpp; sourceTree = SOURCE_ROOT; }; + 84A489C308A22E4A00752A2B /* juce_Primes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Primes.h; path = ../../src/juce_core/cryptography/juce_Primes.h; sourceTree = SOURCE_ROOT; }; + 84A489C408A22E4A00752A2B /* juce_RSAKey.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RSAKey.cpp; path = ../../src/juce_core/cryptography/juce_RSAKey.cpp; sourceTree = SOURCE_ROOT; }; + 84A489C508A22E4A00752A2B /* juce_RSAKey.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_RSAKey.h; path = ../../src/juce_core/cryptography/juce_RSAKey.h; sourceTree = SOURCE_ROOT; }; + 84A489C808A22E4A00752A2B /* juce_DirectoryIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryIterator.cpp; path = ../../src/juce_core/io/files/juce_DirectoryIterator.cpp; sourceTree = SOURCE_ROOT; }; + 84A489C908A22E4A00752A2B /* juce_DirectoryIterator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryIterator.h; path = ../../src/juce_core/io/files/juce_DirectoryIterator.h; sourceTree = SOURCE_ROOT; }; + 84A489CA08A22E4A00752A2B /* juce_File.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_File.cpp; path = ../../src/juce_core/io/files/juce_File.cpp; sourceTree = SOURCE_ROOT; }; + 84A489CB08A22E4A00752A2B /* juce_File.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_File.h; path = ../../src/juce_core/io/files/juce_File.h; sourceTree = SOURCE_ROOT; }; + 84A489CC08A22E4A00752A2B /* juce_FileInputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileInputStream.cpp; path = ../../src/juce_core/io/files/juce_FileInputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489CD08A22E4A00752A2B /* juce_FileInputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileInputStream.h; path = ../../src/juce_core/io/files/juce_FileInputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489CE08A22E4A00752A2B /* juce_FileOutputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileOutputStream.cpp; path = ../../src/juce_core/io/files/juce_FileOutputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489CF08A22E4A00752A2B /* juce_FileOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileOutputStream.h; path = ../../src/juce_core/io/files/juce_FileOutputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489D008A22E4A00752A2B /* juce_FileSearchPath.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPath.cpp; path = ../../src/juce_core/io/files/juce_FileSearchPath.cpp; sourceTree = SOURCE_ROOT; }; + 84A489D108A22E4A00752A2B /* juce_FileSearchPath.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPath.h; path = ../../src/juce_core/io/files/juce_FileSearchPath.h; sourceTree = SOURCE_ROOT; }; + 84A489D208A22E4A00752A2B /* juce_InputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InputStream.cpp; path = ../../src/juce_core/io/juce_InputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489D308A22E4A00752A2B /* juce_InputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_InputStream.h; path = ../../src/juce_core/io/juce_InputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489D408A22E4A00752A2B /* juce_OutputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OutputStream.cpp; path = ../../src/juce_core/io/juce_OutputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489D508A22E4A00752A2B /* juce_OutputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_OutputStream.h; path = ../../src/juce_core/io/juce_OutputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489D708A22E4A00752A2B /* juce_URL.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_URL.cpp; path = ../../src/juce_core/io/network/juce_URL.cpp; sourceTree = SOURCE_ROOT; }; + 84A489D808A22E4A00752A2B /* juce_URL.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_URL.h; path = ../../src/juce_core/io/network/juce_URL.h; sourceTree = SOURCE_ROOT; }; + 84A489DA08A22E4A00752A2B /* juce_BufferedInputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferedInputStream.cpp; path = ../../src/juce_core/io/streams/juce_BufferedInputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489DB08A22E4A00752A2B /* juce_BufferedInputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_BufferedInputStream.h; path = ../../src/juce_core/io/streams/juce_BufferedInputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489DC08A22E4A00752A2B /* juce_GZIPCompressorOutputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GZIPCompressorOutputStream.cpp; path = ../../src/juce_core/io/streams/juce_GZIPCompressorOutputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489DD08A22E4A00752A2B /* juce_GZIPCompressorOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GZIPCompressorOutputStream.h; path = ../../src/juce_core/io/streams/juce_GZIPCompressorOutputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489DE08A22E4A00752A2B /* juce_GZIPDecompressorInputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GZIPDecompressorInputStream.cpp; path = ../../src/juce_core/io/streams/juce_GZIPDecompressorInputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489DF08A22E4A00752A2B /* juce_GZIPDecompressorInputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_GZIPDecompressorInputStream.h; path = ../../src/juce_core/io/streams/juce_GZIPDecompressorInputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489E008A22E4A00752A2B /* juce_MemoryInputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryInputStream.cpp; path = ../../src/juce_core/io/streams/juce_MemoryInputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489E108A22E4A00752A2B /* juce_MemoryInputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MemoryInputStream.h; path = ../../src/juce_core/io/streams/juce_MemoryInputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489E208A22E4A00752A2B /* juce_MemoryOutputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryOutputStream.cpp; path = ../../src/juce_core/io/streams/juce_MemoryOutputStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489E308A22E4A00752A2B /* juce_MemoryOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_MemoryOutputStream.h; path = ../../src/juce_core/io/streams/juce_MemoryOutputStream.h; sourceTree = SOURCE_ROOT; }; + 84A489E408A22E4A00752A2B /* juce_SubregionStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SubregionStream.cpp; path = ../../src/juce_core/io/streams/juce_SubregionStream.cpp; sourceTree = SOURCE_ROOT; }; + 84A489E508A22E4A00752A2B /* juce_SubregionStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SubregionStream.h; path = ../../src/juce_core/io/streams/juce_SubregionStream.h; sourceTree = SOURCE_ROOT; }; + 84A48A0008A22E4A00752A2B /* juce_PerformanceCounter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PerformanceCounter.cpp; path = ../../src/juce_core/misc/juce_PerformanceCounter.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0108A22E4A00752A2B /* juce_PerformanceCounter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PerformanceCounter.h; path = ../../src/juce_core/misc/juce_PerformanceCounter.h; sourceTree = SOURCE_ROOT; }; + 84A48A0208A22E4A00752A2B /* juce_PlatformUtilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_PlatformUtilities.h; path = ../../src/juce_core/misc/juce_PlatformUtilities.h; sourceTree = SOURCE_ROOT; }; + 84A48A0308A22E4A00752A2B /* juce_Uuid.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Uuid.cpp; path = ../../src/juce_core/misc/juce_Uuid.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0408A22E4A00752A2B /* juce_Uuid.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Uuid.h; path = ../../src/juce_core/misc/juce_Uuid.h; sourceTree = SOURCE_ROOT; }; + 84A48A0508A22E4A00752A2B /* juce_ZipFile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ZipFile.cpp; path = ../../src/juce_core/misc/juce_ZipFile.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0608A22E4A00752A2B /* juce_ZipFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ZipFile.h; path = ../../src/juce_core/misc/juce_ZipFile.h; sourceTree = SOURCE_ROOT; }; + 84A48A0808A22E4A00752A2B /* juce_LocalisedStrings.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LocalisedStrings.cpp; path = ../../src/juce_core/text/juce_LocalisedStrings.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0908A22E4A00752A2B /* juce_LocalisedStrings.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_LocalisedStrings.h; path = ../../src/juce_core/text/juce_LocalisedStrings.h; sourceTree = SOURCE_ROOT; }; + 84A48A0A08A22E4A00752A2B /* juce_String.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_String.cpp; path = ../../src/juce_core/text/juce_String.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0B08A22E4A00752A2B /* juce_String.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_String.h; path = ../../src/juce_core/text/juce_String.h; sourceTree = SOURCE_ROOT; }; + 84A48A0C08A22E4A00752A2B /* juce_StringArray.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringArray.cpp; path = ../../src/juce_core/text/juce_StringArray.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0D08A22E4A00752A2B /* juce_StringArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_StringArray.h; path = ../../src/juce_core/text/juce_StringArray.h; sourceTree = SOURCE_ROOT; }; + 84A48A0E08A22E4A00752A2B /* juce_StringPairArray.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringPairArray.cpp; path = ../../src/juce_core/text/juce_StringPairArray.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A0F08A22E4A00752A2B /* juce_StringPairArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_StringPairArray.h; path = ../../src/juce_core/text/juce_StringPairArray.h; sourceTree = SOURCE_ROOT; }; + 84A48A1108A22E4A00752A2B /* juce_XmlDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlDocument.cpp; path = ../../src/juce_core/text/juce_XmlDocument.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A1208A22E4A00752A2B /* juce_XmlDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_XmlDocument.h; path = ../../src/juce_core/text/juce_XmlDocument.h; sourceTree = SOURCE_ROOT; }; + 84A48A1308A22E4A00752A2B /* juce_XmlElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlElement.cpp; path = ../../src/juce_core/text/juce_XmlElement.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A1408A22E4A00752A2B /* juce_XmlElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_XmlElement.h; path = ../../src/juce_core/text/juce_XmlElement.h; sourceTree = SOURCE_ROOT; }; + 84A48A1708A22E4A00752A2B /* juce_CriticalSection.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_CriticalSection.h; path = ../../src/juce_core/threads/juce_CriticalSection.h; sourceTree = SOURCE_ROOT; }; + 84A48A1808A22E4A00752A2B /* juce_InterProcessLock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterProcessLock.cpp; path = ../../src/juce_core/threads/juce_InterProcessLock.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A1908A22E4A00752A2B /* juce_InterProcessLock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_InterProcessLock.h; path = ../../src/juce_core/threads/juce_InterProcessLock.h; sourceTree = SOURCE_ROOT; }; + 84A48A1B08A22E4A00752A2B /* juce_Process.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Process.h; path = ../../src/juce_core/threads/juce_Process.h; sourceTree = SOURCE_ROOT; }; + 84A48A1C08A22E4A00752A2B /* juce_ReadWriteLock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReadWriteLock.cpp; path = ../../src/juce_core/threads/juce_ReadWriteLock.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A1D08A22E4A00752A2B /* juce_ReadWriteLock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ReadWriteLock.h; path = ../../src/juce_core/threads/juce_ReadWriteLock.h; sourceTree = SOURCE_ROOT; }; + 84A48A1E08A22E4A00752A2B /* juce_ScopedLock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ScopedLock.h; path = ../../src/juce_core/threads/juce_ScopedLock.h; sourceTree = SOURCE_ROOT; }; + 84A48A1F08A22E4A00752A2B /* juce_ScopedReadLock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ScopedReadLock.h; path = ../../src/juce_core/threads/juce_ScopedReadLock.h; sourceTree = SOURCE_ROOT; }; + 84A48A2008A22E4A00752A2B /* juce_ScopedWriteLock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ScopedWriteLock.h; path = ../../src/juce_core/threads/juce_ScopedWriteLock.h; sourceTree = SOURCE_ROOT; }; + 84A48A2108A22E4A00752A2B /* juce_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Thread.cpp; path = ../../src/juce_core/threads/juce_Thread.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A2208A22E4A00752A2B /* juce_Thread.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Thread.h; path = ../../src/juce_core/threads/juce_Thread.h; sourceTree = SOURCE_ROOT; }; + 84A48A2308A22E4A00752A2B /* juce_ThreadPool.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ThreadPool.cpp; path = ../../src/juce_core/threads/juce_ThreadPool.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A2408A22E4A00752A2B /* juce_ThreadPool.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ThreadPool.h; path = ../../src/juce_core/threads/juce_ThreadPool.h; sourceTree = SOURCE_ROOT; }; + 84A48A2508A22E4A00752A2B /* juce_TimeSliceThread.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TimeSliceThread.cpp; path = ../../src/juce_core/threads/juce_TimeSliceThread.cpp; sourceTree = SOURCE_ROOT; }; + 84A48A2608A22E4A00752A2B /* juce_TimeSliceThread.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_TimeSliceThread.h; path = ../../src/juce_core/threads/juce_TimeSliceThread.h; sourceTree = SOURCE_ROOT; }; + 84A48A2708A22E4A00752A2B /* juce_WaitableEvent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_WaitableEvent.h; path = ../../src/juce_core/threads/juce_WaitableEvent.h; sourceTree = SOURCE_ROOT; }; + 84C0EA5C0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilterAudioSource.cpp; path = ../../src/juce_appframework/audio/audio_sources/juce_IIRFilterAudioSource.cpp; sourceTree = SOURCE_ROOT; }; + 84C0EA5D0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilterAudioSource.h; path = ../../src/juce_appframework/audio/audio_sources/juce_IIRFilterAudioSource.h; sourceTree = SOURCE_ROOT; }; + 84D296BB09B763190026C535 /* juce_PropertiesFile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_PropertiesFile.cpp; sourceTree = ""; }; + 84D296BC09B763190026C535 /* juce_PropertiesFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_PropertiesFile.h; sourceTree = ""; }; + 84E8209209729D2A0097675B /* juce_AudioFormatManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_AudioFormatManager.cpp; sourceTree = ""; }; + 84E8209309729D2A0097675B /* juce_AudioFormatManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_AudioFormatManager.h; sourceTree = ""; }; + 84F1B8D809499F1400AD8EDE /* juce_MidiKeyboardComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_MidiKeyboardComponent.cpp; sourceTree = ""; }; + 84F1B8D909499F1400AD8EDE /* juce_MidiKeyboardComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_MidiKeyboardComponent.h; sourceTree = ""; }; + 84F1F05B0A36CE96008CCC5E /* juce_FilenameComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FilenameComponent.cpp; path = filebrowser/juce_FilenameComponent.cpp; sourceTree = ""; }; + 84F1F05C0A36CE96008CCC5E /* juce_FilenameComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FilenameComponent.h; path = filebrowser/juce_FilenameComponent.h; sourceTree = ""; }; + 84F1F05F0A36CF06008CCC5E /* juce_BooleanPropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_BooleanPropertyComponent.cpp; sourceTree = ""; }; + 84F1F0600A36CF06008CCC5E /* juce_BooleanPropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_BooleanPropertyComponent.h; sourceTree = ""; }; + 84F1F0630A36CF31008CCC5E /* juce_MagnifierComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_MagnifierComponent.cpp; sourceTree = ""; }; + 84F1F0640A36CF31008CCC5E /* juce_MagnifierComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_MagnifierComponent.h; sourceTree = ""; }; + 84F1F0670A36CF45008CCC5E /* juce_KeyboardFocusTraverser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_KeyboardFocusTraverser.cpp; sourceTree = ""; }; + 84F1F0680A36CF45008CCC5E /* juce_KeyboardFocusTraverser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_KeyboardFocusTraverser.h; sourceTree = ""; }; + 84F46B7C098685BD0079F3FA /* juce_ComponentBoundsConstrainer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ComponentBoundsConstrainer.cpp; sourceTree = ""; }; + 84F46B7D098685BD0079F3FA /* juce_ComponentBoundsConstrainer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ComponentBoundsConstrainer.h; sourceTree = ""; }; + 84F524FE0B32A8D500597B73 /* juce_ApplicationProperties.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ApplicationProperties.cpp; sourceTree = ""; }; + 84F524FF0B32A8D500597B73 /* juce_ApplicationProperties.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ApplicationProperties.h; sourceTree = ""; }; + 84F555280A2235E100A8311C /* juce_MultiDocumentPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_MultiDocumentPanel.cpp; sourceTree = ""; }; + 84F555290A2235E100A8311C /* juce_MultiDocumentPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_MultiDocumentPanel.h; sourceTree = ""; }; + 84F5598209CACFDD00AC5000 /* juce_Socket.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_Socket.cpp; sourceTree = ""; }; + 84F5598309CACFDD00AC5000 /* juce_Socket.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_Socket.h; sourceTree = ""; }; + 84F5598609CACFF700AC5000 /* juce_NamedPipe.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_NamedPipe.cpp; sourceTree = ""; }; + 84F5598709CACFF700AC5000 /* juce_NamedPipe.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_NamedPipe.h; sourceTree = ""; }; + 84F589940A01491F00B80939 /* juce_TooltipClient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_TooltipClient.h; sourceTree = ""; }; + 84F589980A01493600B80939 /* juce_ApplicationCommandID.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ApplicationCommandID.h; sourceTree = ""; }; + 84F589990A01493600B80939 /* juce_ApplicationCommandInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ApplicationCommandInfo.cpp; sourceTree = ""; }; + 84F5899A0A01493600B80939 /* juce_ApplicationCommandInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ApplicationCommandInfo.h; sourceTree = ""; }; + 84F5899B0A01493600B80939 /* juce_ApplicationCommandManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ApplicationCommandManager.cpp; sourceTree = ""; }; + 84F5899C0A01493600B80939 /* juce_ApplicationCommandManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ApplicationCommandManager.h; sourceTree = ""; }; + 84F5899D0A01493600B80939 /* juce_ApplicationCommandTarget.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ApplicationCommandTarget.cpp; sourceTree = ""; }; + 84F5899E0A01493600B80939 /* juce_ApplicationCommandTarget.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ApplicationCommandTarget.h; sourceTree = ""; }; + 84F593AC09855679008153BA /* juce_DocumentWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_DocumentWindow.cpp; sourceTree = ""; }; + 84F593AD09855679008153BA /* juce_DocumentWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_DocumentWindow.h; sourceTree = ""; }; + 84F593B009855693008153BA /* juce_LassoComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_LassoComponent.h; sourceTree = ""; }; + 84F690E10B3444E500ABAE1C /* bitbuffer.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bitbuffer.c; path = flac/libFLAC/bitbuffer.c; sourceTree = ""; }; + 84F690E20B3444E500ABAE1C /* bitmath.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bitmath.c; path = flac/libFLAC/bitmath.c; sourceTree = ""; }; + 84F690E30B3444E500ABAE1C /* cpu.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = cpu.c; path = flac/libFLAC/cpu.c; sourceTree = ""; }; + 84F690E40B3444E500ABAE1C /* crc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = crc.c; path = flac/libFLAC/crc.c; sourceTree = ""; }; + 84F690E50B3444E500ABAE1C /* fixed.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = fixed.c; path = flac/libFLAC/fixed.c; sourceTree = ""; }; + 84F690E60B3444E500ABAE1C /* float.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = float.c; path = flac/libFLAC/float.c; sourceTree = ""; }; + 84F690E70B3444E500ABAE1C /* format.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = format.c; path = flac/libFLAC/format.c; sourceTree = ""; }; + 84F690E80B3444E500ABAE1C /* lpc_flac.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lpc_flac.c; path = flac/libFLAC/lpc_flac.c; sourceTree = ""; }; + 84F690E90B3444E500ABAE1C /* md5.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = md5.c; path = flac/libFLAC/md5.c; sourceTree = ""; }; + 84F690EA0B3444E500ABAE1C /* memory.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = memory.c; path = flac/libFLAC/memory.c; sourceTree = ""; }; + 84F690EB0B3444E500ABAE1C /* stream_decoder.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stream_decoder.c; path = flac/libFLAC/stream_decoder.c; sourceTree = ""; }; + 84F690EC0B3444E500ABAE1C /* stream_encoder_framing.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stream_encoder_framing.c; path = flac/libFLAC/stream_encoder_framing.c; sourceTree = ""; }; + 84F690ED0B3444E500ABAE1C /* stream_encoder.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stream_encoder.c; path = flac/libFLAC/stream_encoder.c; sourceTree = ""; }; + 84F690EE0B3444E500ABAE1C /* window_flac.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = window_flac.c; path = flac/libFLAC/window_flac.c; sourceTree = ""; }; + 84F690FD0B3444F800ABAE1C /* bitwise.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bitwise.c; path = oggvorbis/bitwise.c; sourceTree = ""; }; + 84F690FE0B3444F800ABAE1C /* framing.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = framing.c; path = oggvorbis/framing.c; sourceTree = ""; }; + 84F691010B34453600ABAE1C /* analysis.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = analysis.c; path = "oggvorbis/libvorbis-1.1.2/lib/analysis.c"; sourceTree = ""; }; + 84F691020B34453600ABAE1C /* bitrate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bitrate.c; path = "oggvorbis/libvorbis-1.1.2/lib/bitrate.c"; sourceTree = ""; }; + 84F691030B34453600ABAE1C /* block.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = block.c; path = "oggvorbis/libvorbis-1.1.2/lib/block.c"; sourceTree = ""; }; + 84F691040B34453600ABAE1C /* codebook.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = codebook.c; path = "oggvorbis/libvorbis-1.1.2/lib/codebook.c"; sourceTree = ""; }; + 84F691050B34453600ABAE1C /* envelope.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = envelope.c; path = "oggvorbis/libvorbis-1.1.2/lib/envelope.c"; sourceTree = ""; }; + 84F691060B34453600ABAE1C /* floor0.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = floor0.c; path = "oggvorbis/libvorbis-1.1.2/lib/floor0.c"; sourceTree = ""; }; + 84F691070B34453600ABAE1C /* floor1.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = floor1.c; path = "oggvorbis/libvorbis-1.1.2/lib/floor1.c"; sourceTree = ""; }; + 84F691080B34453600ABAE1C /* info.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = info.c; path = "oggvorbis/libvorbis-1.1.2/lib/info.c"; sourceTree = ""; }; + 84F691090B34453600ABAE1C /* lpc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lpc.c; path = "oggvorbis/libvorbis-1.1.2/lib/lpc.c"; sourceTree = ""; }; + 84F6910A0B34453600ABAE1C /* lsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lsp.c; path = "oggvorbis/libvorbis-1.1.2/lib/lsp.c"; sourceTree = ""; }; + 84F6910B0B34453600ABAE1C /* mapping0.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mapping0.c; path = "oggvorbis/libvorbis-1.1.2/lib/mapping0.c"; sourceTree = ""; }; + 84F6910C0B34453600ABAE1C /* mdct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mdct.c; path = "oggvorbis/libvorbis-1.1.2/lib/mdct.c"; sourceTree = ""; }; + 84F6910D0B34453600ABAE1C /* psy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = psy.c; path = "oggvorbis/libvorbis-1.1.2/lib/psy.c"; sourceTree = ""; }; + 84F6910E0B34453600ABAE1C /* registry.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = registry.c; path = "oggvorbis/libvorbis-1.1.2/lib/registry.c"; sourceTree = ""; }; + 84F6910F0B34453600ABAE1C /* res0.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = res0.c; path = "oggvorbis/libvorbis-1.1.2/lib/res0.c"; sourceTree = ""; }; + 84F691100B34453600ABAE1C /* sharedbook.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sharedbook.c; path = "oggvorbis/libvorbis-1.1.2/lib/sharedbook.c"; sourceTree = ""; }; + 84F691110B34453600ABAE1C /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = "oggvorbis/libvorbis-1.1.2/lib/smallft.c"; sourceTree = ""; }; + 84F691120B34453600ABAE1C /* synthesis.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = synthesis.c; path = "oggvorbis/libvorbis-1.1.2/lib/synthesis.c"; sourceTree = ""; }; + 84F691140B34453600ABAE1C /* vorbisenc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vorbisenc.c; path = "oggvorbis/libvorbis-1.1.2/lib/vorbisenc.c"; sourceTree = ""; }; + 84F691150B34453600ABAE1C /* vorbisfile.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vorbisfile.c; path = "oggvorbis/libvorbis-1.1.2/lib/vorbisfile.c"; sourceTree = ""; }; + 84F691160B34453600ABAE1C /* window.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = window.c; path = "oggvorbis/libvorbis-1.1.2/lib/window.c"; sourceTree = ""; }; + 84F6B7520C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ChannelRemappingAudioSource.cpp; sourceTree = ""; }; + 84F6B7530C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ChannelRemappingAudioSource.h; sourceTree = ""; }; + 84F7A7AD0A8383A100D36246 /* juce_ToolbarButton.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ToolbarButton.cpp; sourceTree = ""; }; + 84F7A7AE0A8383A100D36246 /* juce_ToolbarButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ToolbarButton.h; sourceTree = ""; }; + 84F7A7B10A8383C200D36246 /* juce_Toolbar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_Toolbar.cpp; sourceTree = ""; }; + 84F7A7B20A8383C200D36246 /* juce_Toolbar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_Toolbar.h; sourceTree = ""; }; + 84F7A7B30A8383C200D36246 /* juce_ToolbarItemComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ToolbarItemComponent.cpp; sourceTree = ""; }; + 84F7A7B40A8383C200D36246 /* juce_ToolbarItemComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ToolbarItemComponent.h; sourceTree = ""; }; + 84F7A7B50A8383C200D36246 /* juce_ToolbarItemFactory.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ToolbarItemFactory.h; sourceTree = ""; }; + 84F7A7B60A8383C200D36246 /* juce_ToolbarItemPalette.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ToolbarItemPalette.cpp; sourceTree = ""; }; + 84F7A7B70A8383C200D36246 /* juce_ToolbarItemPalette.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ToolbarItemPalette.h; sourceTree = ""; }; + 84F7A7BF0A8383E000D36246 /* juce_MultiTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_MultiTimer.cpp; sourceTree = ""; }; + 84F7A7C00A8383E000D36246 /* juce_MultiTimer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_MultiTimer.h; sourceTree = ""; }; + 84F7A7ED0A838CC900D36246 /* juce_ComponentAnimator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ComponentAnimator.cpp; sourceTree = ""; }; + 84F7A7EE0A838CC900D36246 /* juce_ComponentAnimator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ComponentAnimator.h; sourceTree = ""; }; + 84F8DACE099C963A00E911ED /* juce_ComponentPeer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ComponentPeer.cpp; sourceTree = ""; }; + 84F8DACF099C963A00E911ED /* juce_ComponentPeer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_ComponentPeer.h; sourceTree = ""; }; + 84FC318709B749FD00B75141 /* juce_FileBasedDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBasedDocument.cpp; path = documents/juce_FileBasedDocument.cpp; sourceTree = ""; }; + 84FC318809B749FD00B75141 /* juce_FileBasedDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileBasedDocument.h; path = documents/juce_FileBasedDocument.h; sourceTree = ""; }; + 84FC318909B749FD00B75141 /* juce_RecentlyOpenedFilesList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RecentlyOpenedFilesList.cpp; path = documents/juce_RecentlyOpenedFilesList.cpp; sourceTree = ""; }; + 84FC318A09B749FD00B75141 /* juce_RecentlyOpenedFilesList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_RecentlyOpenedFilesList.h; path = documents/juce_RecentlyOpenedFilesList.h; sourceTree = ""; }; + 84FC318B09B749FD00B75141 /* juce_SelectedItemSet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_SelectedItemSet.h; path = documents/juce_SelectedItemSet.h; sourceTree = ""; }; + 84FC318C09B749FD00B75141 /* juce_UndoableAction.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_UndoableAction.h; path = documents/juce_UndoableAction.h; sourceTree = ""; }; + 84FC318D09B749FD00B75141 /* juce_UndoManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_UndoManager.cpp; path = documents/juce_UndoManager.cpp; sourceTree = ""; }; + 84FC318E09B749FD00B75141 /* juce_UndoManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_UndoManager.h; path = documents/juce_UndoManager.h; sourceTree = ""; }; + 84FC319809B74A5C00B75141 /* juce_DirectoryContentsList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryContentsList.cpp; path = filebrowser/juce_DirectoryContentsList.cpp; sourceTree = ""; }; + 84FC319909B74A5C00B75141 /* juce_DirectoryContentsList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryContentsList.h; path = filebrowser/juce_DirectoryContentsList.h; sourceTree = ""; }; + 84FC319A09B74A5C00B75141 /* juce_FileBrowserComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBrowserComponent.cpp; path = filebrowser/juce_FileBrowserComponent.cpp; sourceTree = ""; }; + 84FC319B09B74A5C00B75141 /* juce_FileBrowserComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileBrowserComponent.h; path = filebrowser/juce_FileBrowserComponent.h; sourceTree = ""; }; + 84FC319C09B74A5C00B75141 /* juce_FileBrowserListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileBrowserListener.h; path = filebrowser/juce_FileBrowserListener.h; sourceTree = ""; }; + 84FC319D09B74A5C00B75141 /* juce_FileChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileChooser.cpp; path = filebrowser/juce_FileChooser.cpp; sourceTree = ""; }; + 84FC319E09B74A5C00B75141 /* juce_FileChooser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileChooser.h; path = filebrowser/juce_FileChooser.h; sourceTree = ""; }; + 84FC319F09B74A5C00B75141 /* juce_FileChooserDialogBox.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileChooserDialogBox.cpp; path = filebrowser/juce_FileChooserDialogBox.cpp; sourceTree = ""; }; + 84FC31A009B74A5C00B75141 /* juce_FileChooserDialogBox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileChooserDialogBox.h; path = filebrowser/juce_FileChooserDialogBox.h; sourceTree = ""; }; + 84FC31A109B74A5C00B75141 /* juce_FileFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileFilter.cpp; path = filebrowser/juce_FileFilter.cpp; sourceTree = ""; }; + 84FC31A209B74A5C00B75141 /* juce_FileFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileFilter.h; path = filebrowser/juce_FileFilter.h; sourceTree = ""; }; + 84FC31A309B74A5C00B75141 /* juce_FileListComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileListComponent.cpp; path = filebrowser/juce_FileListComponent.cpp; sourceTree = ""; }; + 84FC31A409B74A5C00B75141 /* juce_FileListComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FileListComponent.h; path = filebrowser/juce_FileListComponent.h; sourceTree = ""; }; + 84FC31A509B74A5C00B75141 /* juce_FilePreviewComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_FilePreviewComponent.h; path = filebrowser/juce_FilePreviewComponent.h; sourceTree = ""; }; + 84FC31A609B74A5C00B75141 /* juce_ImagePreviewComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImagePreviewComponent.cpp; path = filebrowser/juce_ImagePreviewComponent.cpp; sourceTree = ""; }; + 84FC31A709B74A5C00B75141 /* juce_ImagePreviewComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_ImagePreviewComponent.h; path = filebrowser/juce_ImagePreviewComponent.h; sourceTree = ""; }; + 84FC31A809B74A5C00B75141 /* juce_WildcardFileFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WildcardFileFilter.cpp; path = filebrowser/juce_WildcardFileFilter.cpp; sourceTree = ""; }; + 84FC31A909B74A5C00B75141 /* juce_WildcardFileFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_WildcardFileFilter.h; path = filebrowser/juce_WildcardFileFilter.h; sourceTree = ""; }; + 84FC31BC09B74A7700B75141 /* juce_BorderSize.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_BorderSize.cpp; sourceTree = ""; }; + 84FC31BD09B74A7700B75141 /* juce_BorderSize.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_BorderSize.h; sourceTree = ""; }; + D2AAC046055464E500DB518D /* libjuce.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjuce.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D289987405E68DCB004EDB86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* Juce */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 8456EC6508A2A6C80087C412 /* juce_Config.h */, + 840F80BB092B399D005E7B4E /* juce.h */, + 842B64EA09D87B7900255DC7 /* juce.xcconfig */, + 8456EC6908A2A6F00087C412 /* JUCE changelist.txt */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = Juce; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 84A4883308A22E4900752A2B /* juce_appframework */, + 84A4899708A22E4A00752A2B /* juce_core */, + 84A4881C08A22E2400752A2B /* mac specific code */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC046055464E500DB518D /* libjuce.a */, + ); + name = Products; + sourceTree = ""; + }; + 84099C9A0AE52BD000B2A05D /* synthesisers */ = { + isa = PBXGroup; + children = ( + 84099C9B0AE52BD000B2A05D /* juce_Sampler.cpp */, + 84099C9C0AE52BD000B2A05D /* juce_Sampler.h */, + 84099C9D0AE52BD000B2A05D /* juce_Synthesiser.cpp */, + 84099C9E0AE52BD000B2A05D /* juce_Synthesiser.h */, + ); + path = synthesisers; + sourceTree = ""; + }; + 84198B08096D8E2B0022A439 /* devices */ = { + isa = PBXGroup; + children = ( + 84A06BAA09CAD6A3006A43BD /* juce_AudioIODevice.cpp */, + 84198B0C096D8E2B0022A439 /* juce_AudioIODevice.h */, + 84A06BAB09CAD6A3006A43BD /* juce_AudioIODeviceType.cpp */, + 84A06BAC09CAD6A3006A43BD /* juce_AudioIODeviceType.h */, + 84198B0A096D8E2B0022A439 /* juce_AudioDeviceManager.cpp */, + 84198B0B096D8E2B0022A439 /* juce_AudioDeviceManager.h */, + 84198B0D096D8E2B0022A439 /* juce_MidiInput.h */, + 84198B0E096D8E2B0022A439 /* juce_MidiOutput.h */, + ); + path = devices; + sourceTree = ""; + }; + 841E062E0AF8CE74005E6FCC /* dsp */ = { + isa = PBXGroup; + children = ( + 841E062F0AF8CE74005E6FCC /* juce_AudioDataConverters.cpp */, + 841E06300AF8CE74005E6FCC /* juce_AudioDataConverters.h */, + 841E06310AF8CE74005E6FCC /* juce_AudioSampleBuffer.cpp */, + 841E06320AF8CE74005E6FCC /* juce_AudioSampleBuffer.h */, + 841E06330AF8CE74005E6FCC /* juce_IIRFilter.cpp */, + 841E06340AF8CE74005E6FCC /* juce_IIRFilter.h */, + ); + path = dsp; + sourceTree = ""; + }; + 842F9D560A19C9AF00B1358D /* properties */ = { + isa = PBXGroup; + children = ( + 84F1F05F0A36CF06008CCC5E /* juce_BooleanPropertyComponent.cpp */, + 84F1F0600A36CF06008CCC5E /* juce_BooleanPropertyComponent.h */, + 842F9D570A19C9AF00B1358D /* juce_ButtonPropertyComponent.cpp */, + 842F9D580A19C9AF00B1358D /* juce_ButtonPropertyComponent.h */, + 842F9D590A19C9AF00B1358D /* juce_ChoicePropertyComponent.cpp */, + 842F9D5A0A19C9AF00B1358D /* juce_ChoicePropertyComponent.h */, + 842F9D5B0A19C9AF00B1358D /* juce_PropertyComponent.cpp */, + 842F9D5C0A19C9AF00B1358D /* juce_PropertyComponent.h */, + 842F9D5D0A19C9AF00B1358D /* juce_PropertyPanel.cpp */, + 842F9D5E0A19C9AF00B1358D /* juce_PropertyPanel.h */, + 842F9D5F0A19C9AF00B1358D /* juce_SliderPropertyComponent.cpp */, + 842F9D600A19C9AF00B1358D /* juce_SliderPropertyComponent.h */, + 842F9D610A19C9AF00B1358D /* juce_TextPropertyComponent.cpp */, + 842F9D620A19C9AF00B1358D /* juce_TextPropertyComponent.h */, + ); + path = properties; + sourceTree = ""; + }; + 8463D5B4098BD2CD00F9AEC2 /* midi */ = { + isa = PBXGroup; + children = ( + 8463D5B5098BD2DD00F9AEC2 /* juce_MidiBuffer.cpp */, + 8463D5B6098BD2DD00F9AEC2 /* juce_MidiBuffer.h */, + 8463D5B7098BD2DD00F9AEC2 /* juce_MidiFile.cpp */, + 8463D5B8098BD2DD00F9AEC2 /* juce_MidiFile.h */, + 8463D5B9098BD2DD00F9AEC2 /* juce_MidiKeyboardState.cpp */, + 8463D5BA098BD2DD00F9AEC2 /* juce_MidiKeyboardState.h */, + 8463D5BB098BD2DD00F9AEC2 /* juce_MidiMessage.cpp */, + 8463D5BC098BD2DD00F9AEC2 /* juce_MidiMessage.h */, + 8463D5BD098BD2DD00F9AEC2 /* juce_MidiMessageCollector.cpp */, + 8463D5BE098BD2DD00F9AEC2 /* juce_MidiMessageCollector.h */, + 8463D5BF098BD2DD00F9AEC2 /* juce_MidiMessageSequence.cpp */, + 8463D5C0098BD2DD00F9AEC2 /* juce_MidiMessageSequence.h */, + ); + name = midi; + sourceTree = ""; + }; + 84A4881C08A22E2400752A2B /* mac specific code */ = { + isa = PBXGroup; + children = ( + 84A4881E08A22E2400752A2B /* juce_mac_CoreAudio.cpp */, + 84A4881F08A22E2400752A2B /* juce_mac_CoreMidi.cpp */, + 84A4882008A22E2400752A2B /* juce_mac_FileChooser.cpp */, + 84A4882108A22E2400752A2B /* juce_mac_Files.cpp */, + 84A06BE209CADB06006A43BD /* juce_mac_NamedPipe.cpp */, + 84A4882208A22E2400752A2B /* juce_mac_Fonts.cpp */, + 84A4882308A22E2400752A2B /* juce_mac_Messaging.cpp */, + 84A4882408A22E2400752A2B /* juce_mac_Network.cpp */, + 84A4882508A22E2400752A2B /* juce_mac_SystemStats.cpp */, + 84A4882608A22E2400752A2B /* juce_mac_Threads.cpp */, + 84A4882708A22E2400752A2B /* juce_mac_Windowing.cpp */, + ); + name = "mac specific code"; + path = platform_specific_code; + sourceTree = SOURCE_ROOT; + }; + 84A4883308A22E4900752A2B /* juce_appframework */ = { + isa = PBXGroup; + children = ( + 84A4883408A22E4900752A2B /* application */, + 84A4883B08A22E4900752A2B /* audio */, + 84FC318609B749E400B75141 /* documents */, + 84A4886408A22E4900752A2B /* events */, + 84A4887908A22E4900752A2B /* gui */, + ); + name = juce_appframework; + path = ../../src/juce_appframework; + sourceTree = SOURCE_ROOT; + }; + 84A4883408A22E4900752A2B /* application */ = { + isa = PBXGroup; + children = ( + 84A4883508A22E4900752A2B /* juce_Application.cpp */, + 84A4883608A22E4900752A2B /* juce_Application.h */, + 84F589980A01493600B80939 /* juce_ApplicationCommandID.h */, + 84F589990A01493600B80939 /* juce_ApplicationCommandInfo.cpp */, + 84F5899A0A01493600B80939 /* juce_ApplicationCommandInfo.h */, + 84F5899B0A01493600B80939 /* juce_ApplicationCommandManager.cpp */, + 84F5899C0A01493600B80939 /* juce_ApplicationCommandManager.h */, + 84F5899D0A01493600B80939 /* juce_ApplicationCommandTarget.cpp */, + 84F5899E0A01493600B80939 /* juce_ApplicationCommandTarget.h */, + 84F524FE0B32A8D500597B73 /* juce_ApplicationProperties.cpp */, + 84F524FF0B32A8D500597B73 /* juce_ApplicationProperties.h */, + 84A4883708A22E4900752A2B /* juce_DeletedAtShutdown.cpp */, + 84A4883808A22E4900752A2B /* juce_DeletedAtShutdown.h */, + 84D296BB09B763190026C535 /* juce_PropertiesFile.cpp */, + 84D296BC09B763190026C535 /* juce_PropertiesFile.h */, + 84A4883A08A22E4900752A2B /* juce_SystemClipboard.h */, + ); + name = application; + path = ../../src/juce_appframework/application; + sourceTree = SOURCE_ROOT; + }; + 84A4883B08A22E4900752A2B /* audio */ = { + isa = PBXGroup; + children = ( + 84A4883C08A22E4900752A2B /* audio_file_formats */, + 84A4884908A22E4900752A2B /* audio_sources */, + 84198B08096D8E2B0022A439 /* devices */, + 841E062E0AF8CE74005E6FCC /* dsp */, + 8463D5B4098BD2CD00F9AEC2 /* midi */, + 84099C9A0AE52BD000B2A05D /* synthesisers */, + ); + name = audio; + path = ../../src/juce_appframework/audio; + sourceTree = SOURCE_ROOT; + }; + 84A4883C08A22E4900752A2B /* audio_file_formats */ = { + isa = PBXGroup; + children = ( + 84F690E00B3444B500ABAE1C /* vorbis */, + 84F690DF0B3444B000ABAE1C /* ogg */, + 84F690DC0B3444A500ABAE1C /* flac */, + 842B63B609D8508F00255DC7 /* juce_FlacAudioFormat.cpp */, + 842B63B709D8508F00255DC7 /* juce_FlacAudioFormat.h */, + 842B63B809D8508F00255DC7 /* juce_OggVorbisAudioFormat.cpp */, + 842B63B909D8508F00255DC7 /* juce_OggVorbisAudioFormat.h */, + 84A4883D08A22E4900752A2B /* juce_AiffAudioFormat.cpp */, + 84A4883E08A22E4900752A2B /* juce_AiffAudioFormat.h */, + 84A4883F08A22E4900752A2B /* juce_AudioCDReader.cpp */, + 84A4884008A22E4900752A2B /* juce_AudioCDReader.h */, + 84A4884108A22E4900752A2B /* juce_AudioFormat.cpp */, + 84A4884208A22E4900752A2B /* juce_AudioFormat.h */, + 84E8209209729D2A0097675B /* juce_AudioFormatManager.cpp */, + 84E8209309729D2A0097675B /* juce_AudioFormatManager.h */, + 84A4884308A22E4900752A2B /* juce_AudioFormatReader.h */, + 84A4884408A22E4900752A2B /* juce_AudioFormatWriter.h */, + 84A4884508A22E4900752A2B /* juce_AudioSubsectionReader.cpp */, + 84A4884608A22E4900752A2B /* juce_AudioSubsectionReader.h */, + 84A4884708A22E4900752A2B /* juce_WavAudioFormat.cpp */, + 84A4884808A22E4900752A2B /* juce_WavAudioFormat.h */, + ); + name = audio_file_formats; + path = ../../src/juce_appframework/audio/audio_file_formats; + sourceTree = SOURCE_ROOT; + }; + 84A4884908A22E4900752A2B /* audio_sources */ = { + isa = PBXGroup; + children = ( + 84A4884A08A22E4900752A2B /* juce_AudioFormatReaderSource.cpp */, + 84A4884B08A22E4900752A2B /* juce_AudioFormatReaderSource.h */, + 84A4884C08A22E4900752A2B /* juce_AudioSource.h */, + 84A4884D08A22E4900752A2B /* juce_AudioSourcePlayer.cpp */, + 84A4884E08A22E4900752A2B /* juce_AudioSourcePlayer.h */, + 84A4884F08A22E4900752A2B /* juce_AudioTransportSource.cpp */, + 84A4885008A22E4900752A2B /* juce_AudioTransportSource.h */, + 84A4885108A22E4900752A2B /* juce_BufferingAudioSource.cpp */, + 84A4885208A22E4900752A2B /* juce_BufferingAudioSource.h */, + 84F6B7520C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.cpp */, + 84F6B7530C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.h */, + 84C0EA5C0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.cpp */, + 84C0EA5D0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.h */, + 84A4885308A22E4900752A2B /* juce_MixerAudioSource.cpp */, + 84A4885408A22E4900752A2B /* juce_MixerAudioSource.h */, + 84A4885508A22E4900752A2B /* juce_PositionableAudioSource.h */, + 84A4885608A22E4900752A2B /* juce_ResamplingAudioSource.cpp */, + 84A4885708A22E4900752A2B /* juce_ResamplingAudioSource.h */, + 84052DE208D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.cpp */, + 84052DE308D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.h */, + ); + name = audio_sources; + path = ../../src/juce_appframework/audio/audio_sources; + sourceTree = SOURCE_ROOT; + }; + 84A4886408A22E4900752A2B /* events */ = { + isa = PBXGroup; + children = ( + 84A4886508A22E4900752A2B /* juce_ActionBroadcaster.cpp */, + 84A4886608A22E4900752A2B /* juce_ActionBroadcaster.h */, + 84A4886708A22E4900752A2B /* juce_ActionListener.h */, + 84A4886808A22E4900752A2B /* juce_ActionListenerList.cpp */, + 84A4886908A22E4900752A2B /* juce_ActionListenerList.h */, + 84A4886A08A22E4900752A2B /* juce_AsyncUpdater.cpp */, + 84A4886B08A22E4900752A2B /* juce_AsyncUpdater.h */, + 84A4886C08A22E4900752A2B /* juce_ChangeBroadcaster.cpp */, + 84A4886D08A22E4900752A2B /* juce_ChangeBroadcaster.h */, + 84A4886E08A22E4900752A2B /* juce_ChangeListener.h */, + 84A4886F08A22E4900752A2B /* juce_ChangeListenerList.cpp */, + 84A4887008A22E4900752A2B /* juce_ChangeListenerList.h */, + 846034DA09CB374E00E255CF /* juce_InterprocessConnection.cpp */, + 846034DB09CB374E00E255CF /* juce_InterprocessConnection.h */, + 846034DC09CB374E00E255CF /* juce_InterprocessConnectionServer.cpp */, + 846034DD09CB374E00E255CF /* juce_InterprocessConnectionServer.h */, + 84A4887108A22E4900752A2B /* juce_Message.cpp */, + 84A4887208A22E4900752A2B /* juce_Message.h */, + 84A4887308A22E4900752A2B /* juce_MessageListener.cpp */, + 84A4887408A22E4900752A2B /* juce_MessageListener.h */, + 84A4887508A22E4900752A2B /* juce_MessageManager.cpp */, + 84A4887608A22E4900752A2B /* juce_MessageManager.h */, + 84F7A7BF0A8383E000D36246 /* juce_MultiTimer.cpp */, + 84F7A7C00A8383E000D36246 /* juce_MultiTimer.h */, + 84A4887708A22E4900752A2B /* juce_Timer.cpp */, + 84A4887808A22E4900752A2B /* juce_Timer.h */, + ); + name = events; + path = ../../src/juce_appframework/events; + sourceTree = SOURCE_ROOT; + }; + 84A4887908A22E4900752A2B /* gui */ = { + isa = PBXGroup; + children = ( + 84A4887A08A22E4900752A2B /* components */, + 84A488FF08A22E4900752A2B /* graphics */, + ); + name = gui; + path = ../../src/juce_appframework/gui; + sourceTree = SOURCE_ROOT; + }; + 84A4887A08A22E4900752A2B /* components */ = { + isa = PBXGroup; + children = ( + 84A4887B08A22E4900752A2B /* buttons */, + 84A4888C08A22E4900752A2B /* controls */, + 84FC319709B74A1000B75141 /* filebrowser */, + 84A488A608A22E4900752A2B /* keyboard */, + 84A488B108A22E4900752A2B /* layout */, + 84A488C508A22E4900752A2B /* lookandfeel */, + 84A488CA08A22E4900752A2B /* menus */, + 84A488D108A22E4900752A2B /* mouse */, + 842F9D560A19C9AF00B1358D /* properties */, + 84A488DF08A22E4900752A2B /* special */, + 84A488EE08A22E4900752A2B /* windows */, + 84A4889F08A22E4900752A2B /* juce_Component.cpp */, + 84A488A008A22E4900752A2B /* juce_Component.h */, + 84A488A108A22E4900752A2B /* juce_ComponentDeletionWatcher.h */, + 84A488A208A22E4900752A2B /* juce_ComponentListener.cpp */, + 84A488A308A22E4900752A2B /* juce_ComponentListener.h */, + 84A488A408A22E4900752A2B /* juce_Desktop.cpp */, + 84A488A508A22E4900752A2B /* juce_Desktop.h */, + ); + name = components; + path = ../../src/juce_appframework/gui/components; + sourceTree = SOURCE_ROOT; + }; + 84A4887B08A22E4900752A2B /* buttons */ = { + isa = PBXGroup; + children = ( + 84A4887C08A22E4900752A2B /* juce_ArrowButton.cpp */, + 84A4887D08A22E4900752A2B /* juce_ArrowButton.h */, + 84A4887E08A22E4900752A2B /* juce_Button.cpp */, + 84A4887F08A22E4900752A2B /* juce_Button.h */, + 84A4888008A22E4900752A2B /* juce_DrawableButton.cpp */, + 84A4888108A22E4900752A2B /* juce_DrawableButton.h */, + 84A4888208A22E4900752A2B /* juce_HyperlinkButton.cpp */, + 84A4888308A22E4900752A2B /* juce_HyperlinkButton.h */, + 84A4888408A22E4900752A2B /* juce_ImageButton.cpp */, + 84A4888508A22E4900752A2B /* juce_ImageButton.h */, + 84A4888608A22E4900752A2B /* juce_ShapeButton.cpp */, + 84A4888708A22E4900752A2B /* juce_ShapeButton.h */, + 84A4888808A22E4900752A2B /* juce_TextButton.cpp */, + 84A4888908A22E4900752A2B /* juce_TextButton.h */, + 84A4888A08A22E4900752A2B /* juce_ToggleButton.cpp */, + 84A4888B08A22E4900752A2B /* juce_ToggleButton.h */, + 84F7A7AD0A8383A100D36246 /* juce_ToolbarButton.cpp */, + 84F7A7AE0A8383A100D36246 /* juce_ToolbarButton.h */, + ); + name = buttons; + path = ../../src/juce_appframework/gui/components/buttons; + sourceTree = SOURCE_ROOT; + }; + 84A4888C08A22E4900752A2B /* controls */ = { + isa = PBXGroup; + children = ( + 84A4888D08A22E4900752A2B /* juce_ComboBox.cpp */, + 84A4888E08A22E4900752A2B /* juce_ComboBox.h */, + 84A4889108A22E4900752A2B /* juce_Label.cpp */, + 84A4889208A22E4900752A2B /* juce_Label.h */, + 84A4889308A22E4900752A2B /* juce_ListBox.cpp */, + 84A4889408A22E4900752A2B /* juce_ListBox.h */, + 84A4889508A22E4900752A2B /* juce_ProgressBar.cpp */, + 84A4889608A22E4900752A2B /* juce_ProgressBar.h */, + 84A4889908A22E4900752A2B /* juce_Slider.cpp */, + 84A4889A08A22E4900752A2B /* juce_Slider.h */, + 8440CD610ACD112E0086FFD7 /* juce_SliderListener.h */, + 8417EE4F0A6E7A270058E04E /* juce_TableHeaderComponent.cpp */, + 8417EE500A6E7A270058E04E /* juce_TableHeaderComponent.h */, + 8417EE510A6E7A280058E04E /* juce_TableListBox.cpp */, + 8417EE520A6E7A280058E04E /* juce_TableListBox.h */, + 84A4889B08A22E4900752A2B /* juce_TextEditor.cpp */, + 84A4889C08A22E4900752A2B /* juce_TextEditor.h */, + 84F7A7B10A8383C200D36246 /* juce_Toolbar.cpp */, + 84F7A7B20A8383C200D36246 /* juce_Toolbar.h */, + 84F7A7B30A8383C200D36246 /* juce_ToolbarItemComponent.cpp */, + 84F7A7B40A8383C200D36246 /* juce_ToolbarItemComponent.h */, + 84F7A7B50A8383C200D36246 /* juce_ToolbarItemFactory.h */, + 84F7A7B60A8383C200D36246 /* juce_ToolbarItemPalette.cpp */, + 84F7A7B70A8383C200D36246 /* juce_ToolbarItemPalette.h */, + 84A4889D08A22E4900752A2B /* juce_TreeView.cpp */, + 84A4889E08A22E4900752A2B /* juce_TreeView.h */, + ); + name = controls; + path = ../../src/juce_appframework/gui/components/controls; + sourceTree = SOURCE_ROOT; + }; + 84A488A608A22E4900752A2B /* keyboard */ = { + isa = PBXGroup; + children = ( + 84F1F0670A36CF45008CCC5E /* juce_KeyboardFocusTraverser.cpp */, + 84F1F0680A36CF45008CCC5E /* juce_KeyboardFocusTraverser.h */, + 84A488A708A22E4900752A2B /* juce_KeyListener.cpp */, + 84A488A808A22E4900752A2B /* juce_KeyListener.h */, + 84A488A908A22E4900752A2B /* juce_KeyMappingEditorComponent.cpp */, + 84A488AA08A22E4900752A2B /* juce_KeyMappingEditorComponent.h */, + 84A488AB08A22E4900752A2B /* juce_KeyPress.cpp */, + 84A488AC08A22E4900752A2B /* juce_KeyPress.h */, + 84A488AD08A22E4900752A2B /* juce_KeyPressMappingSet.cpp */, + 84A488AE08A22E4900752A2B /* juce_KeyPressMappingSet.h */, + 84A488AF08A22E4900752A2B /* juce_ModifierKeys.cpp */, + 84A488B008A22E4900752A2B /* juce_ModifierKeys.h */, + ); + name = keyboard; + path = ../../src/juce_appframework/gui/components/keyboard; + sourceTree = SOURCE_ROOT; + }; + 84A488B108A22E4900752A2B /* layout */ = { + isa = PBXGroup; + children = ( + 84F7A7ED0A838CC900D36246 /* juce_ComponentAnimator.cpp */, + 84F7A7EE0A838CC900D36246 /* juce_ComponentAnimator.h */, + 84F46B7C098685BD0079F3FA /* juce_ComponentBoundsConstrainer.cpp */, + 84F46B7D098685BD0079F3FA /* juce_ComponentBoundsConstrainer.h */, + 8440CD3C0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp */, + 8440CD3D0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h */, + 84A488B208A22E4900752A2B /* juce_GroupComponent.cpp */, + 84A488B308A22E4900752A2B /* juce_GroupComponent.h */, + 84F555280A2235E100A8311C /* juce_MultiDocumentPanel.cpp */, + 84F555290A2235E100A8311C /* juce_MultiDocumentPanel.h */, + 84A488B508A22E4900752A2B /* juce_ResizableBorderComponent.cpp */, + 84A488B608A22E4900752A2B /* juce_ResizableBorderComponent.h */, + 84A488B708A22E4900752A2B /* juce_ResizableCornerComponent.cpp */, + 84A488B808A22E4900752A2B /* juce_ResizableCornerComponent.h */, + 84A488B908A22E4900752A2B /* juce_ScrollBar.cpp */, + 84A488BA08A22E4900752A2B /* juce_ScrollBar.h */, + 84A488BB08A22E4900752A2B /* juce_StretchableLayoutManager.cpp */, + 84A488BC08A22E4900752A2B /* juce_StretchableLayoutManager.h */, + 84A488BD08A22E4900752A2B /* juce_StretchableLayoutResizerBar.cpp */, + 84A488BE08A22E4900752A2B /* juce_StretchableLayoutResizerBar.h */, + 8417EE570A6E7A370058E04E /* juce_StretchableObjectResizer.cpp */, + 8417EE580A6E7A370058E04E /* juce_StretchableObjectResizer.h */, + 84A488BF08A22E4900752A2B /* juce_TabbedButtonBar.cpp */, + 84A488C008A22E4900752A2B /* juce_TabbedButtonBar.h */, + 84A488C108A22E4900752A2B /* juce_TabbedComponent.cpp */, + 84A488C208A22E4900752A2B /* juce_TabbedComponent.h */, + 84A488C308A22E4900752A2B /* juce_Viewport.cpp */, + 84A488C408A22E4900752A2B /* juce_Viewport.h */, + ); + name = layout; + path = ../../src/juce_appframework/gui/components/layout; + sourceTree = SOURCE_ROOT; + }; + 84A488C508A22E4900752A2B /* lookandfeel */ = { + isa = PBXGroup; + children = ( + 84A488C608A22E4900752A2B /* juce_LookAndFeel.cpp */, + 84A488C708A22E4900752A2B /* juce_LookAndFeel.h */, + 84A488C808A22E4900752A2B /* juce_ShinyLookAndFeel.cpp */, + 84A488C908A22E4900752A2B /* juce_ShinyLookAndFeel.h */, + ); + name = lookandfeel; + path = ../../src/juce_appframework/gui/components/lookandfeel; + sourceTree = SOURCE_ROOT; + }; + 84A488CA08A22E4900752A2B /* menus */ = { + isa = PBXGroup; + children = ( + 84A488CB08A22E4900752A2B /* juce_MenuBarComponent.cpp */, + 84A488CC08A22E4900752A2B /* juce_MenuBarComponent.h */, + 842D3D0D0C0D7CF200E9FFE4 /* juce_MenuBarModel.cpp */, + 84A488CD08A22E4900752A2B /* juce_MenuBarModel.h */, + 84A488CE08A22E4900752A2B /* juce_PopupMenu.cpp */, + 84A488CF08A22E4900752A2B /* juce_PopupMenu.h */, + 84A488D008A22E4900752A2B /* juce_PopupMenuCustomComponent.h */, + ); + name = menus; + path = ../../src/juce_appframework/gui/components/menus; + sourceTree = SOURCE_ROOT; + }; + 84A488D108A22E4900752A2B /* mouse */ = { + isa = PBXGroup; + children = ( + 84A488D208A22E4900752A2B /* juce_ComponentDragger.cpp */, + 84A488D308A22E4900752A2B /* juce_ComponentDragger.h */, + 84A488D408A22E4900752A2B /* juce_DragAndDropContainer.cpp */, + 84A488D508A22E4900752A2B /* juce_DragAndDropContainer.h */, + 84A488D608A22E4900752A2B /* juce_DragAndDropTarget.h */, + 84F593B009855693008153BA /* juce_LassoComponent.h */, + 84A488D708A22E4900752A2B /* juce_MouseCursor.cpp */, + 84A488D808A22E4900752A2B /* juce_MouseCursor.h */, + 84A488D908A22E4900752A2B /* juce_MouseEvent.cpp */, + 84A488DA08A22E4900752A2B /* juce_MouseEvent.h */, + 84A488DB08A22E4900752A2B /* juce_MouseHoverDetector.cpp */, + 84A488DC08A22E4900752A2B /* juce_MouseHoverDetector.h */, + 84A488DD08A22E4900752A2B /* juce_MouseListener.cpp */, + 84A488DE08A22E4900752A2B /* juce_MouseListener.h */, + 84F589940A01491F00B80939 /* juce_TooltipClient.h */, + ); + name = mouse; + path = ../../src/juce_appframework/gui/components/mouse; + sourceTree = SOURCE_ROOT; + }; + 84A488DF08A22E4900752A2B /* special */ = { + isa = PBXGroup; + children = ( + 84F1F0630A36CF31008CCC5E /* juce_MagnifierComponent.cpp */, + 84F1F0640A36CF31008CCC5E /* juce_MagnifierComponent.h */, + 84198BB3096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.cpp */, + 84198BB4096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.h */, + 84A488E008A22E4900752A2B /* juce_BubbleComponent.cpp */, + 84A488E108A22E4900752A2B /* juce_BubbleComponent.h */, + 84A488E208A22E4900752A2B /* juce_BubbleMessageComponent.cpp */, + 84A488E308A22E4900752A2B /* juce_BubbleMessageComponent.h */, + 84A488E408A22E4900752A2B /* juce_ColourSelector.cpp */, + 84A488E508A22E4900752A2B /* juce_ColourSelector.h */, + 84A488E608A22E4900752A2B /* juce_DropShadower.cpp */, + 84A488E708A22E4900752A2B /* juce_DropShadower.h */, + 84F1B8D809499F1400AD8EDE /* juce_MidiKeyboardComponent.cpp */, + 84F1B8D909499F1400AD8EDE /* juce_MidiKeyboardComponent.h */, + 84A488E808A22E4900752A2B /* juce_OpenGLComponent.cpp */, + 84A488E908A22E4900752A2B /* juce_OpenGLComponent.h */, + 84A488EA08A22E4900752A2B /* juce_PreferencesPanel.cpp */, + 84A488EB08A22E4900752A2B /* juce_PreferencesPanel.h */, + 84A488EC08A22E4900752A2B /* juce_QuickTimeMovieComponent.cpp */, + 84A488ED08A22E4900752A2B /* juce_QuickTimeMovieComponent.h */, + ); + name = special; + path = ../../src/juce_appframework/gui/components/special; + sourceTree = SOURCE_ROOT; + }; + 84A488EE08A22E4900752A2B /* windows */ = { + isa = PBXGroup; + children = ( + 84A488EF08A22E4900752A2B /* juce_AlertWindow.cpp */, + 84A488F008A22E4900752A2B /* juce_AlertWindow.h */, + 84F8DACE099C963A00E911ED /* juce_ComponentPeer.cpp */, + 84F8DACF099C963A00E911ED /* juce_ComponentPeer.h */, + 84A488F108A22E4900752A2B /* juce_DialogWindow.cpp */, + 84A488F208A22E4900752A2B /* juce_DialogWindow.h */, + 84F593AC09855679008153BA /* juce_DocumentWindow.cpp */, + 84F593AD09855679008153BA /* juce_DocumentWindow.h */, + 84A488F708A22E4900752A2B /* juce_ResizableWindow.cpp */, + 84A488F808A22E4900752A2B /* juce_ResizableWindow.h */, + 84A488F908A22E4900752A2B /* juce_SplashScreen.cpp */, + 84A488FA08A22E4900752A2B /* juce_SplashScreen.h */, + 84A488FB08A22E4900752A2B /* juce_ThreadWithProgressWindow.cpp */, + 84A488FC08A22E4900752A2B /* juce_ThreadWithProgressWindow.h */, + 84A488FD08A22E4900752A2B /* juce_TooltipWindow.cpp */, + 84A488FE08A22E4900752A2B /* juce_TooltipWindow.h */, + 8463D5CE098BD30600F9AEC2 /* juce_TopLevelWindow.cpp */, + 8463D5CF098BD30600F9AEC2 /* juce_TopLevelWindow.h */, + ); + name = windows; + path = ../../src/juce_appframework/gui/components/windows; + sourceTree = SOURCE_ROOT; + }; + 84A488FF08A22E4900752A2B /* graphics */ = { + isa = PBXGroup; + children = ( + 84A4890008A22E4900752A2B /* brushes */, + 84A4890908A22E4900752A2B /* colour */, + 84A4891108A22E4900752A2B /* contexts */, + 84A4891808A22E4900752A2B /* drawables */, + 84A4892308A22E4A00752A2B /* effects */, + 84A4892B08A22E4A00752A2B /* fonts */, + 84A4893408A22E4A00752A2B /* geometry */, + 84A4894508A22E4A00752A2B /* imaging */, + ); + name = graphics; + path = ../../src/juce_appframework/gui/graphics; + sourceTree = SOURCE_ROOT; + }; + 84A4890008A22E4900752A2B /* brushes */ = { + isa = PBXGroup; + children = ( + 84A4890108A22E4900752A2B /* juce_Brush.cpp */, + 84A4890208A22E4900752A2B /* juce_Brush.h */, + 84A4890308A22E4900752A2B /* juce_GradientBrush.cpp */, + 84A4890408A22E4900752A2B /* juce_GradientBrush.h */, + 84A4890508A22E4900752A2B /* juce_ImageBrush.cpp */, + 84A4890608A22E4900752A2B /* juce_ImageBrush.h */, + 84A4890708A22E4900752A2B /* juce_SolidColourBrush.cpp */, + 84A4890808A22E4900752A2B /* juce_SolidColourBrush.h */, + ); + name = brushes; + path = ../../src/juce_appframework/gui/graphics/brushes; + sourceTree = SOURCE_ROOT; + }; + 84A4890908A22E4900752A2B /* colour */ = { + isa = PBXGroup; + children = ( + 84A4890A08A22E4900752A2B /* juce_Colour.cpp */, + 84A4890B08A22E4900752A2B /* juce_Colour.h */, + 84A4890C08A22E4900752A2B /* juce_ColourGradient.cpp */, + 84A4890D08A22E4900752A2B /* juce_ColourGradient.h */, + 84A4890E08A22E4900752A2B /* juce_Colours.cpp */, + 84A4890F08A22E4900752A2B /* juce_Colours.h */, + 84A4891008A22E4900752A2B /* juce_PixelFormats.h */, + ); + name = colour; + path = ../../src/juce_appframework/gui/graphics/colour; + sourceTree = SOURCE_ROOT; + }; + 84A4891108A22E4900752A2B /* contexts */ = { + isa = PBXGroup; + children = ( + 84A4891208A22E4900752A2B /* juce_EdgeTable.cpp */, + 84A4891308A22E4900752A2B /* juce_EdgeTable.h */, + 84A4891408A22E4900752A2B /* juce_Graphics.cpp */, + 84A4891508A22E4900752A2B /* juce_Graphics.h */, + 84A4891608A22E4900752A2B /* juce_Justification.cpp */, + 84A4891708A22E4900752A2B /* juce_Justification.h */, + 8406C44309642CE100C99145 /* juce_LowLevelGraphicsContext.h */, + 8407908D09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.cpp */, + 8407908E09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.h */, + 8406C44409642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.cpp */, + 8406C44509642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.h */, + 846927DC0A49ABE600314975 /* juce_RectanglePlacement.cpp */, + 846927DD0A49ABE600314975 /* juce_RectanglePlacement.h */, + ); + name = contexts; + path = ../../src/juce_appframework/gui/graphics/contexts; + sourceTree = SOURCE_ROOT; + }; + 84A4891808A22E4900752A2B /* drawables */ = { + isa = PBXGroup; + children = ( + 84A4891908A22E4900752A2B /* juce_Drawable.cpp */, + 84A4891A08A22E4900752A2B /* juce_Drawable.h */, + 84A4891B08A22E4A00752A2B /* juce_DrawableComposite.cpp */, + 84A4891C08A22E4A00752A2B /* juce_DrawableComposite.h */, + 84A4891D08A22E4A00752A2B /* juce_DrawableImage.cpp */, + 84A4891E08A22E4A00752A2B /* juce_DrawableImage.h */, + 84A4891F08A22E4A00752A2B /* juce_DrawablePath.cpp */, + 84A4892008A22E4A00752A2B /* juce_DrawablePath.h */, + 84A4892108A22E4A00752A2B /* juce_DrawableText.cpp */, + 84A4892208A22E4A00752A2B /* juce_DrawableText.h */, + 846927E00A49ABFD00314975 /* juce_SVGParser.cpp */, + ); + name = drawables; + path = ../../src/juce_appframework/gui/graphics/drawables; + sourceTree = SOURCE_ROOT; + }; + 84A4892308A22E4A00752A2B /* effects */ = { + isa = PBXGroup; + children = ( + 84A4892408A22E4A00752A2B /* juce_DropShadowEffect.cpp */, + 84A4892508A22E4A00752A2B /* juce_DropShadowEffect.h */, + 84A4892608A22E4A00752A2B /* juce_GlowEffect.cpp */, + 84A4892708A22E4A00752A2B /* juce_GlowEffect.h */, + 84A4892808A22E4A00752A2B /* juce_ImageEffectFilter.h */, + 84A4892908A22E4A00752A2B /* juce_ReduceOpacityEffect.cpp */, + 84A4892A08A22E4A00752A2B /* juce_ReduceOpacityEffect.h */, + ); + name = effects; + path = ../../src/juce_appframework/gui/graphics/effects; + sourceTree = SOURCE_ROOT; + }; + 84A4892B08A22E4A00752A2B /* fonts */ = { + isa = PBXGroup; + children = ( + 84A4892C08A22E4A00752A2B /* juce_Font.cpp */, + 84A4892D08A22E4A00752A2B /* juce_Font.h */, + 84A4892E08A22E4A00752A2B /* juce_GlyphArrangement.cpp */, + 84A4892F08A22E4A00752A2B /* juce_GlyphArrangement.h */, + 84A4893008A22E4A00752A2B /* juce_TextLayout.cpp */, + 84A4893108A22E4A00752A2B /* juce_TextLayout.h */, + 84A4893208A22E4A00752A2B /* juce_Typeface.cpp */, + 84A4893308A22E4A00752A2B /* juce_Typeface.h */, + ); + name = fonts; + path = ../../src/juce_appframework/gui/graphics/fonts; + sourceTree = SOURCE_ROOT; + }; + 84A4893408A22E4A00752A2B /* geometry */ = { + isa = PBXGroup; + children = ( + 84FC31BC09B74A7700B75141 /* juce_BorderSize.cpp */, + 84FC31BD09B74A7700B75141 /* juce_BorderSize.h */, + 84A4893508A22E4A00752A2B /* juce_AffineTransform.cpp */, + 84A4893608A22E4A00752A2B /* juce_AffineTransform.h */, + 84A4893708A22E4A00752A2B /* juce_Line.cpp */, + 84A4893808A22E4A00752A2B /* juce_Line.h */, + 84A4893908A22E4A00752A2B /* juce_Path.cpp */, + 84A4893A08A22E4A00752A2B /* juce_Path.h */, + 84A4893B08A22E4A00752A2B /* juce_PathIterator.cpp */, + 84A4893C08A22E4A00752A2B /* juce_PathIterator.h */, + 84A4893D08A22E4A00752A2B /* juce_PathStrokeType.cpp */, + 84A4893E08A22E4A00752A2B /* juce_PathStrokeType.h */, + 84A4893F08A22E4A00752A2B /* juce_Point.cpp */, + 84A4894008A22E4A00752A2B /* juce_Point.h */, + 842F9DE00A19D2AF00B1358D /* juce_PositionedRectangle.cpp */, + 842F9DE10A19D2AF00B1358D /* juce_PositionedRectangle.h */, + 84A4894108A22E4A00752A2B /* juce_Rectangle.cpp */, + 84A4894208A22E4A00752A2B /* juce_Rectangle.h */, + 84A4894308A22E4A00752A2B /* juce_RectangleList.cpp */, + 84A4894408A22E4A00752A2B /* juce_RectangleList.h */, + ); + name = geometry; + path = ../../src/juce_appframework/gui/graphics/geometry; + sourceTree = SOURCE_ROOT; + }; + 84A4894508A22E4A00752A2B /* imaging */ = { + isa = PBXGroup; + children = ( + 84A4894608A22E4A00752A2B /* image_file_formats */, + 84A4898608A22E4A00752A2B /* juce_Image.cpp */, + 84A4898708A22E4A00752A2B /* juce_Image.h */, + 84A4898808A22E4A00752A2B /* juce_ImageCache.cpp */, + 84A4898908A22E4A00752A2B /* juce_ImageCache.h */, + 84A4898A08A22E4A00752A2B /* juce_ImageConvolutionKernel.cpp */, + 84A4898B08A22E4A00752A2B /* juce_ImageConvolutionKernel.h */, + 84A4898C08A22E4A00752A2B /* juce_ImageFileFormat.cpp */, + 84A4898D08A22E4A00752A2B /* juce_ImageFileFormat.h */, + ); + name = imaging; + path = ../../src/juce_appframework/gui/graphics/imaging; + sourceTree = SOURCE_ROOT; + }; + 84A4894608A22E4A00752A2B /* image_file_formats */ = { + isa = PBXGroup; + children = ( + 84A4894708A22E4A00752A2B /* jpglib */, + 84A4897608A22E4A00752A2B /* pnglib */, + 84A4897208A22E4A00752A2B /* juce_GIFLoader.cpp */, + 84A4897308A22E4A00752A2B /* juce_GIFLoader.h */, + 84A4897408A22E4A00752A2B /* juce_JPEGLoader.cpp */, + 84A4897508A22E4A00752A2B /* juce_PNGLoader.cpp */, + ); + name = image_file_formats; + path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats; + sourceTree = SOURCE_ROOT; + }; + 84A4894708A22E4A00752A2B /* jpglib */ = { + isa = PBXGroup; + children = ( + 84677CB70917AB5E0086D5D9 /* jcapimin.c */, + 84677CB80917AB5E0086D5D9 /* jcapistd.c */, + 84677CB90917AB5E0086D5D9 /* jccoefct.c */, + 84677CBA0917AB5E0086D5D9 /* jccolor.c */, + 84677CBB0917AB5E0086D5D9 /* jcdctmgr.c */, + 84677CBC0917AB5E0086D5D9 /* jchuff.c */, + 84677CBD0917AB5E0086D5D9 /* jcinit.c */, + 84677CBE0917AB5E0086D5D9 /* jcmainct.c */, + 84677CBF0917AB5E0086D5D9 /* jcmarker.c */, + 84677CC00917AB5E0086D5D9 /* jcmaster.c */, + 84677CC10917AB5E0086D5D9 /* jcomapi.c */, + 84677CC20917AB5E0086D5D9 /* jcparam.c */, + 84677CC30917AB5E0086D5D9 /* jcphuff.c */, + 84677CC40917AB5E0086D5D9 /* jcprepct.c */, + 84677CC50917AB5E0086D5D9 /* jcsample.c */, + 84677CC60917AB5E0086D5D9 /* jctrans.c */, + 84677CC70917AB5E0086D5D9 /* jdapimin.c */, + 84677CC80917AB5E0086D5D9 /* jdapistd.c */, + 84677CC90917AB5E0086D5D9 /* jdatasrc.c */, + 84677CCA0917AB5E0086D5D9 /* jdcoefct.c */, + 84677CCB0917AB5E0086D5D9 /* jdcolor.c */, + 84677CCC0917AB5F0086D5D9 /* jddctmgr.c */, + 84677CCD0917AB5F0086D5D9 /* jdhuff.c */, + 84677CCE0917AB5F0086D5D9 /* jdinput.c */, + 84677CCF0917AB5F0086D5D9 /* jdmainct.c */, + 84677CD00917AB5F0086D5D9 /* jdmarker.c */, + 84677CD10917AB5F0086D5D9 /* jdmaster.c */, + 84677CD20917AB5F0086D5D9 /* jdmerge.c */, + 84677CD30917AB5F0086D5D9 /* jdphuff.c */, + 84677CD40917AB5F0086D5D9 /* jdpostct.c */, + 84677CD50917AB5F0086D5D9 /* jdsample.c */, + 84677CD60917AB5F0086D5D9 /* jdtrans.c */, + 84677CD70917AB5F0086D5D9 /* jerror.c */, + 84677CD80917AB5F0086D5D9 /* jfdctflt.c */, + 84677CD90917AB5F0086D5D9 /* jfdctfst.c */, + 84677CDA0917AB5F0086D5D9 /* jfdctint.c */, + 84677CDB0917AB5F0086D5D9 /* jidctflt.c */, + 84677CDC0917AB5F0086D5D9 /* jidctfst.c */, + 84677CDD0917AB5F0086D5D9 /* jidctint.c */, + 84677CDE0917AB5F0086D5D9 /* jidctred.c */, + 84677CDF0917AB5F0086D5D9 /* jinclude.h */, + 84677CE00917AB5F0086D5D9 /* jmemmgr.c */, + 84677CE10917AB5F0086D5D9 /* jmemnobs.c */, + 84677CE40917AB5F0086D5D9 /* jpeglib.h */, + 84677CE50917AB5F0086D5D9 /* jquant1.c */, + 84677CE60917AB5F0086D5D9 /* jquant2.c */, + 84677CE70917AB5F0086D5D9 /* jutils.c */, + 84677CE80917AB5F0086D5D9 /* jversion.h */, + 84677CE90917AB5F0086D5D9 /* transupp.c */, + 84677CEA0917AB5F0086D5D9 /* transupp.h */, + ); + name = jpglib; + path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib; + sourceTree = SOURCE_ROOT; + }; + 84A4897608A22E4A00752A2B /* pnglib */ = { + isa = PBXGroup; + children = ( + 84677C8A0917AA440086D5D9 /* png.c */, + 84677C8B0917AA440086D5D9 /* png.h */, + 84677C8C0917AA440086D5D9 /* pngconf.h */, + 84677C8D0917AA440086D5D9 /* pngerror.c */, + 84677C8F0917AA440086D5D9 /* pngget.c */, + 84677C900917AA440086D5D9 /* pngmem.c */, + 84677C910917AA440086D5D9 /* pngpread.c */, + 84677C920917AA440086D5D9 /* pngread.c */, + 84677C930917AA440086D5D9 /* pngrio.c */, + 84677C940917AA440086D5D9 /* pngrtran.c */, + 84677C950917AA440086D5D9 /* pngrutil.c */, + 84677C960917AA440086D5D9 /* pngset.c */, + 84677C980917AA440086D5D9 /* pngtrans.c */, + 84677C9A0917AA440086D5D9 /* pngwio.c */, + 84677C9B0917AA440086D5D9 /* pngwrite.c */, + 84677C9C0917AA440086D5D9 /* pngwtran.c */, + 84677C9D0917AA440086D5D9 /* pngwutil.c */, + ); + name = pnglib; + path = ../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib; + sourceTree = SOURCE_ROOT; + }; + 84A4899708A22E4A00752A2B /* juce_core */ = { + isa = PBXGroup; + children = ( + 84A4899808A22E4A00752A2B /* basics */, + 84A489AD08A22E4A00752A2B /* containers */, + 84A489BD08A22E4A00752A2B /* cryptography */, + 84A489C608A22E4A00752A2B /* io */, + 84A489FF08A22E4A00752A2B /* misc */, + 84A48A0708A22E4A00752A2B /* text */, + 84A48A1508A22E4A00752A2B /* threads */, + ); + name = juce_core; + path = ../../src/juce_core; + sourceTree = SOURCE_ROOT; + }; + 84A4899808A22E4A00752A2B /* basics */ = { + isa = PBXGroup; + children = ( + 84A4899908A22E4A00752A2B /* juce_Atomic.h */, + 84A4899A08A22E4A00752A2B /* juce_DataConversions.h */, + 84A4899B08A22E4A00752A2B /* juce_FileLogger.cpp */, + 84A4899C08A22E4A00752A2B /* juce_FileLogger.h */, + 84A4899D08A22E4A00752A2B /* juce_Initialisation.h */, + 84A4899E08A22E4A00752A2B /* juce_Logger.cpp */, + 84A4899F08A22E4A00752A2B /* juce_Logger.h */, + 84A489A008A22E4A00752A2B /* juce_MathsFunctions.h */, + 84A489A108A22E4A00752A2B /* juce_Memory.h */, + 84A489A208A22E4A00752A2B /* juce_PlatformDefs.h */, + 84A489A308A22E4A00752A2B /* juce_Random.cpp */, + 84A489A408A22E4A00752A2B /* juce_Random.h */, + 84A489A508A22E4A00752A2B /* juce_RelativeTime.cpp */, + 84A489A608A22E4A00752A2B /* juce_RelativeTime.h */, + 84A489A708A22E4A00752A2B /* juce_Singleton.h */, + 84A489A808A22E4A00752A2B /* juce_StandardHeader.h */, + 84A489A908A22E4A00752A2B /* juce_SystemStats.cpp */, + 84A489AA08A22E4A00752A2B /* juce_SystemStats.h */, + 84A489AB08A22E4A00752A2B /* juce_Time.cpp */, + 84A489AC08A22E4A00752A2B /* juce_Time.h */, + ); + name = basics; + path = ../../src/juce_core/basics; + sourceTree = SOURCE_ROOT; + }; + 84A489AD08A22E4A00752A2B /* containers */ = { + isa = PBXGroup; + children = ( + 84A489AE08A22E4A00752A2B /* juce_Array.h */, + 84A489AF08A22E4A00752A2B /* juce_ArrayAllocationBase.h */, + 84A489B008A22E4A00752A2B /* juce_BitArray.cpp */, + 84A489B108A22E4A00752A2B /* juce_BitArray.h */, + 84A489B208A22E4A00752A2B /* juce_ElementComparator.h */, + 84A489B308A22E4A00752A2B /* juce_MemoryBlock.cpp */, + 84A489B408A22E4A00752A2B /* juce_MemoryBlock.h */, + 84A489B508A22E4A00752A2B /* juce_OwnedArray.h */, + 84A489B608A22E4A00752A2B /* juce_PropertySet.cpp */, + 84A489B708A22E4A00752A2B /* juce_PropertySet.h */, + 84A489B808A22E4A00752A2B /* juce_ReferenceCountedArray.h */, + 84A489B908A22E4A00752A2B /* juce_ReferenceCountedObject.h */, + 84A489BA08A22E4A00752A2B /* juce_SortedSet.h */, + 84A489BB08A22E4A00752A2B /* juce_SparseSet.h */, + 84A489BC08A22E4A00752A2B /* juce_VoidArray.h */, + ); + name = containers; + path = ../../src/juce_core/containers; + sourceTree = SOURCE_ROOT; + }; + 84A489BD08A22E4A00752A2B /* cryptography */ = { + isa = PBXGroup; + children = ( + 84A489BE08A22E4A00752A2B /* juce_BlowFish.cpp */, + 84A489BF08A22E4A00752A2B /* juce_BlowFish.h */, + 84A489C008A22E4A00752A2B /* juce_MD5.cpp */, + 84A489C108A22E4A00752A2B /* juce_MD5.h */, + 84A489C208A22E4A00752A2B /* juce_Primes.cpp */, + 84A489C308A22E4A00752A2B /* juce_Primes.h */, + 84A489C408A22E4A00752A2B /* juce_RSAKey.cpp */, + 84A489C508A22E4A00752A2B /* juce_RSAKey.h */, + ); + name = cryptography; + path = ../../src/juce_core/cryptography; + sourceTree = SOURCE_ROOT; + }; + 84A489C608A22E4A00752A2B /* io */ = { + isa = PBXGroup; + children = ( + 84A489C708A22E4A00752A2B /* files */, + 84A489D208A22E4A00752A2B /* juce_InputStream.cpp */, + 84A489D308A22E4A00752A2B /* juce_InputStream.h */, + 84A489D408A22E4A00752A2B /* juce_OutputStream.cpp */, + 84A489D508A22E4A00752A2B /* juce_OutputStream.h */, + 84A489D608A22E4A00752A2B /* network */, + 84A489D908A22E4A00752A2B /* streams */, + ); + name = io; + path = ../../src/juce_core/io; + sourceTree = SOURCE_ROOT; + }; + 84A489C708A22E4A00752A2B /* files */ = { + isa = PBXGroup; + children = ( + 84A489C808A22E4A00752A2B /* juce_DirectoryIterator.cpp */, + 84A489C908A22E4A00752A2B /* juce_DirectoryIterator.h */, + 84A489CA08A22E4A00752A2B /* juce_File.cpp */, + 84A489CB08A22E4A00752A2B /* juce_File.h */, + 84A489CC08A22E4A00752A2B /* juce_FileInputStream.cpp */, + 84A489CD08A22E4A00752A2B /* juce_FileInputStream.h */, + 84A489CE08A22E4A00752A2B /* juce_FileOutputStream.cpp */, + 84A489CF08A22E4A00752A2B /* juce_FileOutputStream.h */, + 84A489D008A22E4A00752A2B /* juce_FileSearchPath.cpp */, + 84A489D108A22E4A00752A2B /* juce_FileSearchPath.h */, + 84F5598609CACFF700AC5000 /* juce_NamedPipe.cpp */, + 84F5598709CACFF700AC5000 /* juce_NamedPipe.h */, + ); + name = files; + path = ../../src/juce_core/io/files; + sourceTree = SOURCE_ROOT; + }; + 84A489D608A22E4A00752A2B /* network */ = { + isa = PBXGroup; + children = ( + 84F5598209CACFDD00AC5000 /* juce_Socket.cpp */, + 84F5598309CACFDD00AC5000 /* juce_Socket.h */, + 84A489D708A22E4A00752A2B /* juce_URL.cpp */, + 84A489D808A22E4A00752A2B /* juce_URL.h */, + ); + name = network; + path = ../../src/juce_core/io/network; + sourceTree = SOURCE_ROOT; + }; + 84A489D908A22E4A00752A2B /* streams */ = { + isa = PBXGroup; + children = ( + 84A489DA08A22E4A00752A2B /* juce_BufferedInputStream.cpp */, + 84A489DB08A22E4A00752A2B /* juce_BufferedInputStream.h */, + 84A489DC08A22E4A00752A2B /* juce_GZIPCompressorOutputStream.cpp */, + 84A489DD08A22E4A00752A2B /* juce_GZIPCompressorOutputStream.h */, + 84A489DE08A22E4A00752A2B /* juce_GZIPDecompressorInputStream.cpp */, + 84A489DF08A22E4A00752A2B /* juce_GZIPDecompressorInputStream.h */, + 84A489E008A22E4A00752A2B /* juce_MemoryInputStream.cpp */, + 84A489E108A22E4A00752A2B /* juce_MemoryInputStream.h */, + 84A489E208A22E4A00752A2B /* juce_MemoryOutputStream.cpp */, + 84A489E308A22E4A00752A2B /* juce_MemoryOutputStream.h */, + 84A489E408A22E4A00752A2B /* juce_SubregionStream.cpp */, + 84A489E508A22E4A00752A2B /* juce_SubregionStream.h */, + 84A489E608A22E4A00752A2B /* zlib */, + ); + name = streams; + path = ../../src/juce_core/io/streams; + sourceTree = SOURCE_ROOT; + }; + 84A489E608A22E4A00752A2B /* zlib */ = { + isa = PBXGroup; + children = ( + 84677C860917A9DB0086D5D9 /* zconf.h */, + 84677C870917A9DB0086D5D9 /* zlib.h */, + 84677C700917A9B90086D5D9 /* adler32.c */, + 84677C710917A9B90086D5D9 /* compress.c */, + 84677C720917A9B90086D5D9 /* crc32.c */, + 84677C730917A9B90086D5D9 /* deflate.c */, + 84677C740917A9B90086D5D9 /* infback.c */, + 84677C750917A9B90086D5D9 /* inffast.c */, + 84677C760917A9B90086D5D9 /* inflate.c */, + 84677C770917A9B90086D5D9 /* inftrees.c */, + 84677C780917A9B90086D5D9 /* trees.c */, + 84677C790917A9B90086D5D9 /* uncompr.c */, + 84677C7A0917A9B90086D5D9 /* zutil.c */, + ); + name = zlib; + path = ../../src/juce_core/io/streams/zlib; + sourceTree = SOURCE_ROOT; + }; + 84A489FF08A22E4A00752A2B /* misc */ = { + isa = PBXGroup; + children = ( + 84A48A0008A22E4A00752A2B /* juce_PerformanceCounter.cpp */, + 84A48A0108A22E4A00752A2B /* juce_PerformanceCounter.h */, + 84A48A0208A22E4A00752A2B /* juce_PlatformUtilities.h */, + 84A48A0308A22E4A00752A2B /* juce_Uuid.cpp */, + 84A48A0408A22E4A00752A2B /* juce_Uuid.h */, + 84A48A0508A22E4A00752A2B /* juce_ZipFile.cpp */, + 84A48A0608A22E4A00752A2B /* juce_ZipFile.h */, + ); + name = misc; + path = ../../src/juce_core/misc; + sourceTree = SOURCE_ROOT; + }; + 84A48A0708A22E4A00752A2B /* text */ = { + isa = PBXGroup; + children = ( + 846927D80A49ABD300314975 /* juce_CharacterFunctions.cpp */, + 846927D90A49ABD300314975 /* juce_CharacterFunctions.h */, + 84A48A0808A22E4A00752A2B /* juce_LocalisedStrings.cpp */, + 84A48A0908A22E4A00752A2B /* juce_LocalisedStrings.h */, + 84A48A0A08A22E4A00752A2B /* juce_String.cpp */, + 84A48A0B08A22E4A00752A2B /* juce_String.h */, + 84A48A0C08A22E4A00752A2B /* juce_StringArray.cpp */, + 84A48A0D08A22E4A00752A2B /* juce_StringArray.h */, + 84A48A0E08A22E4A00752A2B /* juce_StringPairArray.cpp */, + 84A48A0F08A22E4A00752A2B /* juce_StringPairArray.h */, + 84A48A1108A22E4A00752A2B /* juce_XmlDocument.cpp */, + 84A48A1208A22E4A00752A2B /* juce_XmlDocument.h */, + 84A48A1308A22E4A00752A2B /* juce_XmlElement.cpp */, + 84A48A1408A22E4A00752A2B /* juce_XmlElement.h */, + ); + name = text; + path = ../../src/juce_core/text; + sourceTree = SOURCE_ROOT; + }; + 84A48A1508A22E4A00752A2B /* threads */ = { + isa = PBXGroup; + children = ( + 84A48A1708A22E4A00752A2B /* juce_CriticalSection.h */, + 84A48A1808A22E4A00752A2B /* juce_InterProcessLock.cpp */, + 84A48A1908A22E4A00752A2B /* juce_InterProcessLock.h */, + 84A48A1B08A22E4A00752A2B /* juce_Process.h */, + 84A48A1C08A22E4A00752A2B /* juce_ReadWriteLock.cpp */, + 84A48A1D08A22E4A00752A2B /* juce_ReadWriteLock.h */, + 84A48A1E08A22E4A00752A2B /* juce_ScopedLock.h */, + 84A48A1F08A22E4A00752A2B /* juce_ScopedReadLock.h */, + 84A48A2008A22E4A00752A2B /* juce_ScopedWriteLock.h */, + 84A48A2108A22E4A00752A2B /* juce_Thread.cpp */, + 84A48A2208A22E4A00752A2B /* juce_Thread.h */, + 84A48A2308A22E4A00752A2B /* juce_ThreadPool.cpp */, + 84A48A2408A22E4A00752A2B /* juce_ThreadPool.h */, + 84A48A2508A22E4A00752A2B /* juce_TimeSliceThread.cpp */, + 84A48A2608A22E4A00752A2B /* juce_TimeSliceThread.h */, + 84A48A2708A22E4A00752A2B /* juce_WaitableEvent.h */, + ); + name = threads; + path = ../../src/juce_core/threads; + sourceTree = SOURCE_ROOT; + }; + 84F690DC0B3444A500ABAE1C /* flac */ = { + isa = PBXGroup; + children = ( + 84F690E10B3444E500ABAE1C /* bitbuffer.c */, + 84F690E20B3444E500ABAE1C /* bitmath.c */, + 84F690E30B3444E500ABAE1C /* cpu.c */, + 84F690E40B3444E500ABAE1C /* crc.c */, + 84F690E50B3444E500ABAE1C /* fixed.c */, + 84F690E60B3444E500ABAE1C /* float.c */, + 84F690E70B3444E500ABAE1C /* format.c */, + 84F690E80B3444E500ABAE1C /* lpc_flac.c */, + 84F690E90B3444E500ABAE1C /* md5.c */, + 84F690EA0B3444E500ABAE1C /* memory.c */, + 84F690EB0B3444E500ABAE1C /* stream_decoder.c */, + 84F690EC0B3444E500ABAE1C /* stream_encoder_framing.c */, + 84F690ED0B3444E500ABAE1C /* stream_encoder.c */, + 84F690EE0B3444E500ABAE1C /* window_flac.c */, + ); + name = flac; + sourceTree = ""; + }; + 84F690DF0B3444B000ABAE1C /* ogg */ = { + isa = PBXGroup; + children = ( + 84F690FD0B3444F800ABAE1C /* bitwise.c */, + 84F690FE0B3444F800ABAE1C /* framing.c */, + ); + name = ogg; + sourceTree = ""; + }; + 84F690E00B3444B500ABAE1C /* vorbis */ = { + isa = PBXGroup; + children = ( + 84F691010B34453600ABAE1C /* analysis.c */, + 84F691020B34453600ABAE1C /* bitrate.c */, + 84F691030B34453600ABAE1C /* block.c */, + 84F691040B34453600ABAE1C /* codebook.c */, + 84F691050B34453600ABAE1C /* envelope.c */, + 84F691060B34453600ABAE1C /* floor0.c */, + 84F691070B34453600ABAE1C /* floor1.c */, + 84F691080B34453600ABAE1C /* info.c */, + 84F691090B34453600ABAE1C /* lpc.c */, + 84F6910A0B34453600ABAE1C /* lsp.c */, + 84F6910B0B34453600ABAE1C /* mapping0.c */, + 84F6910C0B34453600ABAE1C /* mdct.c */, + 84F6910D0B34453600ABAE1C /* psy.c */, + 84F6910E0B34453600ABAE1C /* registry.c */, + 84F6910F0B34453600ABAE1C /* res0.c */, + 84F691100B34453600ABAE1C /* sharedbook.c */, + 84F691110B34453600ABAE1C /* smallft.c */, + 84F691120B34453600ABAE1C /* synthesis.c */, + 84F691140B34453600ABAE1C /* vorbisenc.c */, + 84F691150B34453600ABAE1C /* vorbisfile.c */, + 84F691160B34453600ABAE1C /* window.c */, + ); + name = vorbis; + sourceTree = ""; + }; + 84FC318609B749E400B75141 /* documents */ = { + isa = PBXGroup; + children = ( + 84FC318709B749FD00B75141 /* juce_FileBasedDocument.cpp */, + 84FC318809B749FD00B75141 /* juce_FileBasedDocument.h */, + 84FC318909B749FD00B75141 /* juce_RecentlyOpenedFilesList.cpp */, + 84FC318A09B749FD00B75141 /* juce_RecentlyOpenedFilesList.h */, + 84FC318B09B749FD00B75141 /* juce_SelectedItemSet.h */, + 84FC318C09B749FD00B75141 /* juce_UndoableAction.h */, + 84FC318D09B749FD00B75141 /* juce_UndoManager.cpp */, + 84FC318E09B749FD00B75141 /* juce_UndoManager.h */, + ); + name = documents; + sourceTree = ""; + }; + 84FC319709B74A1000B75141 /* filebrowser */ = { + isa = PBXGroup; + children = ( + 84FC319809B74A5C00B75141 /* juce_DirectoryContentsList.cpp */, + 84FC319909B74A5C00B75141 /* juce_DirectoryContentsList.h */, + 84FC319A09B74A5C00B75141 /* juce_FileBrowserComponent.cpp */, + 84FC319B09B74A5C00B75141 /* juce_FileBrowserComponent.h */, + 84FC319C09B74A5C00B75141 /* juce_FileBrowserListener.h */, + 84FC319D09B74A5C00B75141 /* juce_FileChooser.cpp */, + 84FC319E09B74A5C00B75141 /* juce_FileChooser.h */, + 84FC319F09B74A5C00B75141 /* juce_FileChooserDialogBox.cpp */, + 84FC31A009B74A5C00B75141 /* juce_FileChooserDialogBox.h */, + 84FC31A109B74A5C00B75141 /* juce_FileFilter.cpp */, + 84FC31A209B74A5C00B75141 /* juce_FileFilter.h */, + 84FC31A309B74A5C00B75141 /* juce_FileListComponent.cpp */, + 84FC31A409B74A5C00B75141 /* juce_FileListComponent.h */, + 84F1F05B0A36CE96008CCC5E /* juce_FilenameComponent.cpp */, + 84F1F05C0A36CE96008CCC5E /* juce_FilenameComponent.h */, + 84FC31A509B74A5C00B75141 /* juce_FilePreviewComponent.h */, + 84FC31A609B74A5C00B75141 /* juce_ImagePreviewComponent.cpp */, + 84FC31A709B74A5C00B75141 /* juce_ImagePreviewComponent.h */, + 84FC31A809B74A5C00B75141 /* juce_WildcardFileFilter.cpp */, + 84FC31A909B74A5C00B75141 /* juce_WildcardFileFilter.h */, + ); + name = filebrowser; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC043055464E500DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 84A48A2908A22E4B00752A2B /* juce_Application.h in Headers */, + 84A48A2B08A22E4B00752A2B /* juce_DeletedAtShutdown.h in Headers */, + 84A48A2D08A22E4B00752A2B /* juce_SystemClipboard.h in Headers */, + 84A48A2F08A22E4B00752A2B /* juce_AiffAudioFormat.h in Headers */, + 84A48A3108A22E4B00752A2B /* juce_AudioCDReader.h in Headers */, + 84A48A3308A22E4B00752A2B /* juce_AudioFormat.h in Headers */, + 84A48A3408A22E4B00752A2B /* juce_AudioFormatReader.h in Headers */, + 84A48A3508A22E4B00752A2B /* juce_AudioFormatWriter.h in Headers */, + 84A48A3708A22E4B00752A2B /* juce_AudioSubsectionReader.h in Headers */, + 84A48A3908A22E4B00752A2B /* juce_WavAudioFormat.h in Headers */, + 84A48A3B08A22E4B00752A2B /* juce_AudioFormatReaderSource.h in Headers */, + 84A48A3C08A22E4B00752A2B /* juce_AudioSource.h in Headers */, + 84A48A3E08A22E4B00752A2B /* juce_AudioSourcePlayer.h in Headers */, + 84A48A4008A22E4B00752A2B /* juce_AudioTransportSource.h in Headers */, + 84A48A4208A22E4B00752A2B /* juce_BufferingAudioSource.h in Headers */, + 84A48A4408A22E4B00752A2B /* juce_MixerAudioSource.h in Headers */, + 84A48A4508A22E4B00752A2B /* juce_PositionableAudioSource.h in Headers */, + 84A48A4708A22E4B00752A2B /* juce_ResamplingAudioSource.h in Headers */, + 84A48A5508A22E4B00752A2B /* juce_ActionBroadcaster.h in Headers */, + 84A48A5608A22E4B00752A2B /* juce_ActionListener.h in Headers */, + 84A48A5808A22E4B00752A2B /* juce_ActionListenerList.h in Headers */, + 84A48A5A08A22E4B00752A2B /* juce_AsyncUpdater.h in Headers */, + 84A48A5C08A22E4B00752A2B /* juce_ChangeBroadcaster.h in Headers */, + 84A48A5D08A22E4B00752A2B /* juce_ChangeListener.h in Headers */, + 84A48A5F08A22E4B00752A2B /* juce_ChangeListenerList.h in Headers */, + 84A48A6108A22E4B00752A2B /* juce_Message.h in Headers */, + 84A48A6308A22E4B00752A2B /* juce_MessageListener.h in Headers */, + 84A48A6508A22E4B00752A2B /* juce_MessageManager.h in Headers */, + 84A48A6708A22E4B00752A2B /* juce_Timer.h in Headers */, + 84A48A6908A22E4B00752A2B /* juce_ArrowButton.h in Headers */, + 84A48A6B08A22E4B00752A2B /* juce_Button.h in Headers */, + 84A48A6D08A22E4B00752A2B /* juce_DrawableButton.h in Headers */, + 84A48A6F08A22E4B00752A2B /* juce_HyperlinkButton.h in Headers */, + 84A48A7108A22E4B00752A2B /* juce_ImageButton.h in Headers */, + 84A48A7308A22E4B00752A2B /* juce_ShapeButton.h in Headers */, + 84A48A7508A22E4B00752A2B /* juce_TextButton.h in Headers */, + 84A48A7708A22E4B00752A2B /* juce_ToggleButton.h in Headers */, + 84A48A7908A22E4B00752A2B /* juce_ComboBox.h in Headers */, + 84A48A7D08A22E4B00752A2B /* juce_Label.h in Headers */, + 84A48A7F08A22E4B00752A2B /* juce_ListBox.h in Headers */, + 84A48A8108A22E4B00752A2B /* juce_ProgressBar.h in Headers */, + 84A48A8508A22E4B00752A2B /* juce_Slider.h in Headers */, + 84A48A8708A22E4B00752A2B /* juce_TextEditor.h in Headers */, + 84A48A8908A22E4B00752A2B /* juce_TreeView.h in Headers */, + 84A48A8B08A22E4B00752A2B /* juce_Component.h in Headers */, + 84A48A8C08A22E4B00752A2B /* juce_ComponentDeletionWatcher.h in Headers */, + 84A48A8E08A22E4B00752A2B /* juce_ComponentListener.h in Headers */, + 84A48A9008A22E4B00752A2B /* juce_Desktop.h in Headers */, + 84A48A9208A22E4B00752A2B /* juce_KeyListener.h in Headers */, + 84A48A9408A22E4B00752A2B /* juce_KeyMappingEditorComponent.h in Headers */, + 84A48A9608A22E4B00752A2B /* juce_KeyPress.h in Headers */, + 84A48A9808A22E4B00752A2B /* juce_KeyPressMappingSet.h in Headers */, + 84A48A9A08A22E4B00752A2B /* juce_ModifierKeys.h in Headers */, + 84A48A9C08A22E4B00752A2B /* juce_GroupComponent.h in Headers */, + 84A48A9F08A22E4B00752A2B /* juce_ResizableBorderComponent.h in Headers */, + 84A48AA108A22E4B00752A2B /* juce_ResizableCornerComponent.h in Headers */, + 84A48AA308A22E4B00752A2B /* juce_ScrollBar.h in Headers */, + 84A48AA508A22E4B00752A2B /* juce_StretchableLayoutManager.h in Headers */, + 84A48AA708A22E4B00752A2B /* juce_StretchableLayoutResizerBar.h in Headers */, + 84A48AA908A22E4B00752A2B /* juce_TabbedButtonBar.h in Headers */, + 84A48AAB08A22E4B00752A2B /* juce_TabbedComponent.h in Headers */, + 84A48AAD08A22E4B00752A2B /* juce_Viewport.h in Headers */, + 84A48AAF08A22E4B00752A2B /* juce_LookAndFeel.h in Headers */, + 84A48AB108A22E4B00752A2B /* juce_ShinyLookAndFeel.h in Headers */, + 84A48AB308A22E4B00752A2B /* juce_MenuBarComponent.h in Headers */, + 84A48AB408A22E4B00752A2B /* juce_MenuBarModel.h in Headers */, + 84A48AB608A22E4B00752A2B /* juce_PopupMenu.h in Headers */, + 84A48AB708A22E4B00752A2B /* juce_PopupMenuCustomComponent.h in Headers */, + 84A48AB908A22E4B00752A2B /* juce_ComponentDragger.h in Headers */, + 84A48ABB08A22E4B00752A2B /* juce_DragAndDropContainer.h in Headers */, + 84A48ABC08A22E4B00752A2B /* juce_DragAndDropTarget.h in Headers */, + 84A48ABE08A22E4B00752A2B /* juce_MouseCursor.h in Headers */, + 84A48AC008A22E4B00752A2B /* juce_MouseEvent.h in Headers */, + 84A48AC208A22E4B00752A2B /* juce_MouseHoverDetector.h in Headers */, + 84A48AC408A22E4B00752A2B /* juce_MouseListener.h in Headers */, + 84A48AC608A22E4B00752A2B /* juce_BubbleComponent.h in Headers */, + 84A48AC808A22E4B00752A2B /* juce_BubbleMessageComponent.h in Headers */, + 84A48ACA08A22E4B00752A2B /* juce_ColourSelector.h in Headers */, + 84A48ACC08A22E4B00752A2B /* juce_DropShadower.h in Headers */, + 84A48ACE08A22E4B00752A2B /* juce_OpenGLComponent.h in Headers */, + 84A48AD008A22E4B00752A2B /* juce_PreferencesPanel.h in Headers */, + 84A48AD208A22E4B00752A2B /* juce_QuickTimeMovieComponent.h in Headers */, + 84A48AD408A22E4B00752A2B /* juce_AlertWindow.h in Headers */, + 84A48AD608A22E4B00752A2B /* juce_DialogWindow.h in Headers */, + 84A48ADC08A22E4B00752A2B /* juce_ResizableWindow.h in Headers */, + 84A48ADE08A22E4B00752A2B /* juce_SplashScreen.h in Headers */, + 84A48AE008A22E4B00752A2B /* juce_ThreadWithProgressWindow.h in Headers */, + 84A48AE208A22E4B00752A2B /* juce_TooltipWindow.h in Headers */, + 84A48AE408A22E4B00752A2B /* juce_Brush.h in Headers */, + 84A48AE608A22E4B00752A2B /* juce_GradientBrush.h in Headers */, + 84A48AE808A22E4B00752A2B /* juce_ImageBrush.h in Headers */, + 84A48AEA08A22E4B00752A2B /* juce_SolidColourBrush.h in Headers */, + 84A48AEC08A22E4B00752A2B /* juce_Colour.h in Headers */, + 84A48AEE08A22E4B00752A2B /* juce_ColourGradient.h in Headers */, + 84A48AF008A22E4B00752A2B /* juce_Colours.h in Headers */, + 84A48AF108A22E4B00752A2B /* juce_PixelFormats.h in Headers */, + 84A48AF308A22E4B00752A2B /* juce_EdgeTable.h in Headers */, + 84A48AF508A22E4B00752A2B /* juce_Graphics.h in Headers */, + 84A48AF708A22E4B00752A2B /* juce_Justification.h in Headers */, + 84A48AF908A22E4B00752A2B /* juce_Drawable.h in Headers */, + 84A48AFB08A22E4B00752A2B /* juce_DrawableComposite.h in Headers */, + 84A48AFD08A22E4B00752A2B /* juce_DrawableImage.h in Headers */, + 84A48AFF08A22E4B00752A2B /* juce_DrawablePath.h in Headers */, + 84A48B0108A22E4B00752A2B /* juce_DrawableText.h in Headers */, + 84A48B0308A22E4B00752A2B /* juce_DropShadowEffect.h in Headers */, + 84A48B0508A22E4B00752A2B /* juce_GlowEffect.h in Headers */, + 84A48B0608A22E4B00752A2B /* juce_ImageEffectFilter.h in Headers */, + 84A48B0808A22E4B00752A2B /* juce_ReduceOpacityEffect.h in Headers */, + 84A48B0A08A22E4B00752A2B /* juce_Font.h in Headers */, + 84A48B0C08A22E4B00752A2B /* juce_GlyphArrangement.h in Headers */, + 84A48B0E08A22E4B00752A2B /* juce_TextLayout.h in Headers */, + 84A48B1008A22E4B00752A2B /* juce_Typeface.h in Headers */, + 84A48B1208A22E4B00752A2B /* juce_AffineTransform.h in Headers */, + 84A48B1408A22E4B00752A2B /* juce_Line.h in Headers */, + 84A48B1608A22E4B00752A2B /* juce_Path.h in Headers */, + 84A48B1808A22E4B00752A2B /* juce_PathIterator.h in Headers */, + 84A48B1A08A22E4B00752A2B /* juce_PathStrokeType.h in Headers */, + 84A48B1C08A22E4B00752A2B /* juce_Point.h in Headers */, + 84A48B1E08A22E4B00752A2B /* juce_Rectangle.h in Headers */, + 84A48B2008A22E4B00752A2B /* juce_RectangleList.h in Headers */, + 84A48B4A08A22E4B00752A2B /* juce_GIFLoader.h in Headers */, + 84A48B5B08A22E4B00752A2B /* juce_Image.h in Headers */, + 84A48B5D08A22E4B00752A2B /* juce_ImageCache.h in Headers */, + 84A48B5F08A22E4B00752A2B /* juce_ImageConvolutionKernel.h in Headers */, + 84A48B6108A22E4B00752A2B /* juce_ImageFileFormat.h in Headers */, + 84A48B6A08A22E4B00752A2B /* juce_Atomic.h in Headers */, + 84A48B6B08A22E4B00752A2B /* juce_DataConversions.h in Headers */, + 84A48B6D08A22E4B00752A2B /* juce_FileLogger.h in Headers */, + 84A48B6E08A22E4B00752A2B /* juce_Initialisation.h in Headers */, + 84A48B7008A22E4B00752A2B /* juce_Logger.h in Headers */, + 84A48B7108A22E4B00752A2B /* juce_MathsFunctions.h in Headers */, + 84A48B7208A22E4B00752A2B /* juce_Memory.h in Headers */, + 84A48B7308A22E4B00752A2B /* juce_PlatformDefs.h in Headers */, + 84A48B7508A22E4B00752A2B /* juce_Random.h in Headers */, + 84A48B7708A22E4B00752A2B /* juce_RelativeTime.h in Headers */, + 84A48B7808A22E4B00752A2B /* juce_Singleton.h in Headers */, + 84A48B7908A22E4B00752A2B /* juce_StandardHeader.h in Headers */, + 84A48B7B08A22E4B00752A2B /* juce_SystemStats.h in Headers */, + 84A48B7D08A22E4B00752A2B /* juce_Time.h in Headers */, + 84A48B7E08A22E4B00752A2B /* juce_Array.h in Headers */, + 84A48B7F08A22E4B00752A2B /* juce_ArrayAllocationBase.h in Headers */, + 84A48B8108A22E4B00752A2B /* juce_BitArray.h in Headers */, + 84A48B8208A22E4B00752A2B /* juce_ElementComparator.h in Headers */, + 84A48B8408A22E4B00752A2B /* juce_MemoryBlock.h in Headers */, + 84A48B8508A22E4B00752A2B /* juce_OwnedArray.h in Headers */, + 84A48B8708A22E4B00752A2B /* juce_PropertySet.h in Headers */, + 84A48B8808A22E4B00752A2B /* juce_ReferenceCountedArray.h in Headers */, + 84A48B8908A22E4B00752A2B /* juce_ReferenceCountedObject.h in Headers */, + 84A48B8A08A22E4B00752A2B /* juce_SortedSet.h in Headers */, + 84A48B8B08A22E4B00752A2B /* juce_SparseSet.h in Headers */, + 84A48B8C08A22E4B00752A2B /* juce_VoidArray.h in Headers */, + 84A48B8E08A22E4B00752A2B /* juce_BlowFish.h in Headers */, + 84A48B9008A22E4B00752A2B /* juce_MD5.h in Headers */, + 84A48B9208A22E4B00752A2B /* juce_Primes.h in Headers */, + 84A48B9408A22E4B00752A2B /* juce_RSAKey.h in Headers */, + 84A48B9608A22E4B00752A2B /* juce_DirectoryIterator.h in Headers */, + 84A48B9808A22E4B00752A2B /* juce_File.h in Headers */, + 84A48B9A08A22E4B00752A2B /* juce_FileInputStream.h in Headers */, + 84A48B9C08A22E4B00752A2B /* juce_FileOutputStream.h in Headers */, + 84A48B9E08A22E4B00752A2B /* juce_FileSearchPath.h in Headers */, + 84A48BA008A22E4B00752A2B /* juce_InputStream.h in Headers */, + 84A48BA208A22E4B00752A2B /* juce_OutputStream.h in Headers */, + 84A48BA408A22E4B00752A2B /* juce_URL.h in Headers */, + 84A48BA608A22E4B00752A2B /* juce_BufferedInputStream.h in Headers */, + 84A48BA808A22E4B00752A2B /* juce_GZIPCompressorOutputStream.h in Headers */, + 84A48BAA08A22E4B00752A2B /* juce_GZIPDecompressorInputStream.h in Headers */, + 84A48BAC08A22E4B00752A2B /* juce_MemoryInputStream.h in Headers */, + 84A48BAE08A22E4B00752A2B /* juce_MemoryOutputStream.h in Headers */, + 84A48BB008A22E4B00752A2B /* juce_SubregionStream.h in Headers */, + 84A48BC908A22E4B00752A2B /* juce_PerformanceCounter.h in Headers */, + 84A48BCA08A22E4B00752A2B /* juce_PlatformUtilities.h in Headers */, + 84A48BCC08A22E4B00752A2B /* juce_Uuid.h in Headers */, + 84A48BCE08A22E4B00752A2B /* juce_ZipFile.h in Headers */, + 84A48BD008A22E4B00752A2B /* juce_LocalisedStrings.h in Headers */, + 84A48BD208A22E4B00752A2B /* juce_String.h in Headers */, + 84A48BD408A22E4B00752A2B /* juce_StringArray.h in Headers */, + 84A48BD608A22E4B00752A2B /* juce_StringPairArray.h in Headers */, + 84A48BD908A22E4B00752A2B /* juce_XmlDocument.h in Headers */, + 84A48BDB08A22E4B00752A2B /* juce_XmlElement.h in Headers */, + 84A48BDD08A22E4B00752A2B /* juce_CriticalSection.h in Headers */, + 84A48BDF08A22E4B00752A2B /* juce_InterProcessLock.h in Headers */, + 84A48BE108A22E4B00752A2B /* juce_Process.h in Headers */, + 84A48BE308A22E4B00752A2B /* juce_ReadWriteLock.h in Headers */, + 84A48BE408A22E4B00752A2B /* juce_ScopedLock.h in Headers */, + 84A48BE508A22E4B00752A2B /* juce_ScopedReadLock.h in Headers */, + 84A48BE608A22E4B00752A2B /* juce_ScopedWriteLock.h in Headers */, + 84A48BE808A22E4B00752A2B /* juce_Thread.h in Headers */, + 84A48BEA08A22E4B00752A2B /* juce_ThreadPool.h in Headers */, + 84A48BEC08A22E4B00752A2B /* juce_TimeSliceThread.h in Headers */, + 84A48BED08A22E4B00752A2B /* juce_WaitableEvent.h in Headers */, + 84052DE508D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.h in Headers */, + 84677C880917A9DB0086D5D9 /* zconf.h in Headers */, + 84677C890917A9DB0086D5D9 /* zlib.h in Headers */, + 84677C9F0917AA440086D5D9 /* png.h in Headers */, + 84677CA00917AA440086D5D9 /* pngconf.h in Headers */, + 84677D130917AB5F0086D5D9 /* jinclude.h in Headers */, + 84677D180917AB5F0086D5D9 /* jpeglib.h in Headers */, + 84677D1C0917AB5F0086D5D9 /* jversion.h in Headers */, + 84677D1E0917AB5F0086D5D9 /* transupp.h in Headers */, + 840F80BC092B399D005E7B4E /* juce.h in Headers */, + 84F1B8DB09499F1400AD8EDE /* juce_MidiKeyboardComponent.h in Headers */, + 8406C44609642CE100C99145 /* juce_LowLevelGraphicsContext.h in Headers */, + 8406C44809642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.h in Headers */, + 84198B11096D8E2B0022A439 /* juce_AudioDeviceManager.h in Headers */, + 84198B12096D8E2B0022A439 /* juce_AudioIODevice.h in Headers */, + 84198B13096D8E2B0022A439 /* juce_MidiInput.h in Headers */, + 84198B14096D8E2B0022A439 /* juce_MidiOutput.h in Headers */, + 84198BB6096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.h in Headers */, + 84E8209509729D2A0097675B /* juce_AudioFormatManager.h in Headers */, + 84F593AF09855679008153BA /* juce_DocumentWindow.h in Headers */, + 84F593B109855693008153BA /* juce_LassoComponent.h in Headers */, + 84F46B7F098685BD0079F3FA /* juce_ComponentBoundsConstrainer.h in Headers */, + 8463D5C2098BD2DD00F9AEC2 /* juce_MidiBuffer.h in Headers */, + 8463D5C4098BD2DD00F9AEC2 /* juce_MidiFile.h in Headers */, + 8463D5C6098BD2DD00F9AEC2 /* juce_MidiKeyboardState.h in Headers */, + 8463D5C8098BD2DD00F9AEC2 /* juce_MidiMessage.h in Headers */, + 8463D5CA098BD2DD00F9AEC2 /* juce_MidiMessageCollector.h in Headers */, + 8463D5CC098BD2DD00F9AEC2 /* juce_MidiMessageSequence.h in Headers */, + 8463D5D1098BD30600F9AEC2 /* juce_TopLevelWindow.h in Headers */, + 84F8DAD1099C963A00E911ED /* juce_ComponentPeer.h in Headers */, + 84FC319009B749FD00B75141 /* juce_FileBasedDocument.h in Headers */, + 84FC319209B749FD00B75141 /* juce_RecentlyOpenedFilesList.h in Headers */, + 84FC319309B749FD00B75141 /* juce_SelectedItemSet.h in Headers */, + 84FC319409B749FD00B75141 /* juce_UndoableAction.h in Headers */, + 84FC319609B749FD00B75141 /* juce_UndoManager.h in Headers */, + 84FC31AB09B74A5C00B75141 /* juce_DirectoryContentsList.h in Headers */, + 84FC31AD09B74A5C00B75141 /* juce_FileBrowserComponent.h in Headers */, + 84FC31AE09B74A5C00B75141 /* juce_FileBrowserListener.h in Headers */, + 84FC31B009B74A5C00B75141 /* juce_FileChooser.h in Headers */, + 84FC31B209B74A5C00B75141 /* juce_FileChooserDialogBox.h in Headers */, + 84FC31B409B74A5C00B75141 /* juce_FileFilter.h in Headers */, + 84FC31B609B74A5C00B75141 /* juce_FileListComponent.h in Headers */, + 84FC31B709B74A5C00B75141 /* juce_FilePreviewComponent.h in Headers */, + 84FC31B909B74A5C00B75141 /* juce_ImagePreviewComponent.h in Headers */, + 84FC31BB09B74A5C00B75141 /* juce_WildcardFileFilter.h in Headers */, + 84FC31BF09B74A7700B75141 /* juce_BorderSize.h in Headers */, + 84D296BE09B763190026C535 /* juce_PropertiesFile.h in Headers */, + 84F5598509CACFDD00AC5000 /* juce_Socket.h in Headers */, + 84F5598909CACFF700AC5000 /* juce_NamedPipe.h in Headers */, + 84A06BAF09CAD6A3006A43BD /* juce_AudioIODeviceType.h in Headers */, + 846034DF09CB374E00E255CF /* juce_InterprocessConnection.h in Headers */, + 846034E109CB374E00E255CF /* juce_InterprocessConnectionServer.h in Headers */, + 842B63BB09D8508F00255DC7 /* juce_FlacAudioFormat.h in Headers */, + 842B63BD09D8508F00255DC7 /* juce_OggVorbisAudioFormat.h in Headers */, + 8407909009E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.h in Headers */, + 84F589950A01491F00B80939 /* juce_TooltipClient.h in Headers */, + 84F5899F0A01493600B80939 /* juce_ApplicationCommandID.h in Headers */, + 84F589A10A01493600B80939 /* juce_ApplicationCommandInfo.h in Headers */, + 84F589A30A01493600B80939 /* juce_ApplicationCommandManager.h in Headers */, + 84F589A50A01493600B80939 /* juce_ApplicationCommandTarget.h in Headers */, + 842F9D640A19C9AF00B1358D /* juce_ButtonPropertyComponent.h in Headers */, + 842F9D660A19C9AF00B1358D /* juce_ChoicePropertyComponent.h in Headers */, + 842F9D680A19C9AF00B1358D /* juce_PropertyComponent.h in Headers */, + 842F9D6A0A19C9AF00B1358D /* juce_PropertyPanel.h in Headers */, + 842F9D6C0A19C9AF00B1358D /* juce_SliderPropertyComponent.h in Headers */, + 842F9D6E0A19C9AF00B1358D /* juce_TextPropertyComponent.h in Headers */, + 842F9DE30A19D2AF00B1358D /* juce_PositionedRectangle.h in Headers */, + 84F5552B0A2235E100A8311C /* juce_MultiDocumentPanel.h in Headers */, + 84F1F05E0A36CE96008CCC5E /* juce_FilenameComponent.h in Headers */, + 84F1F0620A36CF06008CCC5E /* juce_BooleanPropertyComponent.h in Headers */, + 84F1F0660A36CF32008CCC5E /* juce_MagnifierComponent.h in Headers */, + 84F1F06A0A36CF45008CCC5E /* juce_KeyboardFocusTraverser.h in Headers */, + 846927DB0A49ABD300314975 /* juce_CharacterFunctions.h in Headers */, + 846927DF0A49ABE600314975 /* juce_RectanglePlacement.h in Headers */, + 8417EE540A6E7A280058E04E /* juce_TableHeaderComponent.h in Headers */, + 8417EE560A6E7A280058E04E /* juce_TableListBox.h in Headers */, + 8417EE5A0A6E7A370058E04E /* juce_StretchableObjectResizer.h in Headers */, + 84F7A7B00A8383A100D36246 /* juce_ToolbarButton.h in Headers */, + 84F7A7B90A8383C200D36246 /* juce_Toolbar.h in Headers */, + 84F7A7BB0A8383C200D36246 /* juce_ToolbarItemComponent.h in Headers */, + 84F7A7BC0A8383C200D36246 /* juce_ToolbarItemFactory.h in Headers */, + 84F7A7BE0A8383C200D36246 /* juce_ToolbarItemPalette.h in Headers */, + 84F7A7C20A8383E000D36246 /* juce_MultiTimer.h in Headers */, + 84F7A7F00A838CC900D36246 /* juce_ComponentAnimator.h in Headers */, + 8440CD3F0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h in Headers */, + 8440CD620ACD112E0086FFD7 /* juce_SliderListener.h in Headers */, + 84099CA00AE52BD000B2A05D /* juce_Sampler.h in Headers */, + 84099CA20AE52BD000B2A05D /* juce_Synthesiser.h in Headers */, + 841E06360AF8CE75005E6FCC /* juce_AudioDataConverters.h in Headers */, + 841E06380AF8CE75005E6FCC /* juce_AudioSampleBuffer.h in Headers */, + 841E063A0AF8CE75005E6FCC /* juce_IIRFilter.h in Headers */, + 84F525010B32A8D500597B73 /* juce_ApplicationProperties.h in Headers */, + 84C0EA5F0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.h in Headers */, + 84F6B7550C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC045055464E500DB518D /* Juce */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84A487F708A22DD800752A2B /* Build configuration list for PBXNativeTarget "Juce" */; + buildPhases = ( + D2AAC043055464E500DB518D /* Headers */, + D2AAC044055464E500DB518D /* Sources */, + D289987405E68DCB004EDB86 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Juce; + productName = Juce; + productReference = D2AAC046055464E500DB518D /* libjuce.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 84A487FB08A22DD800752A2B /* Build configuration list for PBXProject "Juce" */; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* Juce */; + projectDirPath = ""; + targets = ( + D2AAC045055464E500DB518D /* Juce */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC044055464E500DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84A4882908A22E2400752A2B /* juce_mac_CoreAudio.cpp in Sources */, + 84A4882A08A22E2400752A2B /* juce_mac_CoreMidi.cpp in Sources */, + 84A4882B08A22E2400752A2B /* juce_mac_FileChooser.cpp in Sources */, + 84A4882C08A22E2400752A2B /* juce_mac_Files.cpp in Sources */, + 84A4882D08A22E2400752A2B /* juce_mac_Fonts.cpp in Sources */, + 84A4882E08A22E2400752A2B /* juce_mac_Messaging.cpp in Sources */, + 84A4882F08A22E2400752A2B /* juce_mac_Network.cpp in Sources */, + 84A4883008A22E2400752A2B /* juce_mac_SystemStats.cpp in Sources */, + 84A4883108A22E2400752A2B /* juce_mac_Threads.cpp in Sources */, + 84A4883208A22E2400752A2B /* juce_mac_Windowing.cpp in Sources */, + 84A48A2808A22E4B00752A2B /* juce_Application.cpp in Sources */, + 84A48A2A08A22E4B00752A2B /* juce_DeletedAtShutdown.cpp in Sources */, + 84A48A2E08A22E4B00752A2B /* juce_AiffAudioFormat.cpp in Sources */, + 84A48A3008A22E4B00752A2B /* juce_AudioCDReader.cpp in Sources */, + 84A48A3208A22E4B00752A2B /* juce_AudioFormat.cpp in Sources */, + 84A48A3608A22E4B00752A2B /* juce_AudioSubsectionReader.cpp in Sources */, + 84A48A3808A22E4B00752A2B /* juce_WavAudioFormat.cpp in Sources */, + 84A48A3A08A22E4B00752A2B /* juce_AudioFormatReaderSource.cpp in Sources */, + 84A48A3D08A22E4B00752A2B /* juce_AudioSourcePlayer.cpp in Sources */, + 84A48A3F08A22E4B00752A2B /* juce_AudioTransportSource.cpp in Sources */, + 84A48A4108A22E4B00752A2B /* juce_BufferingAudioSource.cpp in Sources */, + 84A48A4308A22E4B00752A2B /* juce_MixerAudioSource.cpp in Sources */, + 84A48A4608A22E4B00752A2B /* juce_ResamplingAudioSource.cpp in Sources */, + 84A48A5408A22E4B00752A2B /* juce_ActionBroadcaster.cpp in Sources */, + 84A48A5708A22E4B00752A2B /* juce_ActionListenerList.cpp in Sources */, + 84A48A5908A22E4B00752A2B /* juce_AsyncUpdater.cpp in Sources */, + 84A48A5B08A22E4B00752A2B /* juce_ChangeBroadcaster.cpp in Sources */, + 84A48A5E08A22E4B00752A2B /* juce_ChangeListenerList.cpp in Sources */, + 84A48A6008A22E4B00752A2B /* juce_Message.cpp in Sources */, + 84A48A6208A22E4B00752A2B /* juce_MessageListener.cpp in Sources */, + 84A48A6408A22E4B00752A2B /* juce_MessageManager.cpp in Sources */, + 84A48A6608A22E4B00752A2B /* juce_Timer.cpp in Sources */, + 84A48A6808A22E4B00752A2B /* juce_ArrowButton.cpp in Sources */, + 84A48A6A08A22E4B00752A2B /* juce_Button.cpp in Sources */, + 84A48A6C08A22E4B00752A2B /* juce_DrawableButton.cpp in Sources */, + 84A48A6E08A22E4B00752A2B /* juce_HyperlinkButton.cpp in Sources */, + 84A48A7008A22E4B00752A2B /* juce_ImageButton.cpp in Sources */, + 84A48A7208A22E4B00752A2B /* juce_ShapeButton.cpp in Sources */, + 84A48A7408A22E4B00752A2B /* juce_TextButton.cpp in Sources */, + 84A48A7608A22E4B00752A2B /* juce_ToggleButton.cpp in Sources */, + 84A48A7808A22E4B00752A2B /* juce_ComboBox.cpp in Sources */, + 84A48A7C08A22E4B00752A2B /* juce_Label.cpp in Sources */, + 84A48A7E08A22E4B00752A2B /* juce_ListBox.cpp in Sources */, + 84A48A8008A22E4B00752A2B /* juce_ProgressBar.cpp in Sources */, + 84A48A8408A22E4B00752A2B /* juce_Slider.cpp in Sources */, + 84A48A8608A22E4B00752A2B /* juce_TextEditor.cpp in Sources */, + 84A48A8808A22E4B00752A2B /* juce_TreeView.cpp in Sources */, + 84A48A8A08A22E4B00752A2B /* juce_Component.cpp in Sources */, + 84A48A8D08A22E4B00752A2B /* juce_ComponentListener.cpp in Sources */, + 84A48A8F08A22E4B00752A2B /* juce_Desktop.cpp in Sources */, + 84A48A9108A22E4B00752A2B /* juce_KeyListener.cpp in Sources */, + 84A48A9308A22E4B00752A2B /* juce_KeyMappingEditorComponent.cpp in Sources */, + 84A48A9508A22E4B00752A2B /* juce_KeyPress.cpp in Sources */, + 84A48A9708A22E4B00752A2B /* juce_KeyPressMappingSet.cpp in Sources */, + 84A48A9908A22E4B00752A2B /* juce_ModifierKeys.cpp in Sources */, + 84A48A9B08A22E4B00752A2B /* juce_GroupComponent.cpp in Sources */, + 84A48A9E08A22E4B00752A2B /* juce_ResizableBorderComponent.cpp in Sources */, + 84A48AA008A22E4B00752A2B /* juce_ResizableCornerComponent.cpp in Sources */, + 84A48AA208A22E4B00752A2B /* juce_ScrollBar.cpp in Sources */, + 84A48AA408A22E4B00752A2B /* juce_StretchableLayoutManager.cpp in Sources */, + 84A48AA608A22E4B00752A2B /* juce_StretchableLayoutResizerBar.cpp in Sources */, + 84A48AA808A22E4B00752A2B /* juce_TabbedButtonBar.cpp in Sources */, + 84A48AAA08A22E4B00752A2B /* juce_TabbedComponent.cpp in Sources */, + 84A48AAC08A22E4B00752A2B /* juce_Viewport.cpp in Sources */, + 84A48AAE08A22E4B00752A2B /* juce_LookAndFeel.cpp in Sources */, + 84A48AB008A22E4B00752A2B /* juce_ShinyLookAndFeel.cpp in Sources */, + 84A48AB208A22E4B00752A2B /* juce_MenuBarComponent.cpp in Sources */, + 84A48AB508A22E4B00752A2B /* juce_PopupMenu.cpp in Sources */, + 84A48AB808A22E4B00752A2B /* juce_ComponentDragger.cpp in Sources */, + 84A48ABA08A22E4B00752A2B /* juce_DragAndDropContainer.cpp in Sources */, + 84A48ABD08A22E4B00752A2B /* juce_MouseCursor.cpp in Sources */, + 84A48ABF08A22E4B00752A2B /* juce_MouseEvent.cpp in Sources */, + 84A48AC108A22E4B00752A2B /* juce_MouseHoverDetector.cpp in Sources */, + 84A48AC308A22E4B00752A2B /* juce_MouseListener.cpp in Sources */, + 84A48AC508A22E4B00752A2B /* juce_BubbleComponent.cpp in Sources */, + 84A48AC708A22E4B00752A2B /* juce_BubbleMessageComponent.cpp in Sources */, + 84A48AC908A22E4B00752A2B /* juce_ColourSelector.cpp in Sources */, + 84A48ACB08A22E4B00752A2B /* juce_DropShadower.cpp in Sources */, + 84A48ACD08A22E4B00752A2B /* juce_OpenGLComponent.cpp in Sources */, + 84A48ACF08A22E4B00752A2B /* juce_PreferencesPanel.cpp in Sources */, + 84A48AD108A22E4B00752A2B /* juce_QuickTimeMovieComponent.cpp in Sources */, + 84A48AD308A22E4B00752A2B /* juce_AlertWindow.cpp in Sources */, + 84A48AD508A22E4B00752A2B /* juce_DialogWindow.cpp in Sources */, + 84A48ADB08A22E4B00752A2B /* juce_ResizableWindow.cpp in Sources */, + 84A48ADD08A22E4B00752A2B /* juce_SplashScreen.cpp in Sources */, + 84A48ADF08A22E4B00752A2B /* juce_ThreadWithProgressWindow.cpp in Sources */, + 84A48AE108A22E4B00752A2B /* juce_TooltipWindow.cpp in Sources */, + 84A48AE308A22E4B00752A2B /* juce_Brush.cpp in Sources */, + 84A48AE508A22E4B00752A2B /* juce_GradientBrush.cpp in Sources */, + 84A48AE708A22E4B00752A2B /* juce_ImageBrush.cpp in Sources */, + 84A48AE908A22E4B00752A2B /* juce_SolidColourBrush.cpp in Sources */, + 84A48AEB08A22E4B00752A2B /* juce_Colour.cpp in Sources */, + 84A48AED08A22E4B00752A2B /* juce_ColourGradient.cpp in Sources */, + 84A48AEF08A22E4B00752A2B /* juce_Colours.cpp in Sources */, + 84A48AF208A22E4B00752A2B /* juce_EdgeTable.cpp in Sources */, + 84A48AF408A22E4B00752A2B /* juce_Graphics.cpp in Sources */, + 84A48AF608A22E4B00752A2B /* juce_Justification.cpp in Sources */, + 84A48AF808A22E4B00752A2B /* juce_Drawable.cpp in Sources */, + 84A48AFA08A22E4B00752A2B /* juce_DrawableComposite.cpp in Sources */, + 84A48AFC08A22E4B00752A2B /* juce_DrawableImage.cpp in Sources */, + 84A48AFE08A22E4B00752A2B /* juce_DrawablePath.cpp in Sources */, + 84A48B0008A22E4B00752A2B /* juce_DrawableText.cpp in Sources */, + 84A48B0208A22E4B00752A2B /* juce_DropShadowEffect.cpp in Sources */, + 84A48B0408A22E4B00752A2B /* juce_GlowEffect.cpp in Sources */, + 84A48B0708A22E4B00752A2B /* juce_ReduceOpacityEffect.cpp in Sources */, + 84A48B0908A22E4B00752A2B /* juce_Font.cpp in Sources */, + 84A48B0B08A22E4B00752A2B /* juce_GlyphArrangement.cpp in Sources */, + 84A48B0D08A22E4B00752A2B /* juce_TextLayout.cpp in Sources */, + 84A48B0F08A22E4B00752A2B /* juce_Typeface.cpp in Sources */, + 84A48B1108A22E4B00752A2B /* juce_AffineTransform.cpp in Sources */, + 84A48B1308A22E4B00752A2B /* juce_Line.cpp in Sources */, + 84A48B1508A22E4B00752A2B /* juce_Path.cpp in Sources */, + 84A48B1708A22E4B00752A2B /* juce_PathIterator.cpp in Sources */, + 84A48B1908A22E4B00752A2B /* juce_PathStrokeType.cpp in Sources */, + 84A48B1B08A22E4B00752A2B /* juce_Point.cpp in Sources */, + 84A48B1D08A22E4B00752A2B /* juce_Rectangle.cpp in Sources */, + 84A48B1F08A22E4B00752A2B /* juce_RectangleList.cpp in Sources */, + 84A48B4908A22E4B00752A2B /* juce_GIFLoader.cpp in Sources */, + 84A48B4B08A22E4B00752A2B /* juce_JPEGLoader.cpp in Sources */, + 84A48B4C08A22E4B00752A2B /* juce_PNGLoader.cpp in Sources */, + 84A48B5A08A22E4B00752A2B /* juce_Image.cpp in Sources */, + 84A48B5C08A22E4B00752A2B /* juce_ImageCache.cpp in Sources */, + 84A48B5E08A22E4B00752A2B /* juce_ImageConvolutionKernel.cpp in Sources */, + 84A48B6008A22E4B00752A2B /* juce_ImageFileFormat.cpp in Sources */, + 84A48B6C08A22E4B00752A2B /* juce_FileLogger.cpp in Sources */, + 84A48B6F08A22E4B00752A2B /* juce_Logger.cpp in Sources */, + 84A48B7408A22E4B00752A2B /* juce_Random.cpp in Sources */, + 84A48B7608A22E4B00752A2B /* juce_RelativeTime.cpp in Sources */, + 84A48B7A08A22E4B00752A2B /* juce_SystemStats.cpp in Sources */, + 84A48B7C08A22E4B00752A2B /* juce_Time.cpp in Sources */, + 84A48B8008A22E4B00752A2B /* juce_BitArray.cpp in Sources */, + 84A48B8308A22E4B00752A2B /* juce_MemoryBlock.cpp in Sources */, + 84A48B8608A22E4B00752A2B /* juce_PropertySet.cpp in Sources */, + 84A48B8D08A22E4B00752A2B /* juce_BlowFish.cpp in Sources */, + 84A48B8F08A22E4B00752A2B /* juce_MD5.cpp in Sources */, + 84A48B9108A22E4B00752A2B /* juce_Primes.cpp in Sources */, + 84A48B9308A22E4B00752A2B /* juce_RSAKey.cpp in Sources */, + 84A48B9508A22E4B00752A2B /* juce_DirectoryIterator.cpp in Sources */, + 84A48B9708A22E4B00752A2B /* juce_File.cpp in Sources */, + 84A48B9908A22E4B00752A2B /* juce_FileInputStream.cpp in Sources */, + 84A48B9B08A22E4B00752A2B /* juce_FileOutputStream.cpp in Sources */, + 84A48B9D08A22E4B00752A2B /* juce_FileSearchPath.cpp in Sources */, + 84A48B9F08A22E4B00752A2B /* juce_InputStream.cpp in Sources */, + 84A48BA108A22E4B00752A2B /* juce_OutputStream.cpp in Sources */, + 84A48BA308A22E4B00752A2B /* juce_URL.cpp in Sources */, + 84A48BA508A22E4B00752A2B /* juce_BufferedInputStream.cpp in Sources */, + 84A48BA708A22E4B00752A2B /* juce_GZIPCompressorOutputStream.cpp in Sources */, + 84A48BA908A22E4B00752A2B /* juce_GZIPDecompressorInputStream.cpp in Sources */, + 84A48BAB08A22E4B00752A2B /* juce_MemoryInputStream.cpp in Sources */, + 84A48BAD08A22E4B00752A2B /* juce_MemoryOutputStream.cpp in Sources */, + 84A48BAF08A22E4B00752A2B /* juce_SubregionStream.cpp in Sources */, + 84A48BC808A22E4B00752A2B /* juce_PerformanceCounter.cpp in Sources */, + 84A48BCB08A22E4B00752A2B /* juce_Uuid.cpp in Sources */, + 84A48BCD08A22E4B00752A2B /* juce_ZipFile.cpp in Sources */, + 84A48BCF08A22E4B00752A2B /* juce_LocalisedStrings.cpp in Sources */, + 84A48BD108A22E4B00752A2B /* juce_String.cpp in Sources */, + 84A48BD308A22E4B00752A2B /* juce_StringArray.cpp in Sources */, + 84A48BD508A22E4B00752A2B /* juce_StringPairArray.cpp in Sources */, + 84A48BD808A22E4B00752A2B /* juce_XmlDocument.cpp in Sources */, + 84A48BDA08A22E4B00752A2B /* juce_XmlElement.cpp in Sources */, + 84A48BDE08A22E4B00752A2B /* juce_InterProcessLock.cpp in Sources */, + 84A48BE208A22E4B00752A2B /* juce_ReadWriteLock.cpp in Sources */, + 84A48BE708A22E4B00752A2B /* juce_Thread.cpp in Sources */, + 84A48BE908A22E4B00752A2B /* juce_ThreadPool.cpp in Sources */, + 84A48BEB08A22E4B00752A2B /* juce_TimeSliceThread.cpp in Sources */, + 84052DE408D095D200BEC0F0 /* juce_ToneGeneratorAudioSource.cpp in Sources */, + 84677C7B0917A9BA0086D5D9 /* adler32.c in Sources */, + 84677C7C0917A9BA0086D5D9 /* compress.c in Sources */, + 84677C7D0917A9BA0086D5D9 /* crc32.c in Sources */, + 84677C7E0917A9BA0086D5D9 /* deflate.c in Sources */, + 84677C7F0917A9BA0086D5D9 /* infback.c in Sources */, + 84677C800917A9BA0086D5D9 /* inffast.c in Sources */, + 84677C810917A9BA0086D5D9 /* inflate.c in Sources */, + 84677C820917A9BA0086D5D9 /* inftrees.c in Sources */, + 84677C830917A9BA0086D5D9 /* trees.c in Sources */, + 84677C840917A9BA0086D5D9 /* uncompr.c in Sources */, + 84677C850917A9BA0086D5D9 /* zutil.c in Sources */, + 84677C9E0917AA440086D5D9 /* png.c in Sources */, + 84677CA10917AA440086D5D9 /* pngerror.c in Sources */, + 84677CA30917AA440086D5D9 /* pngget.c in Sources */, + 84677CA40917AA440086D5D9 /* pngmem.c in Sources */, + 84677CA50917AA440086D5D9 /* pngpread.c in Sources */, + 84677CA60917AA440086D5D9 /* pngread.c in Sources */, + 84677CA70917AA440086D5D9 /* pngrio.c in Sources */, + 84677CA80917AA440086D5D9 /* pngrtran.c in Sources */, + 84677CA90917AA440086D5D9 /* pngrutil.c in Sources */, + 84677CAA0917AA440086D5D9 /* pngset.c in Sources */, + 84677CAC0917AA440086D5D9 /* pngtrans.c in Sources */, + 84677CAE0917AA440086D5D9 /* pngwio.c in Sources */, + 84677CAF0917AA440086D5D9 /* pngwrite.c in Sources */, + 84677CB00917AA440086D5D9 /* pngwtran.c in Sources */, + 84677CB10917AA440086D5D9 /* pngwutil.c in Sources */, + 84677CEB0917AB5F0086D5D9 /* jcapimin.c in Sources */, + 84677CEC0917AB5F0086D5D9 /* jcapistd.c in Sources */, + 84677CED0917AB5F0086D5D9 /* jccoefct.c in Sources */, + 84677CEE0917AB5F0086D5D9 /* jccolor.c in Sources */, + 84677CEF0917AB5F0086D5D9 /* jcdctmgr.c in Sources */, + 84677CF00917AB5F0086D5D9 /* jchuff.c in Sources */, + 84677CF10917AB5F0086D5D9 /* jcinit.c in Sources */, + 84677CF20917AB5F0086D5D9 /* jcmainct.c in Sources */, + 84677CF30917AB5F0086D5D9 /* jcmarker.c in Sources */, + 84677CF40917AB5F0086D5D9 /* jcmaster.c in Sources */, + 84677CF50917AB5F0086D5D9 /* jcomapi.c in Sources */, + 84677CF60917AB5F0086D5D9 /* jcparam.c in Sources */, + 84677CF70917AB5F0086D5D9 /* jcphuff.c in Sources */, + 84677CF80917AB5F0086D5D9 /* jcprepct.c in Sources */, + 84677CF90917AB5F0086D5D9 /* jcsample.c in Sources */, + 84677CFA0917AB5F0086D5D9 /* jctrans.c in Sources */, + 84677CFB0917AB5F0086D5D9 /* jdapimin.c in Sources */, + 84677CFC0917AB5F0086D5D9 /* jdapistd.c in Sources */, + 84677CFD0917AB5F0086D5D9 /* jdatasrc.c in Sources */, + 84677CFE0917AB5F0086D5D9 /* jdcoefct.c in Sources */, + 84677CFF0917AB5F0086D5D9 /* jdcolor.c in Sources */, + 84677D000917AB5F0086D5D9 /* jddctmgr.c in Sources */, + 84677D010917AB5F0086D5D9 /* jdhuff.c in Sources */, + 84677D020917AB5F0086D5D9 /* jdinput.c in Sources */, + 84677D030917AB5F0086D5D9 /* jdmainct.c in Sources */, + 84677D040917AB5F0086D5D9 /* jdmarker.c in Sources */, + 84677D050917AB5F0086D5D9 /* jdmaster.c in Sources */, + 84677D060917AB5F0086D5D9 /* jdmerge.c in Sources */, + 84677D070917AB5F0086D5D9 /* jdphuff.c in Sources */, + 84677D080917AB5F0086D5D9 /* jdpostct.c in Sources */, + 84677D090917AB5F0086D5D9 /* jdsample.c in Sources */, + 84677D0A0917AB5F0086D5D9 /* jdtrans.c in Sources */, + 84677D0B0917AB5F0086D5D9 /* jerror.c in Sources */, + 84677D0C0917AB5F0086D5D9 /* jfdctflt.c in Sources */, + 84677D0D0917AB5F0086D5D9 /* jfdctfst.c in Sources */, + 84677D0E0917AB5F0086D5D9 /* jfdctint.c in Sources */, + 84677D0F0917AB5F0086D5D9 /* jidctflt.c in Sources */, + 84677D100917AB5F0086D5D9 /* jidctfst.c in Sources */, + 84677D110917AB5F0086D5D9 /* jidctint.c in Sources */, + 84677D120917AB5F0086D5D9 /* jidctred.c in Sources */, + 84677D140917AB5F0086D5D9 /* jmemmgr.c in Sources */, + 84677D150917AB5F0086D5D9 /* jmemnobs.c in Sources */, + 84677D190917AB5F0086D5D9 /* jquant1.c in Sources */, + 84677D1A0917AB5F0086D5D9 /* jquant2.c in Sources */, + 84677D1B0917AB5F0086D5D9 /* jutils.c in Sources */, + 84677D1D0917AB5F0086D5D9 /* transupp.c in Sources */, + 84F1B8DA09499F1400AD8EDE /* juce_MidiKeyboardComponent.cpp in Sources */, + 8406C44709642CE100C99145 /* juce_LowLevelGraphicsSoftwareRenderer.cpp in Sources */, + 84198B10096D8E2B0022A439 /* juce_AudioDeviceManager.cpp in Sources */, + 84198BB5096EB9E40022A439 /* juce_AudioDeviceSelectorComponent.cpp in Sources */, + 84E8209409729D2A0097675B /* juce_AudioFormatManager.cpp in Sources */, + 84F593AE09855679008153BA /* juce_DocumentWindow.cpp in Sources */, + 84F46B7E098685BD0079F3FA /* juce_ComponentBoundsConstrainer.cpp in Sources */, + 8463D5C1098BD2DD00F9AEC2 /* juce_MidiBuffer.cpp in Sources */, + 8463D5C3098BD2DD00F9AEC2 /* juce_MidiFile.cpp in Sources */, + 8463D5C5098BD2DD00F9AEC2 /* juce_MidiKeyboardState.cpp in Sources */, + 8463D5C7098BD2DD00F9AEC2 /* juce_MidiMessage.cpp in Sources */, + 8463D5C9098BD2DD00F9AEC2 /* juce_MidiMessageCollector.cpp in Sources */, + 8463D5CB098BD2DD00F9AEC2 /* juce_MidiMessageSequence.cpp in Sources */, + 8463D5D0098BD30600F9AEC2 /* juce_TopLevelWindow.cpp in Sources */, + 84F8DAD0099C963A00E911ED /* juce_ComponentPeer.cpp in Sources */, + 84FC318F09B749FD00B75141 /* juce_FileBasedDocument.cpp in Sources */, + 84FC319109B749FD00B75141 /* juce_RecentlyOpenedFilesList.cpp in Sources */, + 84FC319509B749FD00B75141 /* juce_UndoManager.cpp in Sources */, + 84FC31AA09B74A5C00B75141 /* juce_DirectoryContentsList.cpp in Sources */, + 84FC31AC09B74A5C00B75141 /* juce_FileBrowserComponent.cpp in Sources */, + 84FC31AF09B74A5C00B75141 /* juce_FileChooser.cpp in Sources */, + 84FC31B109B74A5C00B75141 /* juce_FileChooserDialogBox.cpp in Sources */, + 84FC31B309B74A5C00B75141 /* juce_FileFilter.cpp in Sources */, + 84FC31B509B74A5C00B75141 /* juce_FileListComponent.cpp in Sources */, + 84FC31B809B74A5C00B75141 /* juce_ImagePreviewComponent.cpp in Sources */, + 84FC31BA09B74A5C00B75141 /* juce_WildcardFileFilter.cpp in Sources */, + 84FC31BE09B74A7700B75141 /* juce_BorderSize.cpp in Sources */, + 84D296BD09B763190026C535 /* juce_PropertiesFile.cpp in Sources */, + 84F5598409CACFDD00AC5000 /* juce_Socket.cpp in Sources */, + 84F5598809CACFF700AC5000 /* juce_NamedPipe.cpp in Sources */, + 84A06BAD09CAD6A3006A43BD /* juce_AudioIODevice.cpp in Sources */, + 84A06BAE09CAD6A3006A43BD /* juce_AudioIODeviceType.cpp in Sources */, + 84A06BE309CADB06006A43BD /* juce_mac_NamedPipe.cpp in Sources */, + 846034DE09CB374E00E255CF /* juce_InterprocessConnection.cpp in Sources */, + 846034E009CB374E00E255CF /* juce_InterprocessConnectionServer.cpp in Sources */, + 842B63BA09D8508F00255DC7 /* juce_FlacAudioFormat.cpp in Sources */, + 842B63BC09D8508F00255DC7 /* juce_OggVorbisAudioFormat.cpp in Sources */, + 8407908F09E6B688004E7BCD /* juce_LowLevelGraphicsPostScriptRenderer.cpp in Sources */, + 84F589A00A01493600B80939 /* juce_ApplicationCommandInfo.cpp in Sources */, + 84F589A20A01493600B80939 /* juce_ApplicationCommandManager.cpp in Sources */, + 84F589A40A01493600B80939 /* juce_ApplicationCommandTarget.cpp in Sources */, + 842F9D630A19C9AF00B1358D /* juce_ButtonPropertyComponent.cpp in Sources */, + 842F9D650A19C9AF00B1358D /* juce_ChoicePropertyComponent.cpp in Sources */, + 842F9D670A19C9AF00B1358D /* juce_PropertyComponent.cpp in Sources */, + 842F9D690A19C9AF00B1358D /* juce_PropertyPanel.cpp in Sources */, + 842F9D6B0A19C9AF00B1358D /* juce_SliderPropertyComponent.cpp in Sources */, + 842F9D6D0A19C9AF00B1358D /* juce_TextPropertyComponent.cpp in Sources */, + 842F9DE20A19D2AF00B1358D /* juce_PositionedRectangle.cpp in Sources */, + 84F5552A0A2235E100A8311C /* juce_MultiDocumentPanel.cpp in Sources */, + 84F1F05D0A36CE96008CCC5E /* juce_FilenameComponent.cpp in Sources */, + 84F1F0610A36CF06008CCC5E /* juce_BooleanPropertyComponent.cpp in Sources */, + 84F1F0650A36CF32008CCC5E /* juce_MagnifierComponent.cpp in Sources */, + 84F1F0690A36CF45008CCC5E /* juce_KeyboardFocusTraverser.cpp in Sources */, + 846927DA0A49ABD300314975 /* juce_CharacterFunctions.cpp in Sources */, + 846927DE0A49ABE600314975 /* juce_RectanglePlacement.cpp in Sources */, + 846927E10A49ABFD00314975 /* juce_SVGParser.cpp in Sources */, + 8417EE530A6E7A280058E04E /* juce_TableHeaderComponent.cpp in Sources */, + 8417EE550A6E7A280058E04E /* juce_TableListBox.cpp in Sources */, + 8417EE590A6E7A370058E04E /* juce_StretchableObjectResizer.cpp in Sources */, + 84F7A7AF0A8383A100D36246 /* juce_ToolbarButton.cpp in Sources */, + 84F7A7B80A8383C200D36246 /* juce_Toolbar.cpp in Sources */, + 84F7A7BA0A8383C200D36246 /* juce_ToolbarItemComponent.cpp in Sources */, + 84F7A7BD0A8383C200D36246 /* juce_ToolbarItemPalette.cpp in Sources */, + 84F7A7C10A8383E000D36246 /* juce_MultiTimer.cpp in Sources */, + 84F7A7EF0A838CC900D36246 /* juce_ComponentAnimator.cpp in Sources */, + 8440CD3E0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp in Sources */, + 84099C9F0AE52BD000B2A05D /* juce_Sampler.cpp in Sources */, + 84099CA10AE52BD000B2A05D /* juce_Synthesiser.cpp in Sources */, + 841E06350AF8CE74005E6FCC /* juce_AudioDataConverters.cpp in Sources */, + 841E06370AF8CE75005E6FCC /* juce_AudioSampleBuffer.cpp in Sources */, + 841E06390AF8CE75005E6FCC /* juce_IIRFilter.cpp in Sources */, + 84F525000B32A8D500597B73 /* juce_ApplicationProperties.cpp in Sources */, + 84F690EF0B3444E500ABAE1C /* bitbuffer.c in Sources */, + 84F690F00B3444E500ABAE1C /* bitmath.c in Sources */, + 84F690F10B3444E500ABAE1C /* cpu.c in Sources */, + 84F690F20B3444E500ABAE1C /* crc.c in Sources */, + 84F690F30B3444E500ABAE1C /* fixed.c in Sources */, + 84F690F40B3444E500ABAE1C /* float.c in Sources */, + 84F690F50B3444E500ABAE1C /* format.c in Sources */, + 84F690F60B3444E500ABAE1C /* lpc_flac.c in Sources */, + 84F690F70B3444E500ABAE1C /* md5.c in Sources */, + 84F690F80B3444E500ABAE1C /* memory.c in Sources */, + 84F690F90B3444E500ABAE1C /* stream_decoder.c in Sources */, + 84F690FA0B3444E500ABAE1C /* stream_encoder_framing.c in Sources */, + 84F690FB0B3444E500ABAE1C /* stream_encoder.c in Sources */, + 84F690FC0B3444E500ABAE1C /* window_flac.c in Sources */, + 84F690FF0B3444F800ABAE1C /* bitwise.c in Sources */, + 84F691000B3444F800ABAE1C /* framing.c in Sources */, + 84F691170B34453600ABAE1C /* analysis.c in Sources */, + 84F691180B34453600ABAE1C /* bitrate.c in Sources */, + 84F691190B34453600ABAE1C /* block.c in Sources */, + 84F6911A0B34453600ABAE1C /* codebook.c in Sources */, + 84F6911B0B34453600ABAE1C /* envelope.c in Sources */, + 84F6911C0B34453600ABAE1C /* floor0.c in Sources */, + 84F6911D0B34453600ABAE1C /* floor1.c in Sources */, + 84F6911E0B34453600ABAE1C /* info.c in Sources */, + 84F6911F0B34453600ABAE1C /* lpc.c in Sources */, + 84F691200B34453600ABAE1C /* lsp.c in Sources */, + 84F691210B34453600ABAE1C /* mapping0.c in Sources */, + 84F691220B34453600ABAE1C /* mdct.c in Sources */, + 84F691230B34453600ABAE1C /* psy.c in Sources */, + 84F691240B34453600ABAE1C /* registry.c in Sources */, + 84F691250B34453600ABAE1C /* res0.c in Sources */, + 84F691260B34453600ABAE1C /* sharedbook.c in Sources */, + 84F691270B34453600ABAE1C /* smallft.c in Sources */, + 84F691280B34453600ABAE1C /* synthesis.c in Sources */, + 84F6912A0B34453600ABAE1C /* vorbisenc.c in Sources */, + 84F6912B0B34453600ABAE1C /* vorbisfile.c in Sources */, + 84F6912C0B34453600ABAE1C /* window.c in Sources */, + 84C0EA5E0B3DDF2400EDF9D9 /* juce_IIRFilterAudioSource.cpp in Sources */, + 84F6B7540C06E29D00BB8791 /* juce_ChannelRemappingAudioSource.cpp in Sources */, + 842D3D0E0C0D7CF200E9FFE4 /* juce_MenuBarModel.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 84A487F808A22DD800752A2B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 84A487F908A22DD800752A2B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + STRIP_STYLE = "non-global"; + }; + name = Release; + }; + 84A487FC08A22DD800752A2B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 842B64EA09D87B7900255DC7 /* juce.xcconfig */; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + COPY_PHASE_STRIP = NO; + DEPLOYMENT_LOCATION = YES; + DSTROOT = ../../bin; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_DEBUG=1", + "DEBUG=1", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = jucedebug; + SYMROOT = ../../bin; + }; + name = Debug; + }; + 84A487FD08A22DD800752A2B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 842B64EA09D87B7900255DC7 /* juce.xcconfig */; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + DEPLOYMENT_LOCATION = YES; + DSTROOT = ../../bin; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_NDEBUG=1", + "NDEBUG=1", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = juce; + SYMROOT = ../../bin; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84A487F708A22DD800752A2B /* Build configuration list for PBXNativeTarget "Juce" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84A487F808A22DD800752A2B /* Debug */, + 84A487F908A22DD800752A2B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 84A487FB08A22DD800752A2B /* Build configuration list for PBXProject "Juce" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84A487FC08A22DD800752A2B /* Debug */, + 84A487FD08A22DD800752A2B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/build/macosx/juce.xcconfig.tortoise.removed b/build/macosx/juce.xcconfig.tortoise.removed new file mode 100644 index 0000000000..09ff0c3065 --- /dev/null +++ b/build/macosx/juce.xcconfig.tortoise.removed @@ -0,0 +1,6 @@ +ARCHS = ppc i386 +SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk +GCC_VERSION_ppc = 3.3 +MACOSX_DEPLOYMENT_TARGET_ppc = 10.2 +OTHER_LD_FLAGS_ppc = /Developer/SDKs/MacOSX10.2.8.sdk/usr/lib/gcc/darwin/3.3/libstdc++.a +SDKROOT_ppc = /Developer/SDKs/MacOSX10.2.8.sdk \ No newline at end of file diff --git a/build/macosx/platform_specific_code/juce_mac_CoreAudio.cpp b/build/macosx/platform_specific_code/juce_mac_CoreAudio.cpp new file mode 100644 index 0000000000..9adff9162e --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_CoreAudio.cpp @@ -0,0 +1,1165 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include + +BEGIN_JUCE_NAMESPACE + + +#include "../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.h" +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_core/threads/juce_ScopedLock.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/text/juce_LocalisedStrings.h" + + +//============================================================================== +#ifndef JUCE_COREAUDIO_ERROR_LOGGING_ENABLED + #define JUCE_COREAUDIO_ERROR_LOGGING_ENABLED 1 +#endif + +//============================================================================== +#if JUCE_COREAUDIO_LOGGING_ENABLED + #define log(a) Logger::writeToLog (a) +#else + #define log(a) +#endif + +#if JUCE_COREAUDIO_ERROR_LOGGING_ENABLED + static bool logAnyErrors (const OSStatus err, const int lineNum) + { + if (err == noErr) + return true; + + Logger::writeToLog (T("CoreAudio error: ") + String (lineNum) + T(" - ") + String::toHexString ((int)err)); + jassertfalse + return false; + } + + #define OK(a) logAnyErrors (a, __LINE__) +#else + #define OK(a) (a == noErr) +#endif + +//============================================================================== +static const int maxNumChans = 96; + + +//============================================================================== +class CoreAudioInternal : public Timer +{ +public: + //============================================================================== + CoreAudioInternal (AudioDeviceID id) + : deviceID (id), + started (false), + audioBuffer (0), + numInputChans (0), + numOutputChans (0), + callbacksAllowed (true), + inputLatency (0), + outputLatency (0), + callback (0), + inputDevice (0), + isSlaveDevice (false) + { + sampleRate = 0; + bufferSize = 512; + + if (deviceID == 0) + { + error = TRANS("can't open device"); + } + else + { + updateDetailsFromDevice(); + + AudioDeviceAddPropertyListener (deviceID, + kAudioPropertyWildcardChannel, + kAudioPropertyWildcardSection, + kAudioPropertyWildcardPropertyID, + deviceListenerProc, this); + } + } + + ~CoreAudioInternal() + { + AudioDeviceRemovePropertyListener (deviceID, + kAudioPropertyWildcardChannel, + kAudioPropertyWildcardSection, + kAudioPropertyWildcardPropertyID, + deviceListenerProc); + + stop (false); + + if (audioBuffer != 0) + juce_free (audioBuffer); + + if (inputDevice != 0) + delete inputDevice; + } + + void setTempBufferSize (const int numChannels, const int numSamples) + { + if (audioBuffer != 0) + juce_free (audioBuffer); + + audioBuffer = (float*) juce_calloc (32 + numChannels * numSamples * sizeof (float)); + + zeromem (tempInputBuffers, sizeof (tempInputBuffers)); + zeromem (tempOutputBuffers, sizeof (tempOutputBuffers)); + + int count = 0; + int i; + for (i = maxNumChans; --i >= 0;) + if (activeInputChans[i]) + tempInputBuffers[i] = audioBuffer + count++ * numSamples; + + for (i = maxNumChans; --i >= 0;) + if (activeOutputChans[i]) + tempOutputBuffers[i] = audioBuffer + count++ * numSamples; + } + + // returns the number of actual available channels + void fillInChannelInfo (bool input) + { + int chanNum = 0, activeChans = 0; + UInt32 size; + + if (OK (AudioDeviceGetPropertyInfo (deviceID, 0, input, kAudioDevicePropertyStreamConfiguration, &size, 0))) + { + AudioBufferList* const bufList = (AudioBufferList*) juce_calloc (size); + + if (OK (AudioDeviceGetProperty (deviceID, 0, input, kAudioDevicePropertyStreamConfiguration, &size, bufList))) + { + const int numStreams = bufList->mNumberBuffers; + + for (int i = 0; i < numStreams; ++i) + { + const AudioBuffer& b = bufList->mBuffers[i]; + + for (unsigned int j = 0; j < b.mNumberChannels; ++j) + { + if (input) + { + if (activeInputChans[chanNum]) + { + inputChannelInfo [activeChans].sourceChannelNum = chanNum; + inputChannelInfo [activeChans].streamNum = i; + inputChannelInfo [activeChans].dataOffsetSamples = j; + inputChannelInfo [activeChans].dataStrideSamples = b.mNumberChannels; + ++activeChans; + numInputChannelInfos = activeChans; + } + + inChanNames.add (T("input ") + String (chanNum + 1)); + } + else + { + if (activeOutputChans[chanNum]) + { + outputChannelInfo [activeChans].sourceChannelNum = chanNum; + outputChannelInfo [activeChans].streamNum = i; + outputChannelInfo [activeChans].dataOffsetSamples = j; + outputChannelInfo [activeChans].dataStrideSamples = b.mNumberChannels; + ++activeChans; + numOutputChannelInfos = activeChans; + } + + outChanNames.add (T("output ") + String (chanNum + 1)); + } + + ++chanNum; + } + } + } + + juce_free (bufList); + } + } + + void updateDetailsFromDevice() + { + stopTimer(); + + if (deviceID == 0) + return; + + const ScopedLock sl (callbackLock); + + Float64 sr; + UInt32 size = sizeof (Float64); + if (OK (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyNominalSampleRate, &size, &sr))) + sampleRate = sr; + + UInt32 framesPerBuf; + size = sizeof (framesPerBuf); + + if (OK (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyBufferFrameSize, &size, &framesPerBuf))) + { + bufferSize = framesPerBuf; + + if (bufferSize > 0) + setTempBufferSize (numInputChans + numOutputChans, bufferSize); + } + + bufferSizes.clear(); + + if (OK (AudioDeviceGetPropertyInfo (deviceID, 0, false, kAudioDevicePropertyBufferFrameSizeRange, &size, 0))) + { + AudioValueRange* ranges = (AudioValueRange*) juce_calloc (size); + + if (OK (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyBufferFrameSizeRange, &size, ranges))) + { + bufferSizes.add ((int) ranges[0].mMinimum); + + for (int i = 32; i < 8192; i += 32) + { + for (int j = size / sizeof (AudioValueRange); --j >= 0;) + { + if (i >= ranges[j].mMinimum && i <= ranges[j].mMaximum) + { + bufferSizes.addIfNotAlreadyThere (i); + break; + } + } + } + + if (bufferSize > 0) + bufferSizes.addIfNotAlreadyThere (bufferSize); + } + + juce_free (ranges); + } + + if (bufferSizes.size() == 0 && bufferSize > 0) + bufferSizes.add (bufferSize); + + sampleRates.clear(); + const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 }; + String rates; + + if (OK (AudioDeviceGetPropertyInfo (deviceID, 0, false, kAudioDevicePropertyAvailableNominalSampleRates, &size, 0))) + { + AudioValueRange* ranges = (AudioValueRange*) juce_calloc (size); + + if (OK (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyAvailableNominalSampleRates, &size, ranges))) + { + for (int i = 0; i < numElementsInArray (possibleRates); ++i) + { + bool ok = false; + + for (int j = size / sizeof (AudioValueRange); --j >= 0;) + if (possibleRates[i] >= ranges[j].mMinimum - 2 && possibleRates[i] <= ranges[j].mMaximum + 2) + ok = true; + + if (ok) + { + sampleRates.add (possibleRates[i]); + rates << possibleRates[i] << T(" "); + } + } + } + + juce_free (ranges); + } + + if (sampleRates.size() == 0 && sampleRate > 0) + { + sampleRates.add (sampleRate); + rates << sampleRate; + } + + log (T("sr: ") + rates); + + inputLatency = 0; + outputLatency = 0; + UInt32 lat; + size = sizeof (UInt32); + if (AudioDeviceGetProperty (deviceID, 0, true, kAudioDevicePropertyLatency, &size, &lat) == noErr) + inputLatency = (int) lat; + + if (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyLatency, &size, &lat) == noErr) + outputLatency = (int) lat; + + log (T("lat: ") + String (inputLatency) + T(" ") + String (outputLatency)); + + inChanNames.clear(); + outChanNames.clear(); + + zeromem (inputChannelInfo, sizeof (inputChannelInfo)); + zeromem (outputChannelInfo, sizeof (outputChannelInfo)); + + fillInChannelInfo (true); + fillInChannelInfo (false); + } + + //============================================================================== + const StringArray getSources (bool input) + { + StringArray s; + int num = 0; + OSType* types = getAllDataSourcesForDevice (deviceID, input, num); + + if (types != 0) + { + for (int i = 0; i < num; ++i) + { + AudioValueTranslation avt; + char buffer[256]; + + avt.mInputData = (void*) &(types[i]); + avt.mInputDataSize = sizeof (UInt32); + avt.mOutputData = buffer; + avt.mOutputDataSize = 256; + + UInt32 transSize = sizeof (avt); + if (OK (AudioDeviceGetProperty (deviceID, 0, input, kAudioDevicePropertyDataSourceNameForID, &transSize, &avt))) + { + DBG (buffer); + s.add (buffer); + } + } + + juce_free (types); + } + + return s; + } + + int getCurrentSourceIndex (bool input) const + { + OSType currentSourceID = 0; + UInt32 size = 0; + int result = -1; + + if (deviceID != 0 + && OK (AudioDeviceGetPropertyInfo (deviceID, 0, input, kAudioDevicePropertyDataSource, &size, 0))) + { + if (OK (AudioDeviceGetProperty (deviceID, 0, input, kAudioDevicePropertyDataSource, &size, ¤tSourceID))) + { + int num = 0; + OSType* const types = getAllDataSourcesForDevice (deviceID, input, num); + + if (types != 0) + { + for (int i = 0; i < num; ++i) + { + if (types[num] == currentSourceID) + { + result = i; + break; + } + } + + juce_free (types); + } + } + } + + return result; + } + + void setCurrentSourceIndex (int index, bool input) + { + if (deviceID != 0) + { + int num = 0; + OSType* types = getAllDataSourcesForDevice (deviceID, input, num); + + if (types != 0) + { + if (index >= 0 && index < num) + { + OSType id = types[index]; + AudioDeviceSetProperty (deviceID, 0, 0, input, kAudioDevicePropertyDataSource, sizeof (id), &id); + } + + juce_free (types); + } + } + } + + //============================================================================== + const String reopen (const BitArray& inputChannels, + const BitArray& outputChannels, + double newSampleRate, + int bufferSizeSamples) + { + error = String::empty; + log (T("CoreAudio reopen")); + callbacksAllowed = false; + stopTimer(); + + stop (false); + + activeInputChans = inputChannels; + activeOutputChans = outputChannels; + numInputChans = inputChannels.countNumberOfSetBits(); + numOutputChans = outputChannels.countNumberOfSetBits(); + + // set sample rate + Float64 sr = newSampleRate; + UInt32 size = sizeof (sr); + OK (AudioDeviceSetProperty (deviceID, 0, 0, false, kAudioDevicePropertyNominalSampleRate, size, &sr)); + OK (AudioDeviceSetProperty (deviceID, 0, 0, true, kAudioDevicePropertyNominalSampleRate, size, &sr)); + + // change buffer size + UInt32 framesPerBuf = bufferSizeSamples; + size = sizeof (framesPerBuf); + + OK (AudioDeviceSetProperty (deviceID, 0, 0, false, kAudioDevicePropertyBufferFrameSize, size, &framesPerBuf)); + OK (AudioDeviceSetProperty (deviceID, 0, 0, true, kAudioDevicePropertyBufferFrameSize, size, &framesPerBuf)); + + // wait for the changes to happen (on some devices) + int i = 30; + while (--i >= 0) + { + updateDetailsFromDevice(); + + if (sampleRate == newSampleRate && bufferSizeSamples == bufferSize) + break; + + Thread::sleep (100); + } + + if (i < 0) + error = T("Couldn't change sample rate/buffer size"); + + if (sampleRates.size() == 0) + error = T("Device has no available sample-rates"); + + if (bufferSizes.size() == 0) + error = T("Device has no available buffer-sizes"); + + numInputChans = jmin (numInputChans, numInputChannelInfos); + numOutputChans = jmin (numOutputChans, numOutputChannelInfos); + + if (inputDevice != 0 && error.isEmpty()) + error = inputDevice->reopen (inputChannels, + outputChannels, + newSampleRate, + bufferSizeSamples); + + callbacksAllowed = true; + + return error; + } + + bool start (AudioIODeviceCallback* cb) + { + if (! started) + { + callback = 0; + + if (deviceID != 0) + { + if (OK (AudioDeviceAddIOProc (deviceID, audioIOProc, (void*) this))) + { + if (OK (AudioDeviceStart (deviceID, audioIOProc))) + { + started = true; + } + else + { + OK (AudioDeviceRemoveIOProc (deviceID, audioIOProc)); + } + } + } + } + + if (started) + { + const ScopedLock sl (callbackLock); + callback = cb; + } + + if (inputDevice != 0) + return started && inputDevice->start (cb); + else + return started; + } + + void stop (bool leaveInterruptRunning) + { + callbackLock.enter(); + callback = 0; + callbackLock.exit(); + + if (started + && (deviceID != 0) + && ! leaveInterruptRunning) + { + OK (AudioDeviceStop (deviceID, audioIOProc)); + OK (AudioDeviceRemoveIOProc (deviceID, audioIOProc)); + started = false; + + callbackLock.enter(); + callbackLock.exit(); + + // wait until it's definately stopped calling back.. + for (int i = 40; --i >= 0;) + { + Thread::sleep (50); + + UInt32 running = 0; + UInt32 size = sizeof (running); + OK (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyDeviceIsRunning, &size, &running)); + if (running == 0) + break; + } + + callbackLock.enter(); + callbackLock.exit(); + } + + if (inputDevice != 0) + inputDevice->stop (leaveInterruptRunning); + } + + double getSampleRate() const + { + return sampleRate; + } + + int getBufferSize() const + { + return bufferSize; + } + + void audioCallback (const AudioBufferList* inInputData, + AudioBufferList* outOutputData) + { + int i; + const ScopedLock sl (callbackLock); + + if (callback != 0) + { + if (inputDevice == 0) + { + for (i = numInputChans; --i >= 0;) + { + const CallbackDetailsForChannel& info = inputChannelInfo[i]; + float* dest = tempInputBuffers [info.sourceChannelNum]; + const float* src = ((const float*) inInputData->mBuffers[info.streamNum].mData) + + info.dataOffsetSamples; + const int stride = info.dataStrideSamples; + + if (stride != 0) // if this is zero, info is invalid + { + for (int j = bufferSize; --j >= 0;) + { + *dest++ = *src; + src += stride; + } + } + } + } + + if (! isSlaveDevice) + { + if (inputDevice == 0) + { + callback->audioDeviceIOCallback ((const float**) tempInputBuffers, + numInputChans, + tempOutputBuffers, + numOutputChans, + bufferSize); + } + else + { + jassert (inputDevice->bufferSize == bufferSize); + + callback->audioDeviceIOCallback ((const float**) inputDevice->tempInputBuffers, + inputDevice->numInputChans, + tempOutputBuffers, + numOutputChans, + bufferSize); + } + + for (i = numOutputChans; --i >= 0;) + { + const CallbackDetailsForChannel& info = outputChannelInfo[i]; + const float* src = tempOutputBuffers [info.sourceChannelNum]; + float* dest = ((float*) outOutputData->mBuffers[info.streamNum].mData) + + info.dataOffsetSamples; + const int stride = info.dataStrideSamples; + + if (stride != 0) // if this is zero, info is invalid + { + for (int j = bufferSize; --j >= 0;) + { + *dest = *src++; + dest += stride; + } + } + } + } + } + else + { + for (i = jmin (numOutputChans, numOutputChannelInfos); --i >= 0;) + { + const CallbackDetailsForChannel& info = outputChannelInfo[i]; + float* dest = ((float*) outOutputData->mBuffers[info.streamNum].mData) + + info.dataOffsetSamples; + const int stride = info.dataStrideSamples; + + if (stride != 0) // if this is zero, info is invalid + { + for (int j = bufferSize; --j >= 0;) + { + *dest = 0.0f; + dest += stride; + } + } + } + } + } + + // called by callbacks + void deviceDetailsChanged() + { + if (callbacksAllowed) + startTimer (100); + } + + void timerCallback() + { + stopTimer(); + log (T("CoreAudio device changed callback")); + + const double oldSampleRate = sampleRate; + const int oldBufferSize = bufferSize; + updateDetailsFromDevice(); + + if (oldBufferSize != bufferSize || oldSampleRate != sampleRate) + { + callbacksAllowed = false; + stop (false); + updateDetailsFromDevice(); + callbacksAllowed = true; + } + } + + CoreAudioInternal* getRelatedDevice() const + { + UInt32 size = 0; + CoreAudioInternal* result = 0; + + if (deviceID != 0 + && AudioDeviceGetPropertyInfo (deviceID, 0, false, kAudioDevicePropertyRelatedDevices, &size, 0) == noErr + && size > 0) + { + AudioDeviceID* devs = (AudioDeviceID*) juce_calloc (size); + + if (OK (AudioDeviceGetProperty (deviceID, 0, false, kAudioDevicePropertyRelatedDevices, &size, devs))) + { + for (unsigned int i = 0; i < size / sizeof (AudioDeviceID); ++i) + { + if (devs[i] != deviceID && devs[i] != 0) + { + result = new CoreAudioInternal (devs[i]); + + if (result->error.isEmpty()) + { + const bool thisIsInput = inChanNames.size() > 0 && outChanNames.size() == 0; + const bool otherIsInput = result->inChanNames.size() > 0 && result->outChanNames.size() == 0; + + if (thisIsInput != otherIsInput) + break; + } + + deleteAndZero (result); + } + } + } + + juce_free (devs); + } + + return result; + } + + //============================================================================== + juce_UseDebuggingNewOperator + + String error; + int inputLatency, outputLatency; + StringArray inChanNames, outChanNames; + Array sampleRates; + Array bufferSizes; + AudioIODeviceCallback* callback; + + CoreAudioInternal* inputDevice; + bool isSlaveDevice; + +private: + CriticalSection callbackLock; + AudioDeviceID deviceID; + bool started; + double sampleRate; + int bufferSize; + float* audioBuffer; + BitArray activeInputChans, activeOutputChans; + int numInputChans, numOutputChans; + bool callbacksAllowed; + + struct CallbackDetailsForChannel + { + int sourceChannelNum; + int streamNum; + int dataOffsetSamples; + int dataStrideSamples; + }; + + int numInputChannelInfos, numOutputChannelInfos; + CallbackDetailsForChannel inputChannelInfo [maxNumChans]; + CallbackDetailsForChannel outputChannelInfo [maxNumChans]; + float* tempInputBuffers [maxNumChans]; + float* tempOutputBuffers [maxNumChans]; + + CoreAudioInternal (const CoreAudioInternal&); + const CoreAudioInternal& operator= (const CoreAudioInternal&); + + //============================================================================== + static OSStatus audioIOProc (AudioDeviceID inDevice, + const AudioTimeStamp* inNow, + const AudioBufferList* inInputData, + const AudioTimeStamp* inInputTime, + AudioBufferList* outOutputData, + const AudioTimeStamp* inOutputTime, + void* device) + { + ((CoreAudioInternal*) device)->audioCallback (inInputData, outOutputData); + return noErr; + } + + static OSStatus deviceListenerProc (AudioDeviceID inDevice, + UInt32 inLine, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + void* inClientData) + { + CoreAudioInternal* const intern = (CoreAudioInternal*) inClientData; + + switch (inPropertyID) + { + case kAudioDevicePropertyBufferSize: + case kAudioDevicePropertyBufferFrameSize: + case kAudioDevicePropertyNominalSampleRate: + case kAudioDevicePropertyStreamFormat: + case kAudioDevicePropertyDeviceIsAlive: + intern->deviceDetailsChanged(); + break; + + case kAudioDevicePropertyBufferSizeRange: + case kAudioDevicePropertyVolumeScalar: + case kAudioDevicePropertyMute: + case kAudioDevicePropertyPlayThru: + case kAudioDevicePropertyDataSource: + case kAudioDevicePropertyDeviceIsRunning: + break; + } + + return noErr; + } + + //============================================================================== + static OSType* getAllDataSourcesForDevice (AudioDeviceID deviceID, const bool input, int& num) + { + OSType* types = 0; + UInt32 size = 0; + num = 0; + + if (deviceID != 0 + && OK (AudioDeviceGetPropertyInfo (deviceID, 0, input, kAudioDevicePropertyDataSources, &size, 0))) + { + types = (OSType*) juce_calloc (size); + + if (OK (AudioDeviceGetProperty (deviceID, 0, input, kAudioDevicePropertyDataSources, &size, types))) + { + num = size / sizeof (OSType); + } + else + { + juce_free (types); + types = 0; + } + } + + return types; + } +}; + + +//============================================================================== +class CoreAudioIODevice : public AudioIODevice +{ +public: + CoreAudioIODevice (const String& deviceName, + AudioDeviceID deviceId1) + : AudioIODevice (deviceName, T("CoreAudio")), + isOpen_ (false), + isStarted (false) + { + internal = 0; + + CoreAudioInternal* device = new CoreAudioInternal (deviceId1); + lastError = device->error; + + if (lastError.isNotEmpty()) + { + deleteAndZero (device); + } + else + { + CoreAudioInternal* secondDevice = device->getRelatedDevice(); + + if (secondDevice != 0) + { + if (device->inChanNames.size() > secondDevice->inChanNames.size()) + swapVariables (device, secondDevice); + + device->inputDevice = secondDevice; + secondDevice->isSlaveDevice = true; + } + } + + internal = device; + + AudioHardwareAddPropertyListener (kAudioPropertyWildcardPropertyID, + hardwareListenerProc, internal); + } + + ~CoreAudioIODevice() + { + AudioHardwareRemovePropertyListener (kAudioPropertyWildcardPropertyID, + hardwareListenerProc); + + delete internal; + } + + const StringArray getOutputChannelNames() + { + return internal->outChanNames; + } + + const StringArray getInputChannelNames() + { + if (internal->inputDevice != 0) + return internal->inputDevice->inChanNames; + else + return internal->inChanNames; + } + + int getNumSampleRates() + { + return internal->sampleRates.size(); + } + + double getSampleRate (int index) + { + return internal->sampleRates [index]; + } + + int getNumBufferSizesAvailable() + { + return internal->bufferSizes.size(); + } + + int getBufferSizeSamples (int index) + { + return internal->bufferSizes [index]; + } + + int getDefaultBufferSize() + { + for (int i = 0; i < getNumBufferSizesAvailable(); ++i) + if (getBufferSizeSamples(i) >= 512) + return getBufferSizeSamples(i); + + return 512; + } + + const String open (const BitArray& inputChannels, + const BitArray& outputChannels, + double sampleRate, + int bufferSizeSamples) + { + isOpen_ = true; + + if (bufferSizeSamples <= 0) + bufferSizeSamples = getDefaultBufferSize(); + + internal->reopen (inputChannels, outputChannels, sampleRate, bufferSizeSamples); + lastError = internal->error; + return lastError; + } + + void close() + { + isOpen_ = false; + } + + bool isOpen() + { + return isOpen_; + } + + int getCurrentBufferSizeSamples() + { + if (internal == 0) + return 512; + + return internal->getBufferSize(); + } + + double getCurrentSampleRate() + { + if (internal == 0) + return 0; + + return internal->getSampleRate(); + } + + int getCurrentBitDepth() + { + return 32; // no way to find out, so just assume it's high.. + } + + int getOutputLatencyInSamples() + { + if (internal == 0) + return 0; + + return internal->outputLatency; + } + + int getInputLatencyInSamples() + { + if (internal == 0) + return 0; + + return internal->inputLatency; + } + + void start (AudioIODeviceCallback* callback) + { + if (internal != 0 && ! isStarted) + { + if (callback != 0) + callback->audioDeviceAboutToStart (getCurrentSampleRate(), + getCurrentBufferSizeSamples()); + + isStarted = true; + internal->start (callback); + } + } + + void stop() + { + if (isStarted && internal != 0) + { + AudioIODeviceCallback* const lastCallback = internal->callback; + + isStarted = false; + internal->stop (true); + + if (lastCallback != 0) + lastCallback->audioDeviceStopped(); + } + } + + bool isPlaying() + { + if (internal->callback == 0) + isStarted = false; + + return isStarted; + } + + const String getLastError() + { + return lastError; + } + + juce_UseDebuggingNewOperator + +private: + CoreAudioInternal* internal; + bool isOpen_, isStarted; + String lastError; + + static OSStatus hardwareListenerProc (AudioHardwarePropertyID inPropertyID, void* inClientData) + { + CoreAudioInternal* const intern = (CoreAudioInternal*) inClientData; + + switch (inPropertyID) + { + case kAudioHardwarePropertyDevices: + intern->deviceDetailsChanged(); + break; + + case kAudioHardwarePropertyDefaultOutputDevice: + case kAudioHardwarePropertyDefaultInputDevice: + case kAudioHardwarePropertyDefaultSystemOutputDevice: + break; + } + + return noErr; + } + + CoreAudioIODevice (const CoreAudioIODevice&); + const CoreAudioIODevice& operator= (const CoreAudioIODevice&); +}; + + +//============================================================================== +class CoreAudioIODeviceType : public AudioIODeviceType +{ +public: + //============================================================================== + CoreAudioIODeviceType() + : AudioIODeviceType (T("CoreAudio")), + hasScanned (false) + { + } + + ~CoreAudioIODeviceType() + { + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + names.clear(); + ids.clear(); + + UInt32 size; + if (OK (AudioHardwareGetPropertyInfo (kAudioHardwarePropertyDevices, &size, 0))) + { + AudioDeviceID* const devs = (AudioDeviceID*) juce_calloc (size); + + if (OK (AudioHardwareGetProperty (kAudioHardwarePropertyDevices, &size, devs))) + { + static bool alreadyLogged = false; + const int num = size / sizeof (AudioDeviceID); + for (int i = 0; i < num; ++i) + { + char name[1024]; + size = sizeof (name); + if (OK (AudioDeviceGetProperty (devs[i], 0, false, kAudioDevicePropertyDeviceName, &size, name))) + { + const String nameString (String::fromUTF8 ((const uint8*) name, strlen (name))); + + if (! alreadyLogged) + log (T("CoreAudio device: ") + nameString); + + names.add (nameString); + ids.add (devs[i]); + } + } + + alreadyLogged = true; + } + + juce_free (devs); + } + } + + const StringArray getDeviceNames (const bool /*preferInputNames*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + StringArray namesCopy (names); + namesCopy.removeDuplicates (true); + + return namesCopy; + } + + const String getDefaultDeviceName (const bool preferInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + String result (names[0]); + + AudioDeviceID deviceID; + UInt32 size = sizeof (deviceID); + + if (AudioHardwareGetProperty (preferInputNames ? kAudioHardwarePropertyDefaultInputDevice + : kAudioHardwarePropertyDefaultOutputDevice, + &size, &deviceID) == noErr) + { + for (int i = ids.size(); --i >= 0;) + if (ids[i] == deviceID) + result = names[i]; + } + + return result; + } + + AudioIODevice* createDevice (const String& deviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int index = names.indexOf (deviceName); + + if (index >= 0) + return new CoreAudioIODevice (deviceName, ids [index]); + + return 0; + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + StringArray names; + Array ids; + + bool hasScanned; + + CoreAudioIODeviceType (const CoreAudioIODeviceType&); + const CoreAudioIODeviceType& operator= (const CoreAudioIODeviceType&); +}; + +//============================================================================== +AudioIODeviceType* juce_createDefaultAudioIODeviceType() +{ + return new CoreAudioIODeviceType(); +} + + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp b/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp new file mode 100644 index 0000000000..36b7482f91 --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp @@ -0,0 +1,594 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_MidiOutput.h" +#include "../../../src/juce_appframework/audio/devices/juce_MidiInput.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/containers/juce_MemoryBlock.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_core/threads/juce_ScopedLock.h" + +//============================================================================== +#define log(a) Logger::writeToLog(a) + +static bool logAnyErrors (const OSStatus err, const int lineNum) +{ + if (err == noErr) + return true; + + log (T("CoreMidi error: ") + String (lineNum) + T(" - ") + String::toHexString ((int)err)); + jassertfalse + return false; +} + +#define OK(a) logAnyErrors(a, __LINE__) + + +//============================================================================== +static const String getEndpointName (MIDIEndpointRef endpoint, bool isExternal) +{ + String result; + CFStringRef str = 0; + + MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &str); + + if (str != 0) + { + result = PlatformUtilities::cfStringToJuceString (str); + CFRelease (str); + str = 0; + } + + MIDIEntityRef entity = 0; + MIDIEndpointGetEntity (endpoint, &entity); + + if (entity == 0) + return result; // probably virtual + + if (result.isEmpty()) + { + // endpoint name has zero length - try the entity + MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str); + + if (str != 0) + { + result += PlatformUtilities::cfStringToJuceString (str); + CFRelease (str); + str = 0; + } + } + + // now consider the device's name + MIDIDeviceRef device = 0; + MIDIEntityGetDevice (entity, &device); + if (device == 0) + return result; + + MIDIObjectGetStringProperty (device, kMIDIPropertyName, &str); + + if (str != 0) + { + const String s (PlatformUtilities::cfStringToJuceString (str)); + CFRelease (str); + + // if an external device has only one entity, throw away + // the endpoint name and just use the device name + if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2) + { + result = s; + } + else if (! result.startsWithIgnoreCase (s)) + { + // prepend the device name to the entity name + result = (s + T(" ") + result).trimEnd(); + } + } + + return result; +} + +static const String getConnectedEndpointName (MIDIEndpointRef endpoint) +{ + String result; + + // Does the endpoint have connections? + CFDataRef connections = 0; + int numConnections = 0; + + MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections); + + if (connections != 0) + { + numConnections = CFDataGetLength (connections) / sizeof (MIDIUniqueID); + + if (numConnections > 0) + { + const SInt32* pid = reinterpret_cast (CFDataGetBytePtr (connections)); + + for (int i = 0; i < numConnections; ++i, ++pid) + { + MIDIUniqueID id = EndianS32_BtoN (*pid); + MIDIObjectRef connObject; + MIDIObjectType connObjectType; + OSStatus err = MIDIObjectFindByUniqueID (id, &connObject, &connObjectType); + + if (err == noErr) + { + String s; + + if (connObjectType == kMIDIObjectType_ExternalSource + || connObjectType == kMIDIObjectType_ExternalDestination) + { + // Connected to an external device's endpoint (10.3 and later). + s = getEndpointName (static_cast (connObject), true); + } + else + { + // Connected to an external device (10.2) (or something else, catch-all) + CFStringRef str = 0; + MIDIObjectGetStringProperty (connObject, kMIDIPropertyName, &str); + + if (str != 0) + { + s = PlatformUtilities::cfStringToJuceString (str); + CFRelease (str); + } + } + + if (s.isNotEmpty()) + { + if (result.isNotEmpty()) + result += (", "); + + result += s; + } + } + } + } + + CFRelease (connections); + } + + if (result.isNotEmpty()) + return result; + + // Here, either the endpoint had no connections, or we failed to obtain names for any of them. + return getEndpointName (endpoint, false); +} + +//============================================================================== +const StringArray MidiOutput::getDevices() +{ + StringArray s; + + const ItemCount num = MIDIGetNumberOfDestinations(); + for (ItemCount i = 0; i < num; ++i) + { + MIDIEndpointRef dest = MIDIGetDestination (i); + + if (dest != 0) + { + String name (getConnectedEndpointName (dest)); + + if (name.isEmpty()) + name = T(""); + + s.add (name); + } + else + { + s.add (T("")); + } + } + + return s; +} + +int MidiOutput::getDefaultDeviceIndex() +{ + return 0; +} + +static MIDIClientRef globalMidiClient; +static bool hasGlobalClientBeenCreated = false; + +static bool makeSureClientExists() +{ + if (! hasGlobalClientBeenCreated) + { + String name (T("JUCE")); + + if (JUCEApplication::getInstance() != 0) + name = JUCEApplication::getInstance()->getApplicationName(); + + CFStringRef appName = PlatformUtilities::juceStringToCFString (name); + + hasGlobalClientBeenCreated = OK (MIDIClientCreate (appName, 0, 0, &globalMidiClient)); + CFRelease (appName); + } + + return hasGlobalClientBeenCreated; +} + +struct MidiPortAndEndpoint +{ + MIDIPortRef port; + MIDIEndpointRef endPoint; +}; + +MidiOutput* MidiOutput::openDevice (int index) +{ + MidiOutput* mo = 0; + + if (index >= 0 && index < (int) MIDIGetNumberOfDestinations()) + { + MIDIEndpointRef endPoint = MIDIGetDestination (index); + + CFStringRef pname; + if (OK (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname))) + { + log (T("CoreMidi - opening out: ") + PlatformUtilities::cfStringToJuceString (pname)); + + if (makeSureClientExists()) + { + MIDIPortRef port; + + if (OK (MIDIOutputPortCreate (globalMidiClient, pname, &port))) + { + MidiPortAndEndpoint* mpe = new MidiPortAndEndpoint(); + mpe->port = port; + mpe->endPoint = endPoint; + + mo = new MidiOutput(); + mo->internal = (void*)mpe; + } + } + + CFRelease (pname); + } + } + + return mo; +} + +MidiOutput::MidiOutput() +{ +} + +MidiOutput::~MidiOutput() +{ + MidiPortAndEndpoint* const mpe = (MidiPortAndEndpoint*)internal; + MIDIPortDispose (mpe->port); + delete mpe; +} + +void MidiOutput::reset() +{ +} + +bool MidiOutput::getVolume (float& leftVol, float& rightVol) +{ + return false; +} + +void MidiOutput::setVolume (float leftVol, float rightVol) +{ +} + +void MidiOutput::sendMessageNow (const MidiMessage& message) +{ + MidiPortAndEndpoint* const mpe = (MidiPortAndEndpoint*)internal; + + if (message.isSysEx()) + { + MIDIPacketList* const packets = (MIDIPacketList*) juce_malloc (32 + message.getRawDataSize()); + packets->numPackets = 1; + packets->packet[0].timeStamp = 0; + packets->packet[0].length = message.getRawDataSize(); + memcpy (packets->packet[0].data, message.getRawData(), message.getRawDataSize()); + + MIDISend (mpe->port, mpe->endPoint, packets); + juce_free (packets); + } + else + { + MIDIPacketList packets; + packets.numPackets = 1; + packets.packet[0].timeStamp = 0; + packets.packet[0].length = message.getRawDataSize(); + *(int*) (packets.packet[0].data) = *(const int*) message.getRawData(); + + MIDISend (mpe->port, mpe->endPoint, &packets); + } +} + +//============================================================================== +const StringArray MidiInput::getDevices() +{ + StringArray s; + + const ItemCount num = MIDIGetNumberOfSources(); + for (ItemCount i = 0; i < num; ++i) + { + MIDIEndpointRef source = MIDIGetSource (i); + + if (source != 0) + { + String name (getConnectedEndpointName (source)); + + if (name.isEmpty()) + name = T(""); + + s.add (name); + } + else + { + s.add (T("")); + } + } + + return s; +} + +int MidiInput::getDefaultDeviceIndex() +{ + return 0; +} + +//============================================================================== +struct MidiPortAndCallback +{ + MidiInput* input; + MIDIPortRef port; + MIDIEndpointRef endPoint; + MidiInputCallback* callback; + MemoryBlock pendingData; + int pendingBytes; + double pendingDataTime; + bool active; +}; + +static CriticalSection callbackLock; +static VoidArray activeCallbacks; + +static void processSysex (MidiPortAndCallback* const mpe, const uint8*& d, int& size, const double time) +{ + if (*d == 0xf0) + { + mpe->pendingBytes = 0; + mpe->pendingDataTime = time; + } + + mpe->pendingData.ensureSize (mpe->pendingBytes + size, false); + uint8* totalMessage = (uint8*) mpe->pendingData.getData(); + + uint8* dest = totalMessage + mpe->pendingBytes; + + while (size > 0) + { + if (mpe->pendingBytes > 0 && *d >= 0x80) + { + if (*d >= 0xfa || *d == 0xf8) + { + mpe->callback->handleIncomingMidiMessage (mpe->input, MidiMessage (*d, time)); + ++d; + --size; + } + else + { + if (*d == 0xf7) + { + *dest++ = *d++; + mpe->pendingBytes++; + --size; + } + + break; + } + } + else + { + *dest++ = *d++; + mpe->pendingBytes++; + --size; + } + } + + if (totalMessage [mpe->pendingBytes - 1] == 0xf7) + { + mpe->callback->handleIncomingMidiMessage (mpe->input, MidiMessage (totalMessage, + mpe->pendingBytes, + mpe->pendingDataTime)); + mpe->pendingBytes = 0; + } + else + { + mpe->callback->handlePartialSysexMessage (mpe->input, + totalMessage, + mpe->pendingBytes, + mpe->pendingDataTime); + } +} + +static void midiInputProc (const MIDIPacketList* pktlist, + void* readProcRefCon, + void* srcConnRefCon) +{ + double time = Time::getMillisecondCounterHiRes() * 0.001; + const double originalTime = time; + + MidiPortAndCallback* const mpe = (MidiPortAndCallback*) readProcRefCon; + const ScopedLock sl (callbackLock); + + if (activeCallbacks.contains (mpe) && mpe->active) + { + const MIDIPacket* packet = &pktlist->packet[0]; + + for (unsigned int i = 0; i < pktlist->numPackets; ++i) + { + const uint8* d = (const uint8*) (packet->data); + int size = packet->length; + + while (size > 0) + { + time = originalTime; + + if (mpe->pendingBytes > 0 || d[0] == 0xf0) + { + processSysex (mpe, d, size, time); + } + else + { + int used = 0; + const MidiMessage m (d, size, used, 0, time); + + if (used <= 0) + { + jassertfalse // malformed midi message + break; + } + else + { + mpe->callback->handleIncomingMidiMessage (mpe->input, m); + } + + size -= used; + d += used; + } + } + + packet = MIDIPacketNext (packet); + } + } +} + +MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) +{ + MidiInput* mi = 0; + + if (index >= 0 && index < (int) MIDIGetNumberOfSources()) + { + MIDIEndpointRef endPoint = MIDIGetSource (index); + + if (endPoint != 0) + { + CFStringRef pname; + + if (OK (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname))) + { + log (T("CoreMidi - opening inp: ") + PlatformUtilities::cfStringToJuceString (pname)); + + if (makeSureClientExists()) + { + MIDIPortRef port; + + MidiPortAndCallback* const mpe = new MidiPortAndCallback(); + mpe->active = false; + + if (OK (MIDIInputPortCreate (globalMidiClient, pname, midiInputProc, mpe, &port))) + { + if (OK (MIDIPortConnectSource (port, endPoint, 0))) + { + mpe->port = port; + mpe->endPoint = endPoint; + mpe->callback = callback; + mpe->pendingBytes = 0; + mpe->pendingData.ensureSize (128); + + mi = new MidiInput (getDevices() [index]); + mpe->input = mi; + mi->internal = (void*) mpe; + + const ScopedLock sl (callbackLock); + activeCallbacks.add (mpe); + } + else + { + OK (MIDIPortDispose (port)); + delete mpe; + } + } + else + { + delete mpe; + } + } + } + + CFRelease (pname); + } + } + + return mi; +} + +MidiInput::MidiInput (const String& name_) + : name (name_) +{ +} + +MidiInput::~MidiInput() +{ + MidiPortAndCallback* const mpe = (MidiPortAndCallback*) internal; + mpe->active = false; + + callbackLock.enter(); + activeCallbacks.removeValue (mpe); + callbackLock.exit(); + + OK (MIDIPortDisconnectSource (mpe->port, mpe->endPoint)); + OK (MIDIPortDispose (mpe->port)); + delete mpe; + + activeCallbacks.minimiseStorageOverheads(); +} + +void MidiInput::start() +{ + MidiPortAndCallback* const mpe = (MidiPortAndCallback*) internal; + const ScopedLock sl (callbackLock); + mpe->active = true; +} + +void MidiInput::stop() +{ + MidiPortAndCallback* const mpe = (MidiPortAndCallback*) internal; + const ScopedLock sl (callbackLock); + mpe->active = false; +} + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_FileChooser.cpp b/build/macosx/platform_specific_code/juce_mac_FileChooser.cpp new file mode 100644 index 0000000000..7f1faedc0d --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_FileChooser.cpp @@ -0,0 +1,299 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include +#include + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + + +#include "../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.h" +#include "../../../src/juce_appframework/gui/components/juce_Desktop.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_core/text/juce_LocalisedStrings.h" + + +//============================================================================== +struct JuceNavInfo +{ + StringArray filters; + AEDesc defaultLocation; + bool defaultLocationValid; +}; + +static void pascal juceNavEventProc (NavEventCallbackMessage callbackSelector, + NavCBRecPtr callbackParms, + void *callBackUD) +{ + if (callbackSelector == kNavCBStart) + { + if (((JuceNavInfo*) callBackUD)->defaultLocationValid) + { + NavCustomControl (callbackParms->context, + kNavCtlSetLocation, + (void*) &((JuceNavInfo*) callBackUD)->defaultLocation); + } + + for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) + { + Component* const c = Desktop::getInstance().getComponent (i); + + if (c != 0 && c->isAlwaysOnTop() && c->isVisible()) + { + SetWindowGroup (callbackParms->window, + GetWindowGroup ((WindowRef) c->getWindowHandle())); + + break; + } + } + + BringToFront (callbackParms->window); + SelectWindow (callbackParms->window); + SetUserFocusWindow (callbackParms->window); + } +} + +static Boolean pascal juceNavFilterProc (AEDesc* theItem, + void*, + void* callBackUD, + NavFilterModes filterMode) +{ + // must return true if we don't understand the object + bool result = true; + + if (filterMode == kNavFilteringBrowserList) + { + AEDesc desc; + if (AECoerceDesc (theItem, typeFSRef, &desc) == noErr) + { + Size size = AEGetDescDataSize (&desc); + + if (size > 0) + { + void* data = juce_calloc (size); + + if (AEGetDescData (&desc, data, size) == noErr) + { + const String path (PlatformUtilities::makePathFromFSRef ((FSRef*) data)); + + if (path.isNotEmpty()) + { + const File file (path); + + if ((! file.isDirectory()) || PlatformUtilities::isBundle (path)) + { + const String filename (file.getFileName().toLowerCase()); + const char* const filenameUTF8 = filename.toUTF8(); + + const JuceNavInfo* const info = (const JuceNavInfo*) callBackUD; + + if (info != 0) + { + result = false; + + for (int i = info->filters.size(); --i >= 0;) + { + const String wildcard (info->filters[i].toLowerCase()); + + if (fnmatch (wildcard.toUTF8(), filenameUTF8, 0) == 0) + { + result = true; + break; + } + } + } + } + } + } + + juce_free (data); + } + + AEDisposeDesc (&desc); + } + } + + return result; +} + +void FileChooser::showPlatformDialog (OwnedArray& results, + const String& title, + const File& currentFileOrDirectory, + const String& filter, + bool selectsDirectory, + bool isSaveDialogue, + bool warnAboutOverwritingExistingFiles, + bool selectMultipleFiles, + FilePreviewComponent* extraInfoComponent) +{ + JuceNavInfo userInfo; + userInfo.filters.addTokens (filter.replaceCharacters (T(",:"), T(";;")), T(";"), 0); + userInfo.filters.trim(); + userInfo.filters.removeEmptyStrings(); + userInfo.defaultLocationValid = false; + void* const userInfoPtr = (void*) &userInfo; + + const int oldTimeBeforeWaitCursor = MessageManager::getInstance()->getTimeBeforeShowingWaitCursor(); + MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (0); + + NavEventUPP eventProc = NewNavEventUPP (juceNavEventProc); + NavObjectFilterUPP filterProc = NewNavObjectFilterUPP (juceNavFilterProc); + + FSRef defaultRef; + + if ((currentFileOrDirectory.isOnHardDisk() + && PlatformUtilities::makeFSRefFromPath (&defaultRef, + currentFileOrDirectory.getFullPathName())) + || (currentFileOrDirectory.getParentDirectory().isOnHardDisk() + && PlatformUtilities::makeFSRefFromPath (&defaultRef, + currentFileOrDirectory.getParentDirectory().getFullPathName()))) + { + if (AECreateDesc (typeFSRef, &defaultRef, sizeof (defaultRef), &userInfo.defaultLocation) == noErr) + { + userInfo.defaultLocationValid = true; + } + } + + WindowRef lastFocused = GetUserFocusWindow(); + NavDialogCreationOptions options; + + if (NavGetDefaultDialogCreationOptions (&options) == noErr) + { + options.optionFlags |= kNavSelectDefaultLocation + | kNavSupportPackages + | kNavAllowPreviews; + + if (! warnAboutOverwritingExistingFiles) + options.optionFlags |= kNavDontConfirmReplacement; + + if (selectMultipleFiles) + options.optionFlags |= kNavAllowMultipleFiles; + + const String name (selectsDirectory ? TRANS("Choose folder") + : TRANS("Choose file")); + + options.clientName = PlatformUtilities::juceStringToCFString (name); + CFStringRef message = PlatformUtilities::juceStringToCFString (title); + + // nasty layout bug if the message text is set for a directory browser.. + if (selectsDirectory) + options.windowTitle = message; + else + options.message = message; + + NavDialogRef dialog = 0; + bool ok = false; + + if (selectsDirectory) + { + ok = (NavCreateChooseFolderDialog (&options, eventProc, 0, userInfoPtr, &dialog) == noErr); + } + else if (isSaveDialogue) + { + ok = (NavCreatePutFileDialog (&options, 0, 0, eventProc, userInfoPtr, &dialog) == noErr); + } + else + { + ok = (NavCreateGetFileDialog (&options, 0, eventProc, 0, filterProc, userInfoPtr, &dialog) == noErr); + } + + if (ok && (NavDialogRun (dialog) == noErr)) + { + NavReplyRecord reply; + if (NavDialogGetReply (dialog, &reply) == noErr) + { + if (reply.validRecord) + { + long count; + if (AECountItems (&(reply.selection), &count) == noErr + && count > 0) + { + AEKeyword theKeyword; + DescType actualType; + Size actualSize; + FSRef file; + + for (int i = 1; i <= count; ++i) + { + // Get a pointer to selected file + if (AEGetNthPtr (&(reply.selection), + i, + typeFSRef, + &theKeyword, + &actualType, + &file, + sizeof (file), + &actualSize) == noErr) + { + String result (PlatformUtilities::makePathFromFSRef (&file)); + + if (result.isNotEmpty() && isSaveDialogue && ! selectsDirectory) + { + CFStringRef saveName = NavDialogGetSaveFileName (dialog); + + result = File (result) + .getChildFile (PlatformUtilities::convertToPrecomposedUnicode (PlatformUtilities::cfStringToJuceString (saveName))) + .getFullPathName(); + } + + results.add (new File (result)); + } + } + } + } + + NavDisposeReply (&reply); + } + } + + if (dialog != 0) + NavDialogDispose (dialog); + + CFRelease (message); + CFRelease (options.clientName); + } + + if (userInfo.defaultLocationValid) + AEDisposeDesc (&userInfo.defaultLocation); + + DisposeNavEventUPP (eventProc); + DisposeNavObjectFilterUPP (filterProc); + + MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (oldTimeBeforeWaitCursor); + + SetUserFocusWindow (lastFocused); +} + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_Files.cpp b/build/macosx/platform_specific_code/juce_mac_Files.cpp new file mode 100644 index 0000000000..b4f1d34acd --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_Files.cpp @@ -0,0 +1,977 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +BEGIN_JUCE_NAMESPACE + + +#include "../../../src/juce_core/io/files/juce_FileInputStream.h" +#include "../../../src/juce_core/io/files/juce_FileOutputStream.h" +#include "../../../src/juce_core/io/network/juce_URL.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_core/io/files/juce_NamedPipe.h" + + +//============================================================================== +const tchar File::separator = T('/'); +const tchar* File::separatorString = T("/"); + +static File executableFile; + + +//============================================================================== +void PlatformUtilities::copyToStr255 (Str255& d, const String& s) +{ + unsigned char* t = (unsigned char*) d; + t[0] = jmin (254, s.length()); + s.copyToBuffer ((char*) t + 1, 254); +} + +void PlatformUtilities::copyToStr63 (Str63& d, const String& s) +{ + unsigned char* t = (unsigned char*) d; + t[0] = jmin (62, s.length()); + s.copyToBuffer ((char*) t + 1, 62); +} + +const String PlatformUtilities::cfStringToJuceString (CFStringRef cfString) +{ + String result; + + if (cfString != 0) + { +#if JUCE_STRINGS_ARE_UNICODE + CFRange range = { 0, CFStringGetLength (cfString) }; + UniChar* const u = (UniChar*) juce_malloc (sizeof (UniChar) * (range.length + 1)); + + CFStringGetCharacters (cfString, range, u); + u[range.length] = 0; + + result = convertUTF16ToString (u); + + juce_free (u); +#else + const int len = CFStringGetLength (cfString); + char* buffer = (char*) juce_malloc (len + 1); + CFStringGetCString (cfString, buffer, len + 1, CFStringGetSystemEncoding()); + result = buffer; + juce_free (buffer); +#endif + } + + return result; +} + +CFStringRef PlatformUtilities::juceStringToCFString (const String& s) +{ +#if JUCE_STRINGS_ARE_UNICODE + const int len = s.length(); + const juce_wchar* t = (const juce_wchar*) s; + + UniChar* temp = (UniChar*) juce_malloc (sizeof (UniChar) * len + 4); + + for (int i = 0; i <= len; ++i) + temp[i] = t[i]; + + CFStringRef result = CFStringCreateWithCharacters (kCFAllocatorDefault, temp, len); + juce_free (temp); + + return result; + +#else + return CFStringCreateWithCString (kCFAllocatorDefault, + (const char*) s, + CFStringGetSystemEncoding()); +#endif +} + +const String PlatformUtilities::convertUTF16ToString (const UniChar* utf16) +{ + String s; + + while (*utf16 != 0) + s += (juce_wchar) *utf16++; + + return s; +} + +const String PlatformUtilities::convertToPrecomposedUnicode (const String& s) +{ + UnicodeMapping map; + + map.unicodeEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, + kUnicodeNoSubset, + kTextEncodingDefaultFormat); + + map.otherEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, + kUnicodeCanonicalCompVariant, + kTextEncodingDefaultFormat); + + map.mappingVersion = kUnicodeUseLatestMapping; + + UnicodeToTextInfo conversionInfo = 0; + String result; + + if (CreateUnicodeToTextInfo (&map, &conversionInfo) == noErr) + { + const int len = s.length(); + + UniChar* const tempIn = (UniChar*) juce_calloc (sizeof (UniChar) * len + 4); + UniChar* const tempOut = (UniChar*) juce_calloc (sizeof (UniChar) * len + 4); + + for (int i = 0; i <= len; ++i) + tempIn[i] = s[i]; + + ByteCount bytesRead = 0; + ByteCount outputBufferSize = 0; + + if (ConvertFromUnicodeToText (conversionInfo, + len * sizeof (UniChar), tempIn, + kUnicodeDefaultDirectionMask, + 0, 0, 0, 0, + len * sizeof (UniChar), &bytesRead, + &outputBufferSize, tempOut) == noErr) + { + result.preallocateStorage (bytesRead / sizeof (UniChar) + 2); + + tchar* t = const_cast ((const tchar*) result); + + int i; + for (i = 0; i < bytesRead / sizeof (UniChar); ++i) + t[i] = (tchar) tempOut[i]; + + t[i] = 0; + } + + juce_free (tempIn); + juce_free (tempOut); + + DisposeUnicodeToTextInfo (&conversionInfo); + } + + return result; +} + +//============================================================================== +static bool juce_stat (const String& fileName, struct stat& info) +{ + return fileName.isNotEmpty() + && (stat (fileName.toUTF8(), &info) == 0); +} + +//============================================================================== +bool juce_isDirectory (const String& fileName) +{ + if (fileName.isEmpty()) + return true; + + struct stat info; + + return juce_stat (fileName, info) + && ((info.st_mode & S_IFDIR) != 0); +} + +bool juce_fileExists (const String& fileName, const bool dontCountDirectories) +{ + if (fileName.isEmpty()) + return false; + + const char* const fileNameUTF8 = fileName.toUTF8(); + bool exists = access (fileNameUTF8, F_OK) == 0; + + if (exists && dontCountDirectories) + { + struct stat info; + const int res = stat (fileNameUTF8, &info); + + if (res == 0 && (info.st_mode & S_IFDIR) != 0) + exists = false; + } + + return exists; +} + +int64 juce_getFileSize (const String& fileName) +{ + struct stat info; + + if (juce_stat (fileName, info)) + return info.st_size; + + return 0; +} + +const unsigned int macTimeToUnixTimeDiff = 0x7c25be90; + +static uint64 utcDateTimeToUnixTime (const UTCDateTime& d) +{ + if (d.highSeconds == 0 && d.lowSeconds == 0 && d.fraction == 0) + return 0; + + return (((((uint64) d.highSeconds) << 32) | (uint64) d.lowSeconds) * 1000) + + ((d.fraction * 1000) >> 16) + - 2082844800000ll; +} + +static void unixTimeToUtcDateTime (uint64 t, UTCDateTime& d) +{ + if (t != 0) + t += 2082844800000ll; + + d.highSeconds = (t / 1000) >> 32; + d.lowSeconds = (t / 1000) & (uint64) 0xffffffff; + d.fraction = ((t % 1000) << 16) / 1000; +} + +void juce_getFileTimes (const String& fileName, + int64& modificationTime, + int64& accessTime, + int64& creationTime) +{ + modificationTime = 0; + accessTime = 0; + creationTime = 0; + + FSRef fileRef; + if (PlatformUtilities::makeFSRefFromPath (&fileRef, fileName)) + { + FSRefParam info; + zerostruct (info); + + info.ref = &fileRef; + info.whichInfo = kFSCatInfoAllDates; + + FSCatalogInfo catInfo; + info.catInfo = &catInfo; + + if (PBGetCatalogInfoSync (&info) == noErr) + { + creationTime = utcDateTimeToUnixTime (catInfo.createDate); + accessTime = utcDateTimeToUnixTime (catInfo.accessDate); + modificationTime = utcDateTimeToUnixTime (catInfo.contentModDate); + } + } +} + +bool juce_setFileTimes (const String& fileName, + int64 modificationTime, + int64 accessTime, + int64 creationTime) +{ + FSRef fileRef; + if (PlatformUtilities::makeFSRefFromPath (&fileRef, fileName)) + { + FSRefParam info; + zerostruct (info); + + info.ref = &fileRef; + info.whichInfo = kFSCatInfoAllDates; + + FSCatalogInfo catInfo; + info.catInfo = &catInfo; + + if (PBGetCatalogInfoSync (&info) == noErr) + { + if (creationTime != 0) + unixTimeToUtcDateTime (creationTime, catInfo.createDate); + + if (modificationTime != 0) + unixTimeToUtcDateTime (modificationTime, catInfo.contentModDate); + + if (accessTime != 0) + unixTimeToUtcDateTime (accessTime, catInfo.accessDate); + + return PBSetCatalogInfoSync (&info) == noErr; + } + } + + return false; +} + +bool juce_canWriteToFile (const String& fileName) +{ + return access (fileName.toUTF8(), W_OK) == 0; +} + +bool juce_setFileReadOnly (const String& fileName, bool isReadOnly) +{ + const char* const fileNameUTF8 = fileName.toUTF8(); + + struct stat info; + const int res = stat (fileNameUTF8, &info); + + bool ok = false; + + if (res == 0) + { + info.st_mode &= 0777; // Just permissions + + if (isReadOnly) + info.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); + else + // Give everybody write permission? + info.st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; + + ok = chmod (fileNameUTF8, info.st_mode) == 0; + } + + return ok; +} + +bool juce_deleteFile (const String& fileName) +{ + const char* const fileNameUTF8 = fileName.toUTF8(); + + if (juce_isDirectory (fileName)) + return rmdir (fileNameUTF8) == 0; + else + return remove (fileNameUTF8) == 0; +} + +bool juce_copyFile (const String& src, const String& dst) +{ + const File destFile (dst); + + if (! destFile.create()) + return false; + + FSRef srcRef, dstRef; + + if (! (PlatformUtilities::makeFSRefFromPath (&srcRef, src) + && PlatformUtilities::makeFSRefFromPath (&dstRef, dst))) + { + return false; + } + + int okForks = 0; + + CatPositionRec iter; + iter.initialize = 0; + HFSUniStr255 forkName; + + // can't just copy the data because this is a bloody Mac, so we need to copy each + // fork separately... + while (FSIterateForks (&srcRef, &iter, &forkName, 0, 0) == noErr) + { + SInt16 srcForkNum = 0, dstForkNum = 0; + OSErr err = FSOpenFork (&srcRef, forkName.length, forkName.unicode, fsRdPerm, &srcForkNum); + + if (err == noErr) + { + err = FSOpenFork (&dstRef, forkName.length, forkName.unicode, fsRdWrPerm, &dstForkNum); + + if (err == noErr) + { + MemoryBlock buf (32768); + SInt64 pos = 0; + + for (;;) + { + ByteCount bytesRead = 0; + err = FSReadFork (srcForkNum, fsFromStart, pos, buf.getSize(), (char*) buf, &bytesRead); + + if (bytesRead > 0) + { + err = FSWriteFork (dstForkNum, fsFromStart, pos, bytesRead, (const char*) buf, &bytesRead); + pos += bytesRead; + } + + if (err != noErr) + { + if (err == eofErr) + ++okForks; + + break; + } + } + + FSFlushFork (dstForkNum); + FSCloseFork (dstForkNum); + } + + FSCloseFork (srcForkNum); + } + } + + if (okForks > 0) // some files seem to be ok even if not all their forks get copied.. + { + // copy permissions.. + struct stat info; + if (juce_stat (src, info)) + chmod (dst.toUTF8(), info.st_mode & 0777); + + return true; + } + + return false; +} + +bool juce_moveFile (const String& source, const String& dest) +{ + if (rename (source.toUTF8(), dest.toUTF8()) == 0) + return true; + + if (juce_canWriteToFile (source) + && juce_copyFile (source, dest)) + { + if (juce_deleteFile (source)) + return true; + + juce_deleteFile (dest); + } + + return false; +} + +void juce_createDirectory (const String& fileName) +{ + mkdir (fileName.toUTF8(), 0777); +} + +void* juce_fileOpen (const String& fileName, bool forWriting) +{ + const char* const fileNameUTF8 = fileName.toUTF8(); + const char* mode = "rb"; + + if (forWriting) + { + if (juce_fileExists (fileName, false)) + { + FILE* const f = fopen (fileNameUTF8, "r+b"); + + if (f != 0) + fseek (f, 0, SEEK_END); + + return (void*) f; + } + else + { + mode = "w+b"; + } + } + + return (void*) fopen (fileNameUTF8, mode); +} + +void juce_fileClose (void* handle) +{ + if (handle != 0) + fclose ((FILE*) handle); +} + +int juce_fileRead (void* handle, void* buffer, int size) +{ + if (handle != 0) + return fread (buffer, 1, size, (FILE*) handle); + + return 0; +} + +int juce_fileWrite (void* handle, const void* buffer, int size) +{ + if (handle != 0) + return fwrite (buffer, 1, size, (FILE*) handle); + + return 0; +} + +int64 juce_fileSetPosition (void* handle, int64 pos) +{ + if (handle != 0 && fseek ((FILE*) handle, pos, SEEK_SET) == 0) + return pos; + + return -1; +} + +int64 juce_fileGetPosition (void* handle) +{ + if (handle != 0) + return ftell ((FILE*) handle); + else + return -1; +} + +void juce_fileFlush (void* handle) +{ + if (handle != 0) + fflush ((FILE*) handle); +} + +const StringArray juce_getFileSystemRoots() +{ + StringArray s; + s.add (T("/")); + return s; +} + +const String juce_getVolumeLabel (const String& filenameOnVolume, int& volumeSerialNumber) +{ + volumeSerialNumber = 0; + return String::empty; +} + +// if this file doesn't exist, find a parent of it that does.. +static bool doStatFS (const File* file, struct statfs& result) +{ + File f (*file); + + for (int i = 5; --i >= 0;) + { + if (f.exists()) + break; + + f = f.getParentDirectory(); + } + + return statfs (f.getFullPathName().toUTF8(), &result) == 0; +} + +int64 File::getBytesFreeOnVolume() const throw() +{ + int64 free_space = 0; + + struct statfs buf; + if (doStatFS (this, buf)) + // Note: this returns space available to non-super user + free_space = (int64) buf.f_bsize * (int64) buf.f_bavail; + + return free_space; +} + +//============================================================================== +static bool isFileOnDriveType (const File* const f, const char** types) +{ + struct statfs buf; + + if (doStatFS (f, buf)) + { + const String type (buf.f_fstypename); + + while (*types != 0) + if (type.equalsIgnoreCase (*types++)) + return true; + } + + return false; +} + +bool File::isOnCDRomDrive() const throw() +{ + static const char* const cdTypes[] = { "cd9660", "cdfs", "cddafs", "udf", 0 }; + + return isFileOnDriveType (this, (const char**) cdTypes); +} + +bool File::isOnHardDisk() const throw() +{ + static const char* const nonHDTypes[] = { "nfs", "smbfs", "ramfs", 0 }; + + return ! (isOnCDRomDrive() || isFileOnDriveType (this, (const char**) nonHDTypes)); +} + +//============================================================================== +const File File::getSpecialLocation (const SpecialLocationType type) +{ + switch (type) + { + case userHomeDirectory: + { + const char* homeDir = getenv ("HOME"); + + if (homeDir == 0) + { + struct passwd* const pw = getpwuid (getuid()); + if (pw != 0) + homeDir = pw->pw_dir; + } + + return File (PlatformUtilities::convertToPrecomposedUnicode (homeDir)); + } + + case userDocumentsDirectory: + return File (T("~/Documents")); + + case userDesktopDirectory: + return File (T("~/Desktop")); + + case userApplicationDataDirectory: + return File (T("~/Library")); + + case commonApplicationDataDirectory: + return File (T("/Library")); + + case globalApplicationsDirectory: + return File (T("/Applications")); + + case tempDirectory: + { + File tmp (T("~/Library/Caches/") + executableFile.getFileNameWithoutExtension()); + + tmp.createDirectory(); + return tmp.getFullPathName(); + } + + case currentExecutableFile: + return executableFile; + + case currentApplicationFile: + { + const File parent (executableFile.getParentDirectory()); + + return parent.getFullPathName().endsWithIgnoreCase (T("Contents/MacOS")) + ? parent.getParentDirectory().getParentDirectory() + : executableFile; + } + + default: + jassertfalse // unknown type? + break; + } + + return File::nonexistent; +} + +void juce_setCurrentExecutableFileName (const String& filename) +{ + executableFile = File::getCurrentWorkingDirectory() + .getChildFile (PlatformUtilities::convertToPrecomposedUnicode (filename)); +} + +void juce_setCurrentExecutableFileNameFromBundleId (const String& bundleId) +{ + CFStringRef bundleIdStringRef = PlatformUtilities::juceStringToCFString (bundleId); + CFBundleRef bundleRef = CFBundleGetBundleWithIdentifier (bundleIdStringRef); + CFRelease (bundleIdStringRef); + + if (bundleRef != 0) + { + CFURLRef exeURLRef = CFBundleCopyExecutableURL (bundleRef); + + if (exeURLRef != 0) + { + CFStringRef pathStringRef = CFURLCopyFileSystemPath (exeURLRef, kCFURLPOSIXPathStyle); + CFRelease (exeURLRef); + + if (pathStringRef != 0) + { + juce_setCurrentExecutableFileName (PlatformUtilities::cfStringToJuceString (pathStringRef)); + CFRelease (pathStringRef); + } + } + } +} + +//============================================================================== +const File File::getCurrentWorkingDirectory() throw() +{ + char buf [2048]; + getcwd (buf, sizeof(buf)); + + return File (PlatformUtilities::convertToPrecomposedUnicode (buf)); +} + +bool File::setAsCurrentWorkingDirectory() const throw() +{ + return chdir (getFullPathName().toUTF8()) == 0; +} + +//============================================================================== +struct FindFileStruct +{ + String parentDir, wildCard; + DIR* dir; + + bool getNextMatch (String& result, bool* const isDir, bool* const isHidden, int64* const fileSize, + Time* const modTime, Time* const creationTime, bool* const isReadOnly) + { + const char* const wildCardUTF8 = wildCard.toUTF8(); + + for (;;) + { + struct dirent* const de = readdir (dir); + + if (de == 0) + break; + + if (fnmatch (wildCardUTF8, de->d_name, 0) == 0) + { + result = PlatformUtilities::convertToPrecomposedUnicode (String::fromUTF8 ((const uint8*) de->d_name)); + + const String path (parentDir + result); + + if (isDir != 0 || fileSize != 0) + { + struct stat info; + const bool statOk = juce_stat (path, info); + + if (isDir != 0) + *isDir = path.isEmpty() || (statOk && ((info.st_mode & S_IFDIR) != 0)); + + if (isHidden != 0) + *isHidden = (de->d_name[0] == '.'); + + if (fileSize != 0) + *fileSize = statOk ? info.st_size : 0; + } + + if (modTime != 0 || creationTime != 0) + { + int64 m, a, c; + juce_getFileTimes (path, m, a, c); + + if (modTime != 0) + *modTime = m; + + if (creationTime != 0) + *creationTime = c; + } + + if (isReadOnly != 0) + *isReadOnly = ! juce_canWriteToFile (path); + + return true; + } + } + + return false; + } +}; + +// returns 0 on failure +void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile, + bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly) +{ + DIR* const d = opendir (directory.toUTF8()); + + if (d != 0) + { + FindFileStruct* const ff = new FindFileStruct(); + ff->parentDir = directory; + + if (!ff->parentDir.endsWithChar (File::separator)) + ff->parentDir += File::separator; + + ff->wildCard = wildCard; + ff->dir = d; + + if (ff->getNextMatch (firstResultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly)) + { + return ff; + } + else + { + firstResultFile = String::empty; + isDir = false; + closedir (d); + delete ff; + } + } + + return 0; +} + +bool juce_findFileNext (void* handle, String& resultFile, + bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly) +{ + FindFileStruct* const ff = (FindFileStruct*) handle; + + if (ff != 0) + return ff->getNextMatch (resultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); + + return false; +} + +void juce_findFileClose (void* handle) +{ + FindFileStruct* const ff = (FindFileStruct*)handle; + + if (ff != 0) + { + closedir (ff->dir); + delete ff; + } +} + +//============================================================================== +bool juce_launchExecutable (const String& pathAndArguments) +{ + char* const argv[4] = { "/bin/sh", "-c", (char*) (const char*) pathAndArguments, 0 }; + + const int cpid = fork(); + + if (cpid == 0) + { + // Child process + if (execve (argv[0], argv, 0) < 0) + exit (0); + } + else + { + if (cpid < 0) + return false; + } + + return true; +} + +bool juce_launchFile (const String& fileName, + const String& parameters) +{ + bool ok = false; + + if (fileName.startsWithIgnoreCase (T("http:"))) + { + CFStringRef urlString = PlatformUtilities::juceStringToCFString (fileName); + + if (urlString != 0) + { + CFURLRef url = CFURLCreateWithString (kCFAllocatorDefault, + urlString, 0); + CFRelease (urlString); + + if (url != 0) + { + ok = (LSOpenCFURLRef (url, 0) == noErr); + CFRelease (url); + } + } + } + else + { + FSRef ref; + if (PlatformUtilities::makeFSRefFromPath (&ref, fileName)) + { + if (juce_isDirectory (fileName) && parameters.isNotEmpty()) + { + // if we're launching a bundled app with a document.. + StringArray docs; + docs.addTokens (parameters, true); + FSRef* docRefs = new FSRef [docs.size()]; + + for (int i = 0; i < docs.size(); ++i) + PlatformUtilities::makeFSRefFromPath (docRefs + i, docs[i]); + + LSLaunchFSRefSpec ors; + ors.appRef = &ref; + ors.numDocs = docs.size(); + ors.itemRefs = docRefs; + ors.passThruParams = 0; + ors.launchFlags = kLSLaunchDefaults; + ors.asyncRefCon = 0; + + FSRef actual; + ok = (LSOpenFromRefSpec (&ors, &actual) == noErr); + + delete docRefs; + } + else + { + if (parameters.isNotEmpty()) + ok = juce_launchExecutable (T("\"") + fileName + T("\" ") + parameters); + else + ok = (LSOpenFSRef (&ref, 0) == noErr); + } + } + } + + return ok; +} + +//============================================================================== +bool PlatformUtilities::makeFSSpecFromPath (FSSpec* fs, const String& path) +{ + FSRef ref; + + return makeFSRefFromPath (&ref, path) + && FSGetCatalogInfo (&ref, kFSCatInfoNone, 0, 0, fs, 0) == noErr; +} + +bool PlatformUtilities::makeFSRefFromPath (FSRef* destFSRef, const String& path) +{ + return FSPathMakeRef ((const UInt8*) path.toUTF8(), destFSRef, 0) == noErr; +} + +const String PlatformUtilities::makePathFromFSRef (FSRef* file) +{ + uint8 path [2048]; + zeromem (path, sizeof (path)); + + String result; + + if (FSRefMakePath (file, (UInt8*) path, sizeof (path) - 1) == noErr) + result = String::fromUTF8 (path); + + return PlatformUtilities::convertToPrecomposedUnicode (result); +} + +//============================================================================== +OSType PlatformUtilities::getTypeOfFile (const String& filename) +{ + FSRef fs; + if (makeFSRefFromPath (&fs, filename)) + { + LSItemInfoRecord info; + + if (LSCopyItemInfoForRef (&fs, kLSRequestTypeCreator, &info) == noErr) + return info.filetype; + } + + return 0; +} + +bool PlatformUtilities::isBundle (const String& filename) +{ + FSRef fs; + if (makeFSRefFromPath (&fs, filename)) + { + LSItemInfoRecord info; + + if (LSCopyItemInfoForRef (&fs, kLSItemInfoIsPackage, &info) == noErr) + return (info.flags & kLSItemInfoIsPackage) != 0; + } + + return false; +} + + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_Fonts.cpp b/build/macosx/platform_specific_code/juce_mac_Fonts.cpp new file mode 100644 index 0000000000..6ad91754d2 --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_Fonts.cpp @@ -0,0 +1,529 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include + +BEGIN_JUCE_NAMESPACE + + +#include "../../../src/juce_appframework/gui/graphics/fonts/juce_Font.h" +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" +#include "../../../src/juce_core/basics/juce_Singleton.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" + + +//============================================================================== +static OSStatus pascal CubicMoveTo (const Float32Point *pt, + void* callBackDataPtr) +{ + Path* const p = (Path*) callBackDataPtr; + p->startNewSubPath (pt->x, pt->y); + + return noErr; +} + +static OSStatus pascal CubicLineTo (const Float32Point *pt, + void* callBackDataPtr) +{ + Path* const p = (Path*) callBackDataPtr; + p->lineTo (pt->x, pt->y); + + return noErr; +} + +static OSStatus pascal CubicCurveTo (const Float32Point *pt1, + const Float32Point *pt2, + const Float32Point *pt3, + void* callBackDataPtr) +{ + Path* const p = (Path*) callBackDataPtr; + p->cubicTo (pt1->x, pt1->y, + pt2->x, pt2->y, + pt3->x, pt3->y); + + return noErr; +} + +static OSStatus pascal CubicClosePath (void* callBackDataPtr) +{ + Path* const p = (Path*) callBackDataPtr; + p->closeSubPath(); + + return noErr; +} + +//============================================================================== +class ATSFontHelper +{ + ATSUFontID fontId; + ATSUStyle style; + + ATSCubicMoveToUPP moveToProc; + ATSCubicLineToUPP lineToProc; + ATSCubicCurveToUPP curveToProc; + ATSCubicClosePathUPP closePathProc; + + float totalSize, ascent; + + TextToUnicodeInfo encodingInfo; + +public: + String name; + bool isBold, isItalic; + float fontSize; + int refCount; + + ATSFontHelper (const String& name_, + const bool bold_, + const bool italic_, + const float size_) + : fontId (0), + name (name_), + isBold (bold_), + isItalic (italic_), + fontSize (size_), + refCount (1) + { + const char* const nameUtf8 = name_.toUTF8(); + + ATSUFindFontFromName (const_cast (nameUtf8), + strlen (nameUtf8), + kFontFullName, + kFontNoPlatformCode, + kFontNoScriptCode, + kFontNoLanguageCode, + &fontId); + + ATSUCreateStyle (&style); + + ATSUAttributeTag attTypes[] = { kATSUFontTag, + kATSUQDBoldfaceTag, + kATSUQDItalicTag, + kATSUSizeTag }; + + ByteCount attSizes[] = { sizeof (ATSUFontID), + sizeof (Boolean), + sizeof (Boolean), + sizeof (Fixed) }; + + Boolean bold = bold_, italic = italic_; + Fixed size = X2Fix (size_); + + ATSUAttributeValuePtr attValues[] = { &fontId, + &bold, + &italic, + &size }; + + ATSUSetAttributes (style, 4, attTypes, attSizes, attValues); + + moveToProc = NewATSCubicMoveToUPP (CubicMoveTo); + lineToProc = NewATSCubicLineToUPP (CubicLineTo); + curveToProc = NewATSCubicCurveToUPP (CubicCurveTo); + closePathProc = NewATSCubicClosePathUPP (CubicClosePath); + + ascent = 0.0f; + float kern, descent = 0.0f; + getPathAndKerning (T('N'), T('O'), 0, kern, &ascent, &descent); + totalSize = ascent + descent; + } + + ~ATSFontHelper() + { + ATSUDisposeStyle (style); + + DisposeATSCubicMoveToUPP (moveToProc); + DisposeATSCubicLineToUPP (lineToProc); + DisposeATSCubicCurveToUPP (curveToProc); + DisposeATSCubicClosePathUPP (closePathProc); + } + + bool getPathAndKerning (const juce_wchar char1, + const juce_wchar char2, + Path* path, + float& kerning, + float* ascent, + float* descent) + { + bool ok = false; + + UniChar buffer[4]; + buffer[0] = T(' '); + buffer[1] = char1; + buffer[2] = char2; + buffer[3] = 0; + + UniCharCount count = kATSUToTextEnd; + ATSUTextLayout layout; + OSStatus err = ATSUCreateTextLayoutWithTextPtr (buffer, + 0, + 2, + 2, + 1, + &count, + &style, + &layout); + if (err == noErr) + { + ATSUSetTransientFontMatching (layout, true); + + ATSLayoutRecord* layoutRecords; + ItemCount numRecords; + Fixed* deltaYs; + ItemCount numDeltaYs; + + ATSUDirectGetLayoutDataArrayPtrFromTextLayout (layout, + 0, + kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, + (void**) &layoutRecords, + &numRecords); + + ATSUDirectGetLayoutDataArrayPtrFromTextLayout (layout, + 0, + kATSUDirectDataBaselineDeltaFixedArray, + (void**) &deltaYs, + &numDeltaYs); + + if (numRecords > 2) + { + kerning = (float) (Fix2X (layoutRecords[2].realPos) + - Fix2X (layoutRecords[1].realPos)); + + if (ascent != 0) + { + ATSUTextMeasurement asc; + ByteCount actualSize; + + ATSUGetLineControl (layout, + 0, + kATSULineAscentTag, + sizeof (ATSUTextMeasurement), + &asc, + &actualSize); + + *ascent = (float) Fix2X (asc); + } + + if (descent != 0) + { + ATSUTextMeasurement desc; + ByteCount actualSize; + + ATSUGetLineControl (layout, + 0, + kATSULineDescentTag, + sizeof (ATSUTextMeasurement), + &desc, + &actualSize); + + *descent = (float) Fix2X (desc); + } + + if (path != 0) + { + OSStatus callbackResult; + + ok = (ATSUGlyphGetCubicPaths (style, + layoutRecords[1].glyphID, + moveToProc, + lineToProc, + curveToProc, + closePathProc, + (void*) path, + &callbackResult) == noErr); + + if (numDeltaYs > 0 && ok) + { + const float dy = (float) Fix2X (deltaYs[1]); + + path->applyTransform (AffineTransform::translation (0.0f, dy)); + } + } + else + { + ok = true; + } + } + + if (deltaYs != 0) + ATSUDirectReleaseLayoutDataArrayPtr (0, kATSUDirectDataBaselineDeltaFixedArray, + (void**) &deltaYs); + + if (layoutRecords != 0) + ATSUDirectReleaseLayoutDataArrayPtr (0, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, + (void**) &layoutRecords); + + ATSUDisposeTextLayout (layout); + } + + return kerning; + } + + float getAscent() + { + return ascent; + } + + float getTotalHeight() + { + return totalSize; + } + + juce_wchar getDefaultChar() + { + return 0; + } +}; + +//============================================================================== +class ATSFontHelperCache : public Timer, + public DeletedAtShutdown +{ + VoidArray cache; + +public: + ATSFontHelperCache() + { + } + + ~ATSFontHelperCache() + { + for (int i = cache.size(); --i >= 0;) + { + ATSFontHelper* const f = (ATSFontHelper*) cache[i]; + delete f; + } + + clearSingletonInstance(); + } + + ATSFontHelper* getFont (const String& name, + const bool bold, + const bool italic, + const float size = 1024) + { + for (int i = cache.size(); --i >= 0;) + { + ATSFontHelper* const f = (ATSFontHelper*) cache.getUnchecked(i); + + if (f->name == name + && f->isBold == bold + && f->isItalic == italic + && f->fontSize == size) + { + f->refCount++; + return f; + } + } + + ATSFontHelper* const f = new ATSFontHelper (name, bold, italic, size); + cache.add (f); + return f; + } + + void releaseFont (ATSFontHelper* f) + { + for (int i = cache.size(); --i >= 0;) + { + ATSFontHelper* const f2 = (ATSFontHelper*) cache[i]; + + if (f == f2) + { + f->refCount--; + + if (f->refCount == 0) + startTimer (5000); + + break; + } + } + } + + void timerCallback() + { + for (int i = cache.size(); --i >= 0;) + { + ATSFontHelper* const f = (ATSFontHelper*) cache[i]; + + if (f->refCount > 0) + { + stopTimer(); + return; + } + } + + delete this; + } + + juce_DeclareSingleton_SingleThreaded (ATSFontHelperCache, false) +}; + +juce_ImplementSingleton_SingleThreaded (ATSFontHelperCache) + +//============================================================================== +void Typeface::initialiseTypefaceCharacteristics (const String& fontName, + bool bold, + bool italic, + bool addAllGlyphsToFont) +{ + ATSFontHelper* const helper = ATSFontHelperCache::getInstance() + ->getFont (fontName, bold, italic); + + clear(); + setAscent (helper->getAscent() / helper->getTotalHeight()); + setName (fontName); + setDefaultCharacter (helper->getDefaultChar()); + setBold (bold); + setItalic (italic); + + if (addAllGlyphsToFont) + { + //xxx + jassertfalse + } + + ATSFontHelperCache::getInstance()->releaseFont (helper); +} + +void Typeface::findAndAddSystemGlyph (juce_wchar character) +{ + ATSFontHelper* const helper = ATSFontHelperCache::getInstance() + ->getFont (getName(), isBold(), isItalic()); + + Path path; + float width; + + if (helper->getPathAndKerning (character, T('I'), &path, width, 0, 0)) + { + path.applyTransform (AffineTransform::scale (1.0f / helper->getTotalHeight(), + 1.0f / helper->getTotalHeight())); + + addGlyph (character, path, width / helper->getTotalHeight()); + + for (int i = 0; i < glyphs.size(); ++i) + { + const TypefaceGlyphInfo* const g = (const TypefaceGlyphInfo*) glyphs.getUnchecked(i); + + float kerning; + if (helper->getPathAndKerning (character, g->getCharacter(), 0, kerning, 0, 0)) + { + kerning = (kerning - width) / helper->getTotalHeight(); + + if (kerning != 0) + addKerningPair (character, g->getCharacter(), kerning); + } + + if (helper->getPathAndKerning (g->getCharacter(), character, 0, kerning, 0, 0)) + { + kerning = kerning / helper->getTotalHeight() - g->width; + + if (kerning != 0) + addKerningPair (g->getCharacter(), character, kerning); + } + } + } + + ATSFontHelperCache::getInstance()->releaseFont (helper); +} + +const StringArray Font::findAllTypefaceNames() +{ + StringArray names; + ATSFontIterator iter; + + if (ATSFontIteratorCreate (kATSFontContextGlobal, + 0, + 0, + kATSOptionFlagsRestrictedScope, + &iter) == noErr) + { + ATSFontRef font; + + while (ATSFontIteratorNext (iter, &font) == noErr) + { + CFStringRef name; + + if (ATSFontGetName (font, + kATSOptionFlagsDefault, + &name) == noErr) + { + const String nm (PlatformUtilities::cfStringToJuceString (name)); + + if (nm.isNotEmpty()) + names.add (nm); + + CFRelease (name); + } + } + + ATSFontIteratorRelease (&iter); + } + + // Use some totuous logic to eliminate bold/italic versions of fonts that we've already got + // a plain version of. This is only necessary because of Carbon's total lack of support + // for dealing with font families... + for (int j = names.size(); --j >= 0;) + { + const char* const endings[] = { " bold", " italic", " bold italic", " bolditalic", + " oblque", " bold oblique", " boldoblique" }; + + for (int i = 0; i < numElementsInArray (endings); ++i) + { + const String ending (endings[i]); + + if (names[j].endsWithIgnoreCase (ending)) + { + const String root (names[j].dropLastCharacters (ending.length()).trimEnd()); + + if (names.contains (root) + || names.contains (root + T(" plain"), true)) + { + names.remove (j); + break; + } + } + } + } + + names.sort (true); + return names; +} + +void Font::getDefaultFontNames (String& defaultSans, String& defaultSerif, String& defaultFixed) +{ + defaultSans = T("Lucida Grande"); + defaultSerif = T("Times New Roman"); + defaultFixed = T("Monaco"); +} + + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_HTTPStream.h b/build/macosx/platform_specific_code/juce_mac_HTTPStream.h new file mode 100644 index 0000000000..b02ec6abfe --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_HTTPStream.h @@ -0,0 +1,394 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_MAC_HTTPSTREAM_JUCEHEADER__ +#define __JUCE_MAC_HTTPSTREAM_JUCEHEADER__ + +// (This file gets included by the mac + linux networking code) + + +//============================================================================== +/** A HTTP input stream that uses sockets. +*/ +class JUCE_HTTPSocketStream +{ +public: + //============================================================================== + JUCE_HTTPSocketStream() + : statusCode (0), + readPosition (0), + socketHandle (-1), + levelsOfRedirection (0), + timeoutSeconds (15) + { + } + + ~JUCE_HTTPSocketStream() + { + closeSocket(); + } + + //============================================================================== + bool open (const String& url, + const String& optionalPostText, + const bool isPost) + { + closeSocket(); + + String hostName, hostPath; + int hostPort; + + if (! decomposeURL (url, hostName, hostPath, hostPort)) + return false; + + struct hostent* const host + = gethostbyname ((const char*) hostName.toUTF8()); + + if (host == 0) + return false; + + struct sockaddr_in address; + zerostruct (address); + memcpy ((void*) &address.sin_addr, (const void*) host->h_addr, host->h_length); + address.sin_family = host->h_addrtype; + address.sin_port = htons (hostPort); + + socketHandle = socket (host->h_addrtype, SOCK_STREAM, 0); + + if (socketHandle == -1) + return false; + + int receiveBufferSize = 16384; + setsockopt (socketHandle, SOL_SOCKET, SO_RCVBUF, (char*) &receiveBufferSize, sizeof (receiveBufferSize)); + setsockopt (socketHandle, SOL_SOCKET, SO_KEEPALIVE, 0, 0); + + if (connect (socketHandle, (struct sockaddr*) &address, sizeof (address)) == -1) + { + closeSocket(); + return false; + } + + String proxyURL (getenv ("http_proxy")); + + if (! proxyURL.startsWithIgnoreCase (T("http://"))) + proxyURL = String::empty; + + const String requestHeader (createRequestHeader (hostName, hostPath, + proxyURL, url, + hostPort, optionalPostText, + isPost)); + + const char* const utf8Header = (const char*) requestHeader.toUTF8(); + const int headerLen = strlen (utf8Header); + + if (! send (socketHandle, utf8Header, headerLen, 0) == headerLen) + { + closeSocket(); + return false; + } + + const String responseHeader (readResponse()); + + if (responseHeader.isNotEmpty()) + { + //DBG (responseHeader); + + StringArray lines; + lines.addLines (responseHeader); + + statusCode = responseHeader.fromFirstOccurrenceOf (T(" "), false, false) + .substring (4).getIntValue(); + + //int contentLength = findHeaderItem (lines, T("Content-Length:")).getIntValue(); + //bool isChunked = findHeaderItem (lines, T("Transfer-Encoding:")).equalsIgnoreCase ("chunked"); + + String location (findHeaderItem (lines, T("Location:"))); + + if (statusCode >= 300 && statusCode < 400 + && location.isNotEmpty()) + { + if (! location.startsWithIgnoreCase (T("http://"))) + location = T("http://") + location; + + if (levelsOfRedirection++ < 3) + return open (location, optionalPostText, isPost); + } + else + { + levelsOfRedirection = 0; + return true; + } + } + + closeSocket(); + return false; + } + + //============================================================================== + int read (void* buffer, int bytesToRead) + { + fd_set readbits; + FD_ZERO (&readbits); + FD_SET (socketHandle, &readbits); + + struct timeval tv; + tv.tv_sec = timeoutSeconds; + tv.tv_usec = 0; + + if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) + return 0; // (timeout) + + const int bytesRead = jmax (0, recv (socketHandle, buffer, bytesToRead, MSG_WAITALL)); + readPosition += bytesRead; + return bytesRead; + } + + //============================================================================== + int statusCode, readPosition; + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + int socketHandle, levelsOfRedirection; + const int timeoutSeconds; + + //============================================================================== + void closeSocket() + { + if (socketHandle >= 0) + close (socketHandle); + + socketHandle = -1; + } + + const String createRequestHeader (const String& hostName, + const String& hostPath, + const String& proxyURL, + const String& originalURL, + const int hostPort, + const String& optionalPostText, + const bool isPost) + { + String header (isPost ? T("POST ") : T("GET ")); + + if (proxyURL.isEmpty()) + { + header << hostPath << T(" HTTP/1.1\r\nHost: ") + << hostName << ":" << hostPort; + } + else + { + String proxyName, proxyPath; + int proxyPort; + + if (! decomposeURL (proxyURL, proxyName, proxyPath, proxyPort)) + return String::empty; + + header << originalURL << T(" HTTP/1.1\r\nHost: ") + << proxyName << T(":") << proxyPort; + + /* xxx needs finishing + const char* proxyAuth = getenv ("http_proxy_auth"); + if (proxyAuth != 0) + header << T("\r\nProxy-Authorization: ") << Base64Encode (proxyAuth); + */ + } + + header << T("\r\nUser-Agent: JUCE/") + << JUCE_MAJOR_VERSION << T('.') << JUCE_MINOR_VERSION + << T("\r\nConnection: Close\r\n"); + + if (isPost && optionalPostText.isNotEmpty()) + { + const char* const postTextUTF8 = (const char*) optionalPostText.toUTF8(); + + header << T("Content-type: application/x-www-form-urlencoded\r\nContent-length: ") + << (int) strlen (postTextUTF8) << T("\r\n\r\n") + << optionalPostText; + } + + header << T("\r\n"); + //DBG (header); + return header; + } + + const String readResponse() + { + int bytesRead = 0, numConsecutiveLFs = 0; + MemoryBlock buffer (1024, true); + + while (numConsecutiveLFs < 2 && bytesRead < 32768) + { + fd_set readbits; + FD_ZERO (&readbits); + FD_SET (socketHandle, &readbits); + + struct timeval tv; + tv.tv_sec = timeoutSeconds; + tv.tv_usec = 0; + + if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) + return String::empty; // (timeout) + + buffer.ensureSize (bytesRead + 8, true); + char* const dest = (char*) buffer.getData() + bytesRead; + + if (recv (socketHandle, dest, 1, 0) == -1) + return String::empty; + + const char lastByte = *dest; + ++bytesRead; + + if (lastByte == '\n') + ++numConsecutiveLFs; + else if (lastByte != '\r') + numConsecutiveLFs = 0; + } + + const String header (String::fromUTF8 ((const uint8*) buffer.getData())); + + if (header.startsWithIgnoreCase (T("HTTP/"))) + return header.trimEnd(); + + return String::empty; + } + + //============================================================================== + static bool decomposeURL (const String& url, + String& host, String& path, int& port) + { + if (! url.startsWithIgnoreCase (T("http://"))) + return false; + + const int nextSlash = url.indexOfChar (7, '/'); + int nextColon = url.indexOfChar (7, ':'); + if (nextColon > nextSlash && nextSlash > 0) + nextColon = -1; + + if (nextColon >= 0) + { + host = url.substring (7, nextColon); + + if (nextSlash >= 0) + port = url.substring (nextColon + 1, nextSlash).getIntValue(); + else + port = url.substring (nextColon + 1).getIntValue(); + } + else + { + port = 80; + + if (nextSlash >= 0) + host = url.substring (7, nextSlash); + else + host = url.substring (7); + } + + if (nextSlash >= 0) + path = url.substring (nextSlash); + else + path = T("/"); + + return true; + } + + //============================================================================== + static const String findHeaderItem (const StringArray& lines, const String& itemName) + { + for (int i = 0; i < lines.size(); ++i) + if (lines[i].startsWithIgnoreCase (itemName)) + return lines[i].substring (itemName.length()).trim(); + + return String::empty; + } +}; + + +//============================================================================== +bool juce_isOnLine() +{ + return true; +} + +void* juce_openInternetFile (const String& url, + const String& optionalPostText, + const bool isPost) +{ + JUCE_HTTPSocketStream* const s = new JUCE_HTTPSocketStream(); + + if (s->open (url, optionalPostText, isPost)) + return s; + + delete s; + return 0; +} + +void juce_closeInternetFile (void* handle) +{ + JUCE_HTTPSocketStream* const s = (JUCE_HTTPSocketStream*) handle; + + if (s != 0) + delete s; +} + +int juce_getStatusCodeFor (void* handle) +{ + JUCE_HTTPSocketStream* const s = (JUCE_HTTPSocketStream*) handle; + + if (s != 0) + return s->statusCode; + + return 0; +} + +int juce_readFromInternetFile (void* handle, void* buffer, int bytesToRead) +{ + JUCE_HTTPSocketStream* const s = (JUCE_HTTPSocketStream*) handle; + + if (s != 0) + return s->read (buffer, bytesToRead); + + return 0; +} + +int juce_seekInInternetFile (void* handle, int newPosition) +{ + JUCE_HTTPSocketStream* const s = (JUCE_HTTPSocketStream*) handle; + + if (s != 0) + return s->readPosition; + + return 0; +} + + +#endif // __JUCE_MAC_HTTPSTREAM_JUCEHEADER__ diff --git a/build/macosx/platform_specific_code/juce_mac_Messaging.cpp b/build/macosx/platform_specific_code/juce_mac_Messaging.cpp new file mode 100644 index 0000000000..6055607c88 --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_Messaging.cpp @@ -0,0 +1,342 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_appframework/gui/components/juce_Desktop.h" +#include "../../../src/juce_core/text/juce_StringArray.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" + +#undef Point + +static int kJUCEClass = FOUR_CHAR_CODE ('JUCE'); +const int kJUCEKind = 1; +const int kCallbackKind = 2; + +extern void juce_HandleProcessFocusChange(); +extern void juce_maximiseAllMinimisedWindows(); +extern void juce_InvokeMainMenuCommand (const HICommand& command); +extern void juce_MainMenuAboutToBeUsed(); + +static pascal OSStatus EventHandlerProc (EventHandlerCallRef, EventRef theEvent, void* userData) +{ + void* event = 0; + GetEventParameter (theEvent, 'mess', typeVoidPtr, 0, sizeof (void*), 0, &event); + + if (event != 0) + MessageManager::getInstance()->deliverMessage (event); + + return noErr; +} + +struct CallbackMessagePayload +{ + MessageCallbackFunction* function; + void* parameter; + void* volatile result; + bool volatile hasBeenExecuted; +}; + +static pascal OSStatus CallbackHandlerProc (EventHandlerCallRef, EventRef theEvent, void* userData) +{ + CallbackMessagePayload* pl = 0; + GetEventParameter (theEvent, 'mess', typeVoidPtr, 0, sizeof(pl), 0, &pl); + + if (pl != 0) + { + pl->result = (*pl->function) (pl->parameter); + pl->hasBeenExecuted = true; + } + + return noErr; +} + +static pascal OSStatus MouseClickHandlerProc (EventHandlerCallRef, EventRef theEvent, void* userData) +{ + ::Point where; + GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, 0, sizeof(::Point), 0, &where); + WindowRef window; + if (FindWindow (where, &window) == inMenuBar) + { + // turn off the wait cursor before going in here.. + const int oldTimeBeforeWaitCursor = MessageManager::getInstance()->getTimeBeforeShowingWaitCursor(); + MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (0); + + if (Component::getCurrentlyModalComponent() != 0) + Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); + + juce_MainMenuAboutToBeUsed(); + MenuSelect (where); + HiliteMenu (0); + + MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (oldTimeBeforeWaitCursor); + return noErr; + } + + return eventNotHandledErr; +} + +static pascal OSErr QuitAppleEventHandler (const AppleEvent *appleEvt, AppleEvent* reply, long refcon) +{ + if (JUCEApplication::getInstance() != 0) + JUCEApplication::getInstance()->systemRequestedQuit(); + + return noErr; +} + +static pascal OSErr OpenDocEventHandler (const AppleEvent *appleEvt, AppleEvent* reply, long refcon) +{ + AEDescList docs; + StringArray files; + + if (AEGetParamDesc (appleEvt, keyDirectObject, typeAEList, &docs) == noErr) + { + long num; + if (AECountItems (&docs, &num) == noErr) + { + for (int i = 1; i <= num; ++i) + { + FSRef file; + AEKeyword keyword; + DescType type; + Size size; + + if (AEGetNthPtr (&docs, i, typeFSRef, &keyword, &type, + &file, sizeof (file), &size) == noErr) + { + const String path (PlatformUtilities::makePathFromFSRef (&file)); + + if (path.isNotEmpty()) + files.add (path.quoted()); + } + } + + if (files.size() > 0 + && JUCEApplication::getInstance() != 0) + { + JUCE_TRY + { + JUCEApplication::getInstance() + ->anotherInstanceStarted (files.joinIntoString (T(" "))); + } + JUCE_CATCH_ALL + } + } + + AEDisposeDesc (&docs); + }; + + return noErr; +} + +static pascal OSStatus AppEventHandlerProc (EventHandlerCallRef, EventRef theEvent, void* userData) +{ + const UInt32 eventClass = GetEventClass (theEvent); + + if (eventClass == kEventClassCommand) + { + HICommand command; + + if (GetEventParameter (theEvent, kEventParamHICommand, typeHICommand, 0, sizeof (command), 0, &command) == noErr + || GetEventParameter (theEvent, kEventParamDirectObject, typeHICommand, 0, sizeof (command), 0, &command) == noErr) + { + if (command.commandID == kHICommandQuit) + { + if (JUCEApplication::getInstance() != 0) + JUCEApplication::getInstance()->systemRequestedQuit(); + + return noErr; + } + else if (command.commandID == kHICommandMaximizeAll + || command.commandID == kHICommandMaximizeWindow + || command.commandID == kHICommandBringAllToFront) + { + juce_maximiseAllMinimisedWindows(); + return noErr; + } + else + { + juce_InvokeMainMenuCommand (command); + } + } + } + else if (eventClass == kEventClassApplication) + { + if (GetEventKind (theEvent) == kEventAppFrontSwitched) + { + juce_HandleProcessFocusChange(); + } + else if (GetEventKind (theEvent) == kEventAppShown) + { + // this seems to blank the windows, so we need to do a repaint.. + for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) + { + Component* const c = Desktop::getInstance().getComponent (i); + + if (c != 0) + c->repaint(); + } + } + } + + return eventNotHandledErr; +} + +static EventQueueRef mainQueue; +static EventHandlerRef juceEventHandler = 0; +static EventHandlerRef callbackEventHandler = 0; + +//============================================================================== +void MessageManager::doPlatformSpecificInitialisation() +{ + static bool initialised = false; + + if (! initialised) + { + initialised = true; + + // work-around for a bug in MacOS 10.2.. + ProcessSerialNumber junkPSN; + (void) GetCurrentProcess (&junkPSN); + + mainQueue = GetMainEventQueue(); + + // if we're linking a Juce app to one or more dynamic libraries, we'll need different values + // for this so each module doesn't interfere with the others. + UnsignedWide t; + Microseconds (&t); + kJUCEClass ^= t.lo; + } + + const EventTypeSpec type1 = { kJUCEClass, kJUCEKind }; + InstallApplicationEventHandler (NewEventHandlerUPP (EventHandlerProc), 1, &type1, 0, &juceEventHandler); + + const EventTypeSpec type2 = { kJUCEClass, kCallbackKind }; + InstallApplicationEventHandler (NewEventHandlerUPP (CallbackHandlerProc), 1, &type2, 0, &callbackEventHandler); + + // only do this stuff if we're running as an application rather than a library.. + if (JUCEApplication::getInstance() != 0) + { + const EventTypeSpec type3 = { kEventClassMouse, kEventMouseDown }; + InstallApplicationEventHandler (NewEventHandlerUPP (MouseClickHandlerProc), 1, &type3, 0, 0); + + const EventTypeSpec type4[] = { { kEventClassApplication, kEventAppShown }, + { kEventClassApplication, kEventAppFrontSwitched }, + { kEventClassCommand, kEventProcessCommand } }; + + InstallApplicationEventHandler (NewEventHandlerUPP (AppEventHandlerProc), 3, type4, 0, 0); + + AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, + NewAEEventHandlerUPP (QuitAppleEventHandler), 0, false); + + AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, + NewAEEventHandlerUPP (OpenDocEventHandler), 0, false); + } +} + +void MessageManager::doPlatformSpecificShutdown() +{ + if (juceEventHandler != 0) + { + RemoveEventHandler (juceEventHandler); + juceEventHandler = 0; + } + + if (callbackEventHandler != 0) + { + RemoveEventHandler (callbackEventHandler); + callbackEventHandler = 0; + } +} + +bool juce_postMessageToSystemQueue (void* message) +{ + jassert (mainQueue == GetMainEventQueue()); + + EventRef event; + if (CreateEvent (0, kJUCEClass, kJUCEKind, 0, kEventAttributeUserEvent, &event) == noErr) + { + SetEventParameter (event, 'mess', typeVoidPtr, sizeof (void*), &message); + const bool ok = PostEventToQueue (mainQueue, event, kEventPriorityStandard) == noErr; + ReleaseEvent (event); + return ok; + } + + return false; +} + +void MessageManager::broadcastMessage (const String& value) +{ +} + +void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, + void* data) +{ + if (isThisTheMessageThread()) + { + return (*callback) (data); + } + else + { + jassert (mainQueue == GetMainEventQueue()); + + CallbackMessagePayload cmp; + cmp.function = callback; + cmp.parameter = data; + cmp.result = 0; + cmp.hasBeenExecuted = false; + + EventRef event; + if (CreateEvent (0, kJUCEClass, kCallbackKind, 0, kEventAttributeUserEvent, &event) == noErr) + { + void* v = &cmp; + SetEventParameter (event, 'mess', typeVoidPtr, sizeof (void*), &v); + + if (PostEventToQueue (mainQueue, event, kEventPriorityStandard) == noErr) + { + while (! cmp.hasBeenExecuted) + Thread::yield(); + + return cmp.result; + } + } + + return 0; + } +} + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_NamedPipe.cpp b/build/macosx/platform_specific_code/juce_mac_NamedPipe.cpp new file mode 100644 index 0000000000..7edb51c870 --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_NamedPipe.cpp @@ -0,0 +1,237 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +#include +#include +#include + +// As well as being for the mac, this file is included by the linux build. + +#ifdef JUCE_MAC + #include +#else + #include + #include + #include +#endif + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/io/files/juce_File.h" +#include "../../../src/juce_core/io/files/juce_NamedPipe.h" + + +//============================================================================== +struct NamedPipeInternal +{ + String pipeInName, pipeOutName; + int pipeIn, pipeOut; + + bool volatile createdPipe, blocked, stopReadOperation; + + static void signalHandler (int) {} +}; + +void NamedPipe::cancelPendingReads() +{ + while (internal != 0 && ((NamedPipeInternal*) internal)->blocked) + { + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + + intern->stopReadOperation = true; + + char buffer [1] = { 0 }; + ::write (intern->pipeIn, buffer, 1); + + int timeout = 2000; + while (intern->blocked && --timeout >= 0) + sleep (2); + + intern->stopReadOperation = false; + } +} + +void NamedPipe::close() +{ + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + + if (intern != 0) + { + internal = 0; + + if (intern->pipeIn != -1) + ::close (intern->pipeIn); + + if (intern->pipeOut != -1) + ::close (intern->pipeOut); + + if (intern->createdPipe) + { + unlink (intern->pipeInName); + unlink (intern->pipeOutName); + } + + delete intern; + } +} + +bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) +{ + close(); + + NamedPipeInternal* const intern = new NamedPipeInternal(); + internal = intern; + intern->createdPipe = createPipe; + intern->blocked = false; + intern->stopReadOperation = false; + + signal (SIGPIPE, NamedPipeInternal::signalHandler); + siginterrupt (SIGPIPE, 1); + + const String pipePath (T("/tmp/") + File::createLegalFileName (pipeName)); + + intern->pipeInName = pipePath + T("_in"); + intern->pipeOutName = pipePath + T("_out"); + intern->pipeIn = -1; + intern->pipeOut = -1; + + if (createPipe) + { + if ((mkfifo (intern->pipeInName, 0666) && errno != EEXIST) + || (mkfifo (intern->pipeOutName, 0666) && errno != EEXIST)) + { + delete intern; + internal = 0; + + return false; + } + } + + return true; +} + +int NamedPipe::read (void* destBuffer, int maxBytesToRead, int /*timeOutMilliseconds*/) +{ + int bytesRead = -1; + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + + if (intern != 0) + { + intern->blocked = true; + + if (intern->pipeIn == -1) + { + if (intern->createdPipe) + intern->pipeIn = ::open (intern->pipeInName, O_RDWR); + else + intern->pipeIn = ::open (intern->pipeOutName, O_RDWR); + + if (intern->pipeIn == -1) + { + intern->blocked = false; + return -1; + } + } + + bytesRead = 0; + + char* p = (char*) destBuffer; + + while (bytesRead < maxBytesToRead) + { + const int bytesThisTime = maxBytesToRead - bytesRead; + const int numRead = ::read (intern->pipeIn, p, bytesThisTime); + + if (numRead <= 0 || intern->stopReadOperation) + { + bytesRead = -1; + break; + } + + bytesRead += numRead; + p += bytesRead; + } + + intern->blocked = false; + } + + return bytesRead; +} + +int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) +{ + int bytesWritten = -1; + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + + if (intern != 0) + { + if (intern->pipeOut == -1) + { + if (intern->createdPipe) + intern->pipeOut = ::open (intern->pipeOutName, O_WRONLY); + else + intern->pipeOut = ::open (intern->pipeInName, O_WRONLY); + + if (intern->pipeOut == -1) + { + return -1; + } + } + + const char* p = (const char*) sourceBuffer; + bytesWritten = 0; + + const uint32 timeOutTime = Time::getMillisecondCounter() + timeOutMilliseconds; + + while (bytesWritten < numBytesToWrite + && (timeOutMilliseconds < 0 || Time::getMillisecondCounter() < timeOutTime)) + { + const int bytesThisTime = numBytesToWrite - bytesWritten; + const int numWritten = ::write (intern->pipeOut, p, bytesThisTime); + + if (numWritten <= 0) + { + bytesWritten = -1; + break; + } + + bytesWritten += numWritten; + p += bytesWritten; + } + } + + return bytesWritten; +} + + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_Network.cpp b/build/macosx/platform_specific_code/juce_mac_Network.cpp new file mode 100644 index 0000000000..1994d545c5 --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_Network.cpp @@ -0,0 +1,138 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +BEGIN_JUCE_NAMESPACE + + +#include "../../../src/juce_core/text/juce_String.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/containers/juce_MemoryBlock.h" +#include "../../../src/juce_core/text/juce_StringArray.h" +#include "juce_mac_HTTPStream.h" + + +//============================================================================== +static bool GetEthernetIterator (io_iterator_t* matchingServices) +{ + mach_port_t masterPort; + + if (IOMasterPort (MACH_PORT_NULL, &masterPort) == KERN_SUCCESS) + { + CFMutableDictionaryRef dict = IOServiceMatching (kIOEthernetInterfaceClass); + + if (dict != 0) + { + CFMutableDictionaryRef propDict = CFDictionaryCreateMutable (kCFAllocatorDefault, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (propDict != 0) + { + CFDictionarySetValue (propDict, CFSTR (kIOPrimaryInterface), kCFBooleanTrue); + + CFDictionarySetValue (dict, CFSTR (kIOPropertyMatchKey), propDict); + CFRelease (propDict); + } + } + + return IOServiceGetMatchingServices (masterPort, dict, matchingServices) == KERN_SUCCESS; + } + + return false; +} + +int SystemStats::getMACAddresses (int64* addresses, int maxNum) +{ + int numResults = 0; + io_iterator_t it; + + if (GetEthernetIterator (&it)) + { + io_object_t i; + + while ((i = IOIteratorNext (it)) != 0) + { + io_object_t controller; + + if (IORegistryEntryGetParentEntry (i, kIOServicePlane, &controller) == KERN_SUCCESS) + { + CFTypeRef data = IORegistryEntryCreateCFProperty (controller, + CFSTR (kIOMACAddress), + kCFAllocatorDefault, + 0); + if (data != 0) + { + UInt8 addr [kIOEthernetAddressSize]; + zeromem (addr, sizeof (addr)); + + CFDataGetBytes ((CFDataRef)data, CFRangeMake (0, sizeof (addr)), addr); + CFRelease (data); + + int64 a = 0; + for (int i = 6; --i >= 0;) + a = (a << 8) | addr[i]; + + if (numResults < maxNum) + { + *addresses++ = a; + ++numResults; + } + } + + IOObjectRelease (controller); + } + + IOObjectRelease (i); + } + + IOObjectRelease (it); + } + + return numResults; +} + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_SystemStats.cpp b/build/macosx/platform_specific_code/juce_mac_SystemStats.cpp new file mode 100644 index 0000000000..9b39db1d4a --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_SystemStats.cpp @@ -0,0 +1,297 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include +#include +#include +#include + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" + +static int64 highResTimerFrequency; + +#if JUCE_INTEL + +static void juce_getCpuVendor (char* const v) +{ + int vendor[4]; + zerostruct (vendor); + int dummy = 0; + + asm ("mov %%ebx, %%esi \n\t" + "cpuid \n\t" + "xchg %%esi, %%ebx" + : "=a" (dummy), "=S" (vendor[0]), "=c" (vendor[2]), "=d" (vendor[1]) : "a" (0)); + + memcpy (v, vendor, 16); +} + +static unsigned int getCPUIDWord (unsigned int& familyModel, unsigned int& extFeatures) +{ + unsigned int cpu = 0; + unsigned int ext = 0; + unsigned int family = 0; + unsigned int dummy = 0; + + asm ("mov %%ebx, %%esi \n\t" + "cpuid \n\t" + "xchg %%esi, %%ebx" + : "=a" (family), "=S" (ext), "=c" (dummy), "=d" (cpu) : "a" (1)); + + familyModel = family; + extFeatures = ext; + return cpu; +} + +struct CPUFlags +{ + bool hasMMX : 1; + bool hasSSE : 1; + bool hasSSE2 : 1; + bool has3DNow : 1; + bool hasHT : 1; +}; + +static CPUFlags cpuFlags; + +#endif + +//============================================================================== +void Logger::outputDebugString (const String& text) +{ + String withLineFeed (text + T("\n")); + const char* const utf8 = withLineFeed.toUTF8(); + fwrite (utf8, strlen (utf8), 1, stdout); +} + +void Logger::outputDebugPrintf (const tchar* format, ...) +{ + String text; + va_list args; + va_start (args, format); + text.vprintf(format, args); + outputDebugString (text); +} + +int SystemStats::getMemorySizeInMegabytes() +{ + long bytes; + if (Gestalt (gestaltPhysicalRAMSize, &bytes) == noErr) + return (int) (((unsigned long) bytes) / (1024 * 1024)); + + return 0; +} + +//============================================================================== +SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() +{ + return MacOSX; +} + +const String SystemStats::getOperatingSystemName() +{ + return T("Mac OS X"); +} + +//============================================================================== +void SystemStats::initialiseStats() +{ + static bool initialised = false; + + if (! initialised) + { + initialised = true; + +#if JUCE_INTEL + { + unsigned int familyModel, extFeatures; + const unsigned int features = getCPUIDWord (familyModel, extFeatures); + + cpuFlags.hasMMX = ((features & (1 << 23)) != 0); + cpuFlags.hasSSE = ((features & (1 << 25)) != 0); + cpuFlags.hasSSE2 = ((features & (1 << 26)) != 0); + cpuFlags.has3DNow = ((extFeatures & (1 << 31)) != 0); + cpuFlags.hasHT = ((features & (1 << 28)) != 0); + } +#endif + + highResTimerFrequency = (int64) AudioGetHostClockFrequency(); + + if (JUCEApplication::getInstance() != 0) + RegisterAppearanceClient(); + + TXNInitTextension (0, 0, kTXNWantMoviesMask | kTXNWantGraphicsMask); + + String s (SystemStats::getJUCEVersion()); + + rlimit lim; + getrlimit (RLIMIT_NOFILE, &lim); + lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; + setrlimit (RLIMIT_NOFILE, &lim); + } +} + +bool SystemStats::hasMMX() +{ +#if JUCE_INTEL + return cpuFlags.hasMMX; +#else + return false; +#endif +} + +bool SystemStats::hasSSE() +{ +#if JUCE_INTEL + return cpuFlags.hasSSE; +#else + return false; +#endif +} + +bool SystemStats::hasSSE2() +{ +#if JUCE_INTEL + return cpuFlags.hasSSE2; +#else + return false; +#endif +} + +bool SystemStats::has3DNow() +{ +#if JUCE_INTEL + return cpuFlags.has3DNow; +#else + return false; +#endif +} + +bool SystemStats::hasHyperThreading() +{ +#if JUCE_INTEL + return cpuFlags.hasHT; +#else + return false; +#endif +} + +const String SystemStats::getCpuVendor() +{ +#if JUCE_INTEL + char v [16]; + juce_getCpuVendor (v); + return String (v, 16); +#else + return String::empty; +#endif +} + +int SystemStats::getCpuSpeedInMegaherz() +{ + return GetCPUSpeed(); +} + +int SystemStats::getNumPhysicalCpus() +{ + return MPProcessors(); +} + +int SystemStats::getNumLogicalCpus() +{ + return getNumPhysicalCpus(); +} + +uint32 SystemStats::getPhysicalAffinityMask() +{ + jassertfalse + return 0; +} + +//============================================================================== +static int64 juce_getMicroseconds() throw() +{ + UnsignedWide t; + Microseconds (&t); + return (((int64) t.hi) << 32) | t.lo; +} + +uint32 juce_millisecondsSinceStartup() throw() +{ + return (uint32) (juce_getMicroseconds() / 1000); +} + +double Time::getMillisecondCounterHiRes() throw() +{ + // xxx might be more accurate to use a scaled AudioGetCurrentHostTime? + return juce_getMicroseconds() * 0.001; +} + +int64 Time::getHighResolutionTicks() throw() +{ + return (int64) AudioGetCurrentHostTime(); +} + +int64 Time::getHighResolutionTicksPerSecond() throw() +{ + return highResTimerFrequency; +} + +int64 SystemStats::getClockCycleCounter() +{ + jassertfalse + return 0; +} + +bool Time::setSystemTimeToThisTime() const +{ + jassertfalse + return false; +} + +//============================================================================== +int SystemStats::getPageSize() +{ + jassertfalse + return 512; //xxx +} + +void PlatformUtilities::fpuReset() +{ +} + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_Threads.cpp b/build/macosx/platform_specific_code/juce_mac_Threads.cpp new file mode 100644 index 0000000000..5bfb8010c6 --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_Threads.cpp @@ -0,0 +1,364 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include +#include +#include +#include + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/threads/juce_CriticalSection.h" +#include "../../../src/juce_core/threads/juce_WaitableEvent.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_core/threads/juce_InterProcessLock.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_core/io/files/juce_File.h" + + +//============================================================================== +CriticalSection::CriticalSection() throw() +{ + pthread_mutexattr_t atts; + pthread_mutexattr_init (&atts); + pthread_mutexattr_settype (&atts, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init (&internal, &atts); +} + +CriticalSection::~CriticalSection() throw() +{ + pthread_mutex_destroy (&internal); +} + +void CriticalSection::enter() const throw() +{ + pthread_mutex_lock (&internal); +} + +bool CriticalSection::tryEnter() const throw() +{ + return pthread_mutex_trylock (&internal) == 0; +} + +void CriticalSection::exit() const throw() +{ + pthread_mutex_unlock (&internal); +} + +//============================================================================== +struct EventStruct +{ + pthread_cond_t condition; + pthread_mutex_t mutex; + bool triggered; +}; + +WaitableEvent::WaitableEvent() throw() +{ + EventStruct* const es = new EventStruct(); + es->triggered = false; + + pthread_cond_init (&es->condition, 0); + pthread_mutex_init (&es->mutex, 0); + + internal = es; +} + +WaitableEvent::~WaitableEvent() throw() +{ + EventStruct* const es = (EventStruct*) internal; + + pthread_cond_destroy (&es->condition); + pthread_mutex_destroy (&es->mutex); + + delete es; +} + +bool WaitableEvent::wait (const int timeOutMillisecs) const throw() +{ + EventStruct* const es = (EventStruct*) internal; + + bool ok = true; + pthread_mutex_lock (&es->mutex); + + if (!es->triggered) + { + if (timeOutMillisecs < 0) + { + pthread_cond_wait (&es->condition, &es->mutex); + } + else + { + struct timespec time; + time.tv_sec = timeOutMillisecs / 1000; + time.tv_nsec = (timeOutMillisecs % 1000) * 1000000; + pthread_cond_timedwait_relative_np (&es->condition, &es->mutex, &time); + } + + ok = es->triggered; + } + + es->triggered = false; + + pthread_mutex_unlock (&es->mutex); + return ok; +} + +void WaitableEvent::signal() const throw() +{ + EventStruct* const es = (EventStruct*) internal; + + pthread_mutex_lock (&es->mutex); + es->triggered = true; + pthread_cond_signal (&es->condition); + pthread_mutex_unlock (&es->mutex); +} + +void WaitableEvent::reset() const throw() +{ + EventStruct* const es = (EventStruct*) internal; + + pthread_mutex_lock (&es->mutex); + es->triggered = false; + pthread_mutex_unlock (&es->mutex); +} + +//============================================================================== +void JUCE_API juce_threadEntryPoint (void*); + +void* threadEntryProc (void* userData) +{ + juce_threadEntryPoint (userData); + return 0; +} + +void* juce_createThread (void* userData) +{ + pthread_t handle = 0; + + if (pthread_create (&handle, 0, threadEntryProc, userData) == 0) + { + pthread_detach (handle); + return (void*) handle; + } + + return 0; +} + +void juce_killThread (void* handle) +{ + if (handle != 0) + pthread_cancel ((pthread_t) handle); +} + +void juce_setCurrentThreadName (const String& /*name*/) +{ +} + +int Thread::getCurrentThreadId() +{ + return (int) pthread_self(); +} + +void juce_setThreadPriority (void* handle, int priority) +{ + if (handle == 0) + handle = (void*) pthread_self(); + + struct sched_param param; + int policy; + pthread_getschedparam ((pthread_t) handle, &policy, ¶m); + param.sched_priority = jlimit (1, 127, 1 + (priority * 126) / 11); + pthread_setschedparam ((pthread_t) handle, policy, ¶m); +} + +void Thread::yield() +{ + sched_yield(); +} + +void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) +{ + // xxx + jassertfalse +} + +void Thread::sleep (int millisecs) +{ + struct timespec time; + time.tv_sec = millisecs / 1000; + time.tv_nsec = (millisecs % 1000) * 1000000; + nanosleep (&time, 0); +} + + +//============================================================================== +void Process::raisePrivilege() +{ + jassertfalse +} + +void Process::lowerPrivilege() +{ + jassertfalse +} + +void Process::terminate() +{ + ExitToShell(); +} + +void Process::setPriority (ProcessPriority p) +{ + // xxx +} + +void* Process::loadDynamicLibrary (const String& name) +{ + // xxx needs to use bundles + + FSSpec fs; + if (PlatformUtilities::makeFSSpecFromPath (&fs, name)) + { + CFragConnectionID connID; + Ptr mainPtr; + Str255 errorMessage; + Str63 nm; + PlatformUtilities::copyToStr63 (nm, name); + + const OSErr err = GetDiskFragment (&fs, 0, kCFragGoesToEOF, nm, kReferenceCFrag, &connID, &mainPtr, errorMessage); + if (err == noErr) + return (void*)connID; + } + + return 0; +} + +void Process::freeDynamicLibrary (void* handle) +{ + if (handle != 0) + CloseConnection ((CFragConnectionID*)&handle); +} + +void* Process::getProcedureEntryPoint (void* h, const String& procedureName) +{ + if (h != 0) + { + CFragSymbolClass cl; + Ptr ptr; + Str255 name; + PlatformUtilities::copyToStr255 (name, procedureName); + + if (FindSymbol ((CFragConnectionID) h, name, &ptr, &cl) == noErr) + { + return ptr; + } + } + + return 0; +} + +//============================================================================== +InterProcessLock::InterProcessLock (const String& name_) + : internal (0), + name (name_), + reentrancyLevel (0) +{ + const File tempDir (File::getSpecialLocation (File::tempDirectory)); + const File temp (tempDir.getChildFile (name)); + temp.create(); + + internal = (void*) open (temp.getFullPathName().toUTF8(), O_NONBLOCK | O_RDONLY); +} + +InterProcessLock::~InterProcessLock() +{ + while (reentrancyLevel > 0) + this->exit(); + + close ((int) internal); +} + +bool InterProcessLock::enter (int timeOutMillisecs) +{ + if (internal == 0) + return false; + + if (reentrancyLevel != 0) + return true; + + if (timeOutMillisecs <= 0) + { + if (flock ((int) internal, + timeOutMillisecs < 0 ? LOCK_EX + : (LOCK_EX | LOCK_NB)) == 0) + { + ++reentrancyLevel; + return true; + } + } + else + { + const int64 endTime = Time::currentTimeMillis() + timeOutMillisecs; + + for (;;) + { + if (flock ((int) internal, LOCK_EX | LOCK_NB) == 0) + { + ++reentrancyLevel; + return true; + } + + if (Time::currentTimeMillis() >= endTime) + break; + + Thread::sleep (10); + } + } + + return false; +} + +void InterProcessLock::exit() +{ + if (reentrancyLevel > 0 && internal != 0) + { + --reentrancyLevel; + + const int result = flock ((int) internal, LOCK_UN); + (void) result; + jassert (result == 0); + } +} + +END_JUCE_NAMESPACE diff --git a/build/macosx/platform_specific_code/juce_mac_Windowing.cpp b/build/macosx/platform_specific_code/juce_mac_Windowing.cpp new file mode 100644 index 0000000000..16dfe896dc --- /dev/null +++ b/build/macosx/platform_specific_code/juce_mac_Windowing.cpp @@ -0,0 +1,3061 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" +#include +#include + +#if JUCE_OPENGL +#include +#endif + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" +#include "../../../src/juce_appframework/events/juce_AsyncUpdater.h" +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_core/basics/juce_Singleton.h" +#include "../../../src/juce_core/basics/juce_Random.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_appframework/application/juce_SystemClipboard.h" +#include "../../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.h" +#include "../../../src/juce_appframework/gui/components/windows/juce_AlertWindow.h" +#include "../../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.h" +#include "../../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" +#include "../../../src/juce_appframework/gui/components/juce_Desktop.h" +#include "../../../src/juce_appframework/gui/components/menus/juce_MenuBarModel.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.h" +#include "../../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.h" +#include "../../../src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.h" +#include "../../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.h" + +#undef Point + +const WindowRegionCode windowRegionToUse = kWindowContentRgn; + +static HIObjectClassRef viewClassRef = 0; +static CFStringRef juceHiViewClassNameCFString = 0; +static ComponentPeer* juce_currentMouseTrackingPeer = 0; + + +//============================================================================== +static VoidArray keysCurrentlyDown; + +bool KeyPress::isKeyCurrentlyDown (int keyCode) +{ + if (keysCurrentlyDown.contains ((void*) keyCode)) + return true; + + if (keyCode >= 'A' && keyCode <= 'Z' + && keysCurrentlyDown.contains ((void*) (int) CharacterFunctions::toLowerCase ((tchar) keyCode))) + return true; + + if (keyCode >= 'a' && keyCode <= 'z' + && keysCurrentlyDown.contains ((void*) (int) CharacterFunctions::toUpperCase ((tchar) keyCode))) + return true; + + return false; +} + +//============================================================================== +static VoidArray minimisedWindows; + +static void setWindowMinimised (WindowRef ref, const bool isMinimised) +{ + if (isMinimised != minimisedWindows.contains (ref)) + CollapseWindow (ref, isMinimised); +} + +void juce_maximiseAllMinimisedWindows() +{ + const VoidArray minWin (minimisedWindows); + + for (int i = minWin.size(); --i >= 0;) + setWindowMinimised ((WindowRef) (minWin[i]), false); +} + +//============================================================================== +class HIViewComponentPeer; +static HIViewComponentPeer* currentlyFocusedPeer = 0; + + +//============================================================================== +static int currentModifiers = 0; + +static void updateModifiers (EventRef theEvent) +{ + currentModifiers &= ~ (ModifierKeys::shiftModifier | ModifierKeys::ctrlModifier + | ModifierKeys::altModifier | ModifierKeys::commandModifier); + + UInt32 m; + + if (theEvent != 0) + GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, 0, sizeof(m), 0, &m); + else + m = GetCurrentEventKeyModifiers(); + + if ((m & (shiftKey | rightShiftKey)) != 0) + currentModifiers |= ModifierKeys::shiftModifier; + + if ((m & (controlKey | rightControlKey)) != 0) + currentModifiers |= ModifierKeys::ctrlModifier; + + if ((m & (optionKey | rightOptionKey)) != 0) + currentModifiers |= ModifierKeys::altModifier; + + if ((m & cmdKey) != 0) + currentModifiers |= ModifierKeys::commandModifier; +} + +void ModifierKeys::updateCurrentModifiers() +{ + currentModifierFlags = currentModifiers; +} + +static int64 getEventTime (EventRef event) +{ + const int64 millis = (int64) (1000.0 * (event != 0 ? GetEventTime (event) + : GetCurrentEventTime())); + + static int64 offset = 0; + if (offset == 0) + offset = Time::currentTimeMillis() - millis; + + return offset + millis; +} + + +//============================================================================== +class MacBitmapImage : public Image +{ +public: + //============================================================================== + CGColorSpaceRef colourspace; + CGDataProviderRef provider; + + //============================================================================== + MacBitmapImage (const PixelFormat format_, + const int w, const int h, const bool clearImage) + : Image (format_, w, h) + { + jassert (format_ == RGB || format_ == ARGB); + + pixelStride = (format_ == RGB) ? 3 : 4; + + lineStride = (w * pixelStride + 3) & ~3; + const int imageSize = lineStride * h; + + if (clearImage) + imageData = (uint8*) juce_calloc (imageSize); + else + imageData = (uint8*) juce_malloc (imageSize); + + //colourspace = CGColorSpaceCreateWithName (kCGColorSpaceUserRGB); + + CMProfileRef prof; + CMGetSystemProfile (&prof); + colourspace = CGColorSpaceCreateWithPlatformColorSpace (prof); + + provider = CGDataProviderCreateWithData (0, imageData, h * lineStride, 0); + } + + MacBitmapImage::~MacBitmapImage() + { + CGDataProviderRelease (provider); + CGColorSpaceRelease (colourspace); + + juce_free (imageData); + imageData = 0; // to stop the base class freeing this + } + + void blitToContext (CGContextRef context, const float dx, const float dy) + { + CGImageRef tempImage = CGImageCreate (getWidth(), getHeight(), + 8, pixelStride << 3, lineStride, colourspace, +#if MACOS_10_3_OR_EARLIER || JUCE_BIG_ENDIAN + hasAlphaChannel() ? kCGImageAlphaPremultipliedFirst + : kCGImageAlphaNone, +#else + hasAlphaChannel() ? kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst + : kCGImageAlphaNone, +#endif + provider, 0, false, + kCGRenderingIntentDefault); + + HIRect r; + r.origin.x = dx; + r.origin.y = dy; + r.size.width = (float) getWidth(); + r.size.height = (float) getHeight(); + + HIViewDrawCGImage (context, &r, tempImage); + + CGImageRelease (tempImage); + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +class MouseCheckTimer : private Timer, + private DeletedAtShutdown +{ + HIViewComponentPeer* lastPeerUnderMouse; + int lastX, lastY; + +public: + MouseCheckTimer() + : lastX (0), + lastY (0) + { + lastPeerUnderMouse = 0; + resetMouseMoveChecker(); + } + + ~MouseCheckTimer() + { + clearSingletonInstance(); + } + + juce_DeclareSingleton_SingleThreaded (MouseCheckTimer, false) + + bool hasEverHadAMouseMove; + + void moved (HIViewComponentPeer* const peer) + { + if (hasEverHadAMouseMove) + startTimer (200); + + lastPeerUnderMouse = peer; + } + + void resetMouseMoveChecker() + { + hasEverHadAMouseMove = false; + startTimer (1000 / 16); + } + + void timerCallback(); +}; + +juce_ImplementSingleton_SingleThreaded (MouseCheckTimer) + +//============================================================================== +#if JUCE_QUICKTIME +extern void OfferMouseClickToQuickTime (WindowRef window, ::Point where, long when, long modifiers, + Component* topLevelComp); +#endif + + +//============================================================================== +class HIViewComponentPeer : public ComponentPeer, + private Timer +{ +public: + //============================================================================== + HIViewComponentPeer (Component* const component, + const int windowStyleFlags, + HIViewRef viewToAttachTo) + : ComponentPeer (component, windowStyleFlags), + fullScreen (false), + isCompositingWindow (false), + windowRef (0), + viewRef (0) + { + repainter = new RepaintManager (this); + + eventHandlerRef = 0; + + if (viewToAttachTo != 0) + { + isSharedWindow = true; + } + else + { + isSharedWindow = false; + + WindowRef newWindow = createNewWindow (windowStyleFlags); + + GetRootControl (newWindow, (ControlRef*) &viewToAttachTo); + jassert (viewToAttachTo != 0); + + HIViewRef growBox = 0; + HIViewFindByID (HIViewGetRoot (newWindow), kHIViewWindowGrowBoxID, &growBox); + + if (growBox != 0) + HIGrowBoxViewSetTransparent (growBox, true); + } + + createNewHIView(); + + HIViewAddSubview (viewToAttachTo, viewRef); + HIViewSetVisible (viewRef, component->isVisible()); + + setTitle (component->getName()); + + if (component->isVisible() && ! isSharedWindow) + { + ShowWindow (windowRef); + ActivateWindow (windowRef, component->getWantsKeyboardFocus()); + } + } + + ~HIViewComponentPeer() + { + minimisedWindows.removeValue (windowRef); + + if (IsValidWindowPtr (windowRef)) + { + if (! isSharedWindow) + { + CFRelease (viewRef); + viewRef = 0; + + DisposeWindow (windowRef); + } + else + { + if (eventHandlerRef != 0) + RemoveEventHandler (eventHandlerRef); + + CFRelease (viewRef); + viewRef = 0; + } + + windowRef = 0; + } + + if (currentlyFocusedPeer == this) + currentlyFocusedPeer = 0; + + delete repainter; + } + + //============================================================================== + void* getNativeHandle() const + { + return windowRef; + } + + void setVisible (bool shouldBeVisible) + { + HIViewSetVisible (viewRef, shouldBeVisible); + + if ((! isSharedWindow) && IsValidWindowPtr (windowRef)) + { + if (shouldBeVisible) + ShowWindow (windowRef); + else + HideWindow (windowRef); + + resizeViewToFitWindow(); + + // If nothing else is focused, then grab the focus too + if (shouldBeVisible + && Component::getCurrentlyFocusedComponent() == 0 + && Process::isForegroundProcess()) + { + component->toFront (true); + } + } + } + + void setTitle (const String& title) + { + if ((! isSharedWindow) && IsValidWindowPtr (windowRef)) + { + CFStringRef t = PlatformUtilities::juceStringToCFString (title); + SetWindowTitleWithCFString (windowRef, t); + CFRelease (t); + } + } + + void setPosition (int x, int y) + { + if (isSharedWindow) + { + HIViewPlaceInSuperviewAt (viewRef, x, y); + } + else if (IsValidWindowPtr (windowRef)) + { + Rect r; + GetWindowBounds (windowRef, windowRegionToUse, &r); + r.right += x - r.left; + r.bottom += y - r.top; + r.left = x; + r.top = y; + SetWindowBounds (windowRef, windowRegionToUse, &r); + } + } + + void setSize (int w, int h) + { + w = jmax (0, w); + h = jmax (0, h); + + if (w != getComponent()->getWidth() + || h != getComponent()->getHeight()) + { + repainter->repaint (0, 0, w, h); + } + + if (isSharedWindow) + { + HIRect r; + HIViewGetFrame (viewRef, &r); + r.size.width = (float) w; + r.size.height = (float) h; + HIViewSetFrame (viewRef, &r); + } + else if (IsValidWindowPtr (windowRef)) + { + Rect r; + GetWindowBounds (windowRef, windowRegionToUse, &r); + r.right = r.left + w; + r.bottom = r.top + h; + SetWindowBounds (windowRef, windowRegionToUse, &r); + } + } + + void setBounds (int x, int y, int w, int h, const bool isNowFullScreen) + { + fullScreen = isNowFullScreen; + w = jmax (0, w); + h = jmax (0, h); + + if (w != getComponent()->getWidth() + || h != getComponent()->getHeight()) + { + repainter->repaint (0, 0, w, h); + } + + if (isSharedWindow) + { + HIRect r; + r.origin.x = (float) x; + r.origin.y = (float) y; + r.size.width = (float) w; + r.size.height = (float) h; + HIViewSetFrame (viewRef, &r); + } + else if (IsValidWindowPtr (windowRef)) + { + Rect r; + r.left = x; + r.top = y; + r.right = x + w; + r.bottom = y + h; + SetWindowBounds (windowRef, windowRegionToUse, &r); + } + } + + void getBounds (int& x, int& y, int& w, int& h, const bool global) const + { + HIRect hiViewPos; + HIViewGetFrame (viewRef, &hiViewPos); + + if (global) + { + HIViewRef content = 0; + HIViewFindByID (HIViewGetRoot (windowRef), kHIViewWindowContentID, &content); + HIPoint p = { 0.0f, 0.0f }; + HIViewConvertPoint (&p, viewRef, content); + + x = (int) p.x; + y = (int) p.y; + + if (IsValidWindowPtr (windowRef)) + { + Rect windowPos; + GetWindowBounds (windowRef, kWindowContentRgn, &windowPos); + + x += windowPos.left; + y += windowPos.top; + } + } + else + { + x = (int) hiViewPos.origin.x; + y = (int) hiViewPos.origin.y; + } + + w = (int) hiViewPos.size.width; + h = (int) hiViewPos.size.height; + } + + void getBounds (int& x, int& y, int& w, int& h) const + { + getBounds (x, y, w, h, ! isSharedWindow); + } + + int getScreenX() const + { + int x, y, w, h; + getBounds (x, y, w, h, true); + return x; + } + + int getScreenY() const + { + int x, y, w, h; + getBounds (x, y, w, h, true); + return y; + } + + void relativePositionToGlobal (int& x, int& y) + { + int wx, wy, ww, wh; + getBounds (wx, wy, ww, wh, true); + + x += wx; + y += wy; + } + + void globalPositionToRelative (int& x, int& y) + { + int wx, wy, ww, wh; + getBounds (wx, wy, ww, wh, true); + + x -= wx; + y -= wy; + } + + void setMinimised (bool shouldBeMinimised) + { + if (! isSharedWindow) + setWindowMinimised (windowRef, shouldBeMinimised); + } + + bool isMinimised() const + { + return minimisedWindows.contains (windowRef); + } + + void setFullScreen (bool shouldBeFullScreen) + { + if (! isSharedWindow) + { + setMinimised (false); + + if (fullScreen != shouldBeFullScreen) + { + Rectangle r (lastNonFullscreenBounds); + + if (shouldBeFullScreen) + r = Desktop::getInstance().getMainMonitorArea(); + + // (can't call the component's setBounds method because that'll reset our fullscreen flag) + if (r != getComponent()->getBounds() && ! r.isEmpty()) + setBounds (r.getX(), r.getY(), r.getWidth(), r.getHeight(), shouldBeFullScreen); + } + } + } + + bool isFullScreen() const + { + return fullScreen; + } + + bool contains (int x, int y, bool trueIfInAChildWindow) const + { + if (x < 0 || y < 0 + || x >= component->getWidth() || y >= component->getHeight() + || ! IsValidWindowPtr (windowRef)) + return false; + + Rect r; + GetWindowBounds (windowRef, windowRegionToUse, &r); + + ::Point p; + p.h = r.left + x; + p.v = r.top + y; + + WindowRef ref2 = 0; + FindWindow (p, &ref2); + + if (windowRef != ref2) + return false; + + if (trueIfInAChildWindow) + return true; + + HIPoint p2; + p2.x = (float) x; + p2.y = (float) y; + HIViewRef hit; + + HIViewGetSubviewHit (viewRef, &p2, true, &hit); + return hit == 0 || hit == viewRef; + } + + const BorderSize getFrameSize() const + { + return BorderSize(); + } + + bool setAlwaysOnTop (bool alwaysOnTop) + { + // can't do this so return false and let the component create a new window + return false; + } + + void toFront (bool makeActiveWindow) + { + makeActiveWindow = makeActiveWindow + && component->isValidComponent() + && (component->getWantsKeyboardFocus() + || component->isCurrentlyModal()); + + if (windowRef != FrontWindow() + || (makeActiveWindow && ! IsWindowActive (windowRef)) + || ! Process::isForegroundProcess()) + { + if (! Process::isForegroundProcess()) + { + ProcessSerialNumber psn; + GetCurrentProcess (&psn); + SetFrontProcess (&psn); + } + + if (IsValidWindowPtr (windowRef)) + { + if (makeActiveWindow) + { + SelectWindow (windowRef); + SetUserFocusWindow (windowRef); + HIViewAdvanceFocus (viewRef, 0); + } + else + { + BringToFront (windowRef); + } + + handleBroughtToFront(); + } + } + } + + void toBehind (ComponentPeer* other) + { + HIViewComponentPeer* const otherWindow = dynamic_cast (other); + + if (other != 0 && windowRef != 0 && otherWindow->windowRef != 0) + { + if (windowRef == otherWindow->windowRef) + { + HIViewSetZOrder (viewRef, kHIViewZOrderBelow, otherWindow->viewRef); + } + else + { + SendBehind (windowRef, otherWindow->windowRef); + } + } + } + + //============================================================================== + void viewFocusGain() + { + const MessageManagerLock messLock; + + if (currentlyFocusedPeer != this) + { + if (ComponentPeer::isValidPeer (currentlyFocusedPeer)) + currentlyFocusedPeer->handleFocusLoss(); + + currentlyFocusedPeer = this; + + handleFocusGain(); + } + } + + void viewFocusLoss() + { + if (currentlyFocusedPeer == this) + { + currentlyFocusedPeer = 0; + handleFocusLoss(); + } + } + + bool isFocused() const + { + return windowRef == GetUserFocusWindow() + && HIViewSubtreeContainsFocus (viewRef); + } + + void grabFocus() + { + if ((! isFocused()) && IsValidWindowPtr (windowRef)) + { + SetUserFocusWindow (windowRef); + HIViewAdvanceFocus (viewRef, 0); + } + } + + //============================================================================== + void repaint (int x, int y, int w, int h) + { + if (Rectangle::intersectRectangles (x, y, w, h, + 0, 0, + getComponent()->getWidth(), + getComponent()->getHeight())) + { + if ((getStyleFlags() & windowRepaintedExplictly) == 0) + { + if (isCompositingWindow) + { +#if MACOS_10_3_OR_EARLIER + RgnHandle rgn = NewRgn(); + SetRectRgn (rgn, x, y, x + w, y + h); + HIViewSetNeedsDisplayInRegion (viewRef, rgn, true); + DisposeRgn (rgn); +#else + HIRect r; + r.origin.x = x; + r.origin.y = y; + r.size.width = w; + r.size.height = h; + + HIViewSetNeedsDisplayInRect (viewRef, &r, true); +#endif + } + else + { + if (! isTimerRunning()) + startTimer (20); + } + } + + repainter->repaint (x, y, w, h); + } + } + + void timerCallback() + { + performAnyPendingRepaintsNow(); + } + + void performAnyPendingRepaintsNow() + { + stopTimer(); + + if (component->isVisible()) + { +#if MACOS_10_2_OR_EARLIER + if (! isCompositingWindow) + { + Rect w; + GetWindowBounds (windowRef, windowRegionToUse, &w); + + RgnHandle rgn = NewRgn(); + SetRectRgn (rgn, 0, 0, w.right - w.left, w.bottom - w.top); + UpdateControls (windowRef, rgn); + DisposeRgn (rgn); + } + else + { + EventRef theEvent; + + EventTypeSpec eventTypes[1]; + eventTypes[0].eventClass = kEventClassControl; + eventTypes[0].eventKind = kEventControlDraw; + + int n = 3; + while (--n >= 0 + && ReceiveNextEvent (1, eventTypes, kEventDurationNoWait, true, &theEvent) == noErr) + { + if (GetEventClass (theEvent) == kEventClassAppleEvent) + { + EventRecord eventRec; + if (ConvertEventRefToEventRecord (theEvent, &eventRec)) + AEProcessAppleEvent (&eventRec); + } + else + { + EventTargetRef theTarget = GetEventDispatcherTarget(); + SendEventToEventTarget (theEvent, theTarget); + } + + ReleaseEvent (theEvent); + } + } +#else + HIViewRender (viewRef); +#endif + } + } + + //============================================================================== + juce_UseDebuggingNewOperator + + WindowRef windowRef; + HIViewRef viewRef; + +private: + EventHandlerRef eventHandlerRef; + bool fullScreen, isSharedWindow, isCompositingWindow; + + //============================================================================== + class RepaintManager : public Timer + { +public: + RepaintManager (HIViewComponentPeer* const peer_) + : peer (peer_), + image (0) + { + } + + ~RepaintManager() + { + delete image; + } + + void timerCallback() + { + stopTimer(); + deleteAndZero (image); + } + + void repaint (int x, int y, int w, int h) + { + regionsNeedingRepaint.add (x, y, w, h); + } + + void repaintAnyRemainingRegions() + { + // if any regions have been invaldated during the paint callback, + // we need to repaint them explicitly because the mac throws this + // stuff away + for (RectangleList::Iterator i (regionsNeedingRepaint); i.next();) + { + const Rectangle& r = i.getRectangle(); + peer->repaint (r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + } + + void paint (CGContextRef cgContext, int x, int y, int w, int h) + { + if (w > 0 && h > 0) + { + bool refresh = false; + int imW = image != 0 ? image->getWidth() : 0; + int imH = image != 0 ? image->getHeight() : 0; + + if (imW < w || imH < h) + { + imW = jmin (peer->getComponent()->getWidth(), (w + 31) & ~31); + imH = jmin (peer->getComponent()->getHeight(), (h + 31) & ~31); + + delete image; + image = new MacBitmapImage (peer->getComponent()->isOpaque() ? Image::RGB + : Image::ARGB, + imW, imH, false); + + refresh = true; + } + else if (imageX > x || imageY > y + || imageX + imW < x + w + || imageY + imH < y + h) + { + refresh = true; + } + + if (refresh) + { + regionsNeedingRepaint.clear(); + regionsNeedingRepaint.addWithoutMerging (Rectangle (x, y, imW, imH)); + imageX = x; + imageY = y; + } + + LowLevelGraphicsSoftwareRenderer context (*image); + context.setOrigin (-imageX, -imageY); + + if (context.reduceClipRegion (regionsNeedingRepaint)) + { + regionsNeedingRepaint.clear(); + + if (! peer->getComponent()->isOpaque()) + { + for (RectangleList::Iterator i (*context.getRawClipRegion()); i.next();) + { + const Rectangle& r = i.getRectangle(); + image->clear (r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + } + + regionsNeedingRepaint.clear(); + peer->clearMaskedRegion(); + peer->handlePaint (context); + } + else + { + regionsNeedingRepaint.clear(); + } + + if (! peer->maskedRegion.isEmpty()) + { + RectangleList total (Rectangle (x, y, w, h)); + total.subtract (peer->maskedRegion); + + CGRect* rects = (CGRect*) juce_malloc (sizeof (CGRect) * total.getNumRectangles()); + int n = 0; + + for (RectangleList::Iterator i (total); i.next();) + { + const Rectangle& r = i.getRectangle(); + rects[n].origin.x = (int) r.getX(); + rects[n].origin.y = (int) r.getY(); + rects[n].size.width = roundFloatToInt (r.getWidth()); + rects[n++].size.height = roundFloatToInt (r.getHeight()); + } + + CGContextClipToRects (cgContext, rects, n); + juce_free (rects); + } + + if (peer->isSharedWindow) + { + CGRect clip; + clip.origin.x = x; + clip.origin.y = y; + clip.size.width = jmin (w, peer->getComponent()->getWidth() - x); + clip.size.height = jmin (h, peer->getComponent()->getHeight() - y); + + CGContextClipToRect (cgContext, clip); + } + + image->blitToContext (cgContext, imageX, imageY); + } + + startTimer (3000); + } + + private: + HIViewComponentPeer* const peer; + MacBitmapImage* image; + int imageX, imageY; + RectangleList regionsNeedingRepaint; + + RepaintManager (const RepaintManager&); + const RepaintManager& operator= (const RepaintManager&); + }; + + RepaintManager* repainter; + + friend class RepaintManager; + + //============================================================================== + static OSStatus handleFrameRepaintEvent (EventHandlerCallRef myHandler, + EventRef theEvent, + void* userData) + { + // don't draw the frame.. + return noErr; + } + + //============================================================================== + OSStatus handleWindowClassEvent (EventRef theEvent) + { + switch (GetEventKind (theEvent)) + { + case kEventWindowBoundsChanged: + resizeViewToFitWindow(); + break; // allow other handlers in the event chain to also get a look at the events + + case kEventWindowBoundsChanging: + if ((styleFlags & (windowIsResizable | windowHasTitleBar)) == (windowIsResizable | windowHasTitleBar)) + { + UInt32 atts = 0; + GetEventParameter (theEvent, kEventParamAttributes, typeUInt32, + 0, sizeof (UInt32), 0, &atts); + + if ((atts & (kWindowBoundsChangeUserDrag | kWindowBoundsChangeUserResize)) != 0) + { + if (component->isCurrentlyBlockedByAnotherModalComponent()) + { + Component* const modal = Component::getCurrentlyModalComponent(); + if (modal != 0) + modal->inputAttemptWhenModal(); + } + + if ((atts & kWindowBoundsChangeUserResize) != 0 + && constrainer != 0 && ! isSharedWindow) + { + Rect current; + GetEventParameter (theEvent, kEventParamCurrentBounds, typeQDRectangle, + 0, sizeof (Rect), 0, ¤t); + + int x = current.left; + int y = current.top; + int w = current.right - current.left; + int h = current.bottom - current.top; + + const Rectangle currentRect (getComponent()->getBounds()); + + constrainer->checkBounds (x, y, w, h, currentRect, + Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), + y != currentRect.getY() && y + h == currentRect.getBottom(), + x != currentRect.getX() && x + w == currentRect.getRight(), + y == currentRect.getY() && y + h != currentRect.getBottom(), + x == currentRect.getX() && x + w != currentRect.getRight()); + + current.left = x; + current.top = y; + current.right = x + w; + current.bottom = y + h; + + SetEventParameter (theEvent, kEventParamCurrentBounds, typeQDRectangle, + sizeof (Rect), ¤t); + + return noErr; + } + } + } + break; + + case kEventWindowFocusAcquired: + keysCurrentlyDown.clear(); + + if ((! isSharedWindow) || HIViewSubtreeContainsFocus (viewRef)) + viewFocusGain(); + + break; // allow other handlers in the event chain to also get a look at the events + + case kEventWindowFocusRelinquish: + keysCurrentlyDown.clear(); + viewFocusLoss(); + + break; // allow other handlers in the event chain to also get a look at the events + + case kEventWindowCollapsed: + minimisedWindows.addIfNotAlreadyThere (windowRef); + handleMovedOrResized(); + break; // allow other handlers in the event chain to also get a look at the events + + case kEventWindowExpanded: + minimisedWindows.removeValue (windowRef); + handleMovedOrResized(); + break; // allow other handlers in the event chain to also get a look at the events + + case kEventWindowShown: + break; // allow other handlers in the event chain to also get a look at the events + + case kEventWindowClose: + if (! isSharedWindow) + handleUserClosingWindow(); + + return noErr; // (returning a notHandledErr would cause the OS to delete the window itself) + + default: + break; + } + + return eventNotHandledErr; + } + + OSStatus handleKeyEvent (EventRef theEvent, juce_wchar textCharacter) + { + updateModifiers (theEvent); + + UniChar unicodeChars [4]; + zeromem (unicodeChars, sizeof (unicodeChars)); + GetEventParameter (theEvent, kEventParamKeyUnicodes, typeUnicodeText, 0, sizeof (unicodeChars), 0, unicodeChars); + + int keyCode = (int) (unsigned int) unicodeChars[0]; + + UInt32 rawKey = 0; + GetEventParameter (theEvent, kEventParamKeyCode, typeUInt32, 0, sizeof (UInt32), 0, &rawKey); + + if ((currentModifiers & ModifierKeys::ctrlModifier) != 0) + { + if (keyCode >= 1 && keyCode <= 26) + keyCode += ('A' - 1); + } + + static const int keyTranslations[] = + { + 122, KeyPress::F1Key, 120, KeyPress::F2Key, + 99, KeyPress::F3Key, 118, KeyPress::F4Key, + 96, KeyPress::F5Key, 97, KeyPress::F6Key, + 98, KeyPress::F7Key, 100, KeyPress::F8Key, + 101, KeyPress::F9Key, 109, KeyPress::F10Key, + 103, KeyPress::F11Key, 111, KeyPress::F12Key, + 105, KeyPress::F13Key, 107, KeyPress::F14Key, + 113, KeyPress::F15Key, 106, KeyPress::F16Key, + 36, KeyPress::returnKey, 51, KeyPress::backspaceKey, + 123, KeyPress::leftKey, 124, KeyPress::rightKey, + 126, KeyPress::upKey, 125, KeyPress::downKey, + 115, KeyPress::homeKey, 119, KeyPress::endKey, + 116, KeyPress::pageUpKey, 121, KeyPress::pageDownKey, + 76, KeyPress::returnKey, + 82, KeyPress::numberPad0, 83, KeyPress::numberPad1, + 84, KeyPress::numberPad2, 85, KeyPress::numberPad3, + 86, KeyPress::numberPad4, 87, KeyPress::numberPad5, + 88, KeyPress::numberPad6, 89, KeyPress::numberPad7, + 91, KeyPress::numberPad8, 92, KeyPress::numberPad9, + 65, KeyPress::numberPadDecimalPoint, 78, KeyPress::numberPadSubtract, + 67, KeyPress::numberPadMultiply, 75, KeyPress::numberPadDivide, + 69, KeyPress::numberPadAdd, + 0 + }; + + const int* kt = keyTranslations; + + while (*kt != 0) + { + if ((int) rawKey == *kt) + { + keyCode = *++kt; + break; + } + + kt += 2; + } + + static juce_wchar lastTextCharacter = 0; + + switch (GetEventKind (theEvent)) + { + case kEventRawKeyDown: + keysCurrentlyDown.addIfNotAlreadyThere ((void*) keyCode); + handleKeyUpOrDown(); + lastTextCharacter = textCharacter; + handleKeyPress (keyCode, textCharacter); + break; + + case kEventRawKeyUp: + keysCurrentlyDown.removeValue ((void*) keyCode); + handleKeyUpOrDown(); + lastTextCharacter = 0; + break; + + case kEventRawKeyRepeat: + handleKeyPress (keyCode, lastTextCharacter); + break; + + case kEventRawKeyModifiersChanged: + handleModifierKeysChange(); + break; + + default: + jassertfalse + break; + } + + return noErr; + } + + OSStatus handleTextInputEvent (EventRef theEvent) + { + UniChar uc; + GetEventParameter (theEvent, kEventParamTextInputSendText, typeUnicodeText, 0, sizeof (uc), 0, &uc); + + EventRef originalEvent; + GetEventParameter (theEvent, kEventParamTextInputSendKeyboardEvent, typeEventRef, 0, sizeof (originalEvent), 0, &originalEvent); + + handleKeyEvent (originalEvent, (juce_wchar) uc); + + return noErr; + } + + OSStatus handleMouseEvent (EventHandlerCallRef callRef, EventRef theEvent) + { + MouseCheckTimer::getInstance()->moved (this); + + ::Point where; + GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, 0, sizeof (::Point), 0, &where); + int x = where.h; + int y = where.v; + globalPositionToRelative (x, y); + + int64 time = getEventTime (theEvent); + + switch (GetEventKind (theEvent)) + { + case kEventMouseMoved: + MouseCheckTimer::getInstance()->hasEverHadAMouseMove = true; + updateModifiers (theEvent); + handleMouseMove (x, y, time); + break; + + case kEventMouseDragged: + updateModifiers (theEvent); + handleMouseDrag (x, y, time); + break; + + case kEventMouseDown: + { + if (! Process::isForegroundProcess()) + { + ProcessSerialNumber psn; + GetCurrentProcess (&psn); + SetFrontProcess (&psn); + + toFront (true); + } + +#if JUCE_QUICKTIME + { + long mods; + GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, 0, sizeof (mods), 0, &mods); + + ::Point where; + GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, 0, sizeof (::Point), 0, &where); + + OfferMouseClickToQuickTime (windowRef, where, EventTimeToTicks (GetEventTime (theEvent)), mods, component); + } +#endif + + if (component->isBroughtToFrontOnMouseClick() + && ! component->isCurrentlyBlockedByAnotherModalComponent()) + { + //ActivateWindow (windowRef, true); + SelectWindow (windowRef); + } + + EventMouseButton button; + GetEventParameter (theEvent, kEventParamMouseButton, typeMouseButton, 0, sizeof (EventMouseButton), 0, &button); + + // need to clear all these flags because sometimes the mac can swallow (right) mouse-up events and + // this makes a button get stuck down. Since there's no other way to tell what buttons are down, + // this is all I can think of doing about it.. + currentModifiers &= ~(ModifierKeys::leftButtonModifier | ModifierKeys::rightButtonModifier | ModifierKeys::middleButtonModifier); + + if (button == kEventMouseButtonPrimary) + currentModifiers |= ModifierKeys::leftButtonModifier; + else if (button == kEventMouseButtonSecondary) + currentModifiers |= ModifierKeys::rightButtonModifier; + else if (button == kEventMouseButtonTertiary) + currentModifiers |= ModifierKeys::middleButtonModifier; + + updateModifiers (theEvent); + + juce_currentMouseTrackingPeer = this; // puts the message dispatcher into mouse-tracking mode.. + handleMouseDown (x, y, time); + break; + } + + case kEventMouseUp: + { + const int oldModifiers = currentModifiers; + + EventMouseButton button; + GetEventParameter (theEvent, kEventParamMouseButton, typeMouseButton, 0, sizeof (EventMouseButton), 0, &button); + + if (button == kEventMouseButtonPrimary) + currentModifiers &= ~ModifierKeys::leftButtonModifier; + else if (button == kEventMouseButtonSecondary) + currentModifiers &= ~ModifierKeys::rightButtonModifier; + + updateModifiers (theEvent); + + handleMouseUp (oldModifiers, x, y, time); + juce_currentMouseTrackingPeer = 0; + break; + } + + case kEventMouseWheelMoved: + { + EventMouseWheelAxis axis; + GetEventParameter (theEvent, kEventParamMouseWheelAxis, typeMouseWheelAxis, 0, sizeof (axis), 0, &axis); + + SInt32 delta; + GetEventParameter (theEvent, kEventParamMouseWheelDelta, + typeLongInteger, 0, sizeof (delta), 0, &delta); + + updateModifiers (theEvent); + + handleMouseWheel (axis == kEventMouseWheelAxisX ? delta * 10 : 0, + axis == kEventMouseWheelAxisX ? 0 : delta * 10, + time); + + break; + } + } + + return noErr; + } + + OSStatus handleDragAndDrop (EventRef theEvent) + { + DragRef dragRef; + if (GetEventParameter (theEvent, kEventParamDragRef, typeDragRef, 0, sizeof (dragRef), 0, &dragRef) == noErr) + { + int mx, my; + component->getMouseXYRelative (mx, my); + + UInt16 numItems = 0; + if (CountDragItems (dragRef, &numItems) == noErr) + { + StringArray filenames; + + for (int i = 0; i < (int) numItems; ++i) + { + DragItemRef ref; + + if (GetDragItemReferenceNumber (dragRef, i + 1, &ref) == noErr) + { + const FlavorType flavorType = kDragFlavorTypeHFS; + + Size size = 0; + if (GetFlavorDataSize (dragRef, ref, flavorType, &size) == noErr) + { + void* data = juce_calloc (size); + + if (GetFlavorData (dragRef, ref, flavorType, data, &size, 0) == noErr) + { + HFSFlavor* f = (HFSFlavor*) data; + FSRef fsref; + + if (FSpMakeFSRef (&f->fileSpec, &fsref) == noErr) + { + const String path (PlatformUtilities::makePathFromFSRef (&fsref)); + + if (path.isNotEmpty()) + filenames.add (path); + } + } + + juce_free (data); + } + } + } + + filenames.trim(); + filenames.removeEmptyStrings(); + + if (filenames.size() > 0) + handleFilesDropped (mx, my, filenames); + } + } + + return noErr; + } + + void resizeViewToFitWindow() + { + HIRect r; + + if (isSharedWindow) + { + HIViewGetFrame (viewRef, &r); + r.size.width = (float) component->getWidth(); + r.size.height = (float) component->getHeight(); + } + else + { + r.origin.x = 0; + r.origin.y = 0; + + Rect w; + GetWindowBounds (windowRef, windowRegionToUse, &w); + + r.size.width = (float) (w.right - w.left); + r.size.height = (float) (w.bottom - w.top); + } + + HIViewSetFrame (viewRef, &r); + +#if MACOS_10_3_OR_EARLIER + component->repaint(); +#endif + } + + OSStatus hiViewDraw (EventRef theEvent) + { + CGContextRef context = 0; + GetEventParameter (theEvent, kEventParamCGContextRef, typeCGContextRef, 0, sizeof (CGContextRef), 0, &context); + + CGrafPtr oldPort; + CGrafPtr port = 0; + + if (context == 0) + { + GetEventParameter (theEvent, kEventParamGrafPort, typeGrafPtr, 0, sizeof (CGrafPtr), 0, &port); + + GetPort (&oldPort); + SetPort (port); + + if (port != 0) + QDBeginCGContext (port, &context); + + if (! isCompositingWindow) + { + Rect bounds; + GetWindowBounds (windowRef, windowRegionToUse, &bounds); + CGContextTranslateCTM (context, 0, bounds.bottom - bounds.top); + CGContextScaleCTM (context, 1.0, -1.0); + } + + if (isSharedWindow) + { + // NB - Had terrible problems trying to correctly get the position + // of this view relative to the window, and this seems wrong, but + // works better than any other method I've tried.. + HIRect hiViewPos; + HIViewGetFrame (viewRef, &hiViewPos); + CGContextTranslateCTM (context, hiViewPos.origin.x, hiViewPos.origin.y); + } + } + +#if MACOS_10_2_OR_EARLIER + RgnHandle rgn = 0; + GetEventParameter (theEvent, kEventParamRgnHandle, typeQDRgnHandle, 0, sizeof (RgnHandle), 0, &rgn); + + CGRect clip; + + if (rgn != 0) + { + Rect bounds; + GetRegionBounds (rgn, &bounds); + clip.origin.x = bounds.left; + clip.origin.y = bounds.top; + clip.size.width = bounds.right - bounds.left; + clip.size.height = bounds.bottom - bounds.top; + } + else + { + HIViewGetBounds (viewRef, &clip); + } +#else + CGRect clip (CGContextGetClipBoundingBox (context)); +#endif + + clip = CGRectIntegral (clip); + + if (clip.origin.x < 0) + { + clip.size.width += clip.origin.x; + clip.origin.x = 0; + } + + if (clip.origin.y < 0) + { + clip.size.height += clip.origin.y; + clip.origin.y = 0; + } + + if (! component->isOpaque()) + CGContextClearRect (context, clip); + + repainter->paint (context, + (int) clip.origin.x, (int) clip.origin.y, + (int) clip.size.width, (int) clip.size.height); + + if (port != 0) + { + CGContextFlush (context); + QDEndCGContext (port, &context); + + SetPort (oldPort); + } + + repainter->repaintAnyRemainingRegions(); + + return noErr; + } + + static pascal OSStatus handleWindowEvent (EventHandlerCallRef callRef, EventRef theEvent, void* userData) + { + MessageManager::delayWaitCursor(); + + HIViewComponentPeer* const peer = (HIViewComponentPeer*) userData; + + const MessageManagerLock messLock; + + if (ComponentPeer::isValidPeer (peer)) + return peer->handleWindowEventForPeer (callRef, theEvent); + + return eventNotHandledErr; + } + + OSStatus handleWindowEventForPeer (EventHandlerCallRef callRef, EventRef theEvent) + { + switch (GetEventClass (theEvent)) + { + case kEventClassMouse: + { + static HIViewComponentPeer* lastMouseDownPeer = 0; + + const UInt32 eventKind = GetEventKind (theEvent); + HIViewRef view = 0; + + if (eventKind == kEventMouseDragged) + { + view = viewRef; + } + else + { + HIViewGetViewForMouseEvent (HIViewGetRoot (windowRef), theEvent, &view); + + if (view != viewRef) + { + if ((eventKind == kEventMouseUp + || eventKind == kEventMouseExited) + && ComponentPeer::isValidPeer (lastMouseDownPeer)) + { + return lastMouseDownPeer->handleMouseEvent (callRef, theEvent); + } + + return eventNotHandledErr; + } + } + + if (eventKind == kEventMouseDown + || eventKind == kEventMouseDragged + || eventKind == kEventMouseEntered) + { + lastMouseDownPeer = this; + } + + return handleMouseEvent (callRef, theEvent); + } + break; + + case kEventClassWindow: + return handleWindowClassEvent (theEvent); + + case kEventClassKeyboard: + if (isFocused()) + return handleKeyEvent (theEvent, 0); + + break; + + case kEventClassTextInput: + if (isFocused()) + return handleTextInputEvent (theEvent); + + break; + + default: + break; + } + + return eventNotHandledErr; + } + + static pascal OSStatus hiViewEventHandler (EventHandlerCallRef myHandler, EventRef theEvent, void* userData) + { + MessageManager::delayWaitCursor(); + + const UInt32 eventKind = GetEventKind (theEvent); + const UInt32 eventClass = GetEventClass (theEvent); + + if (eventClass == kEventClassHIObject) + { + switch (eventKind) + { + case kEventHIObjectConstruct: + { + void* data = juce_calloc (sizeof (void*)); + SetEventParameter (theEvent, kEventParamHIObjectInstance, + typeVoidPtr, sizeof (void*), &data); + + return noErr; + } + + case kEventHIObjectInitialize: + GetEventParameter (theEvent, 'peer', typeVoidPtr, 0, sizeof (void*), 0, (void**) userData); + return noErr; + + case kEventHIObjectDestruct: + juce_free (userData); + return noErr; + + default: + break; + } + } + else if (eventClass == kEventClassControl) + { + HIViewComponentPeer* const peer = *(HIViewComponentPeer**) userData; + const MessageManagerLock messLock; + + if (! ComponentPeer::isValidPeer (peer)) + return eventNotHandledErr; + + switch (eventKind) + { + case kEventControlDraw: + return peer->hiViewDraw (theEvent); + + case kEventControlBoundsChanged: + { + HIRect bounds; + HIViewGetBounds (peer->viewRef, &bounds); + peer->repaint (0, 0, roundFloatToInt (bounds.size.width), roundFloatToInt (bounds.size.height)); + + peer->handleMovedOrResized(); + return noErr; + } + + case kEventControlHitTest: + { + HIPoint where; + GetEventParameter (theEvent, kEventParamMouseLocation, typeHIPoint, 0, sizeof (HIPoint), 0, &where); + + HIRect bounds; + HIViewGetBounds (peer->viewRef, &bounds); + + ControlPartCode part = kControlNoPart; + + if (CGRectContainsPoint (bounds, where)) + part = 1; + + SetEventParameter (theEvent, kEventParamControlPart, typeControlPartCode, sizeof (ControlPartCode), &part); + return noErr; + } + break; + + case kEventControlSetFocusPart: + { + ControlPartCode desiredFocus; + if (GetEventParameter (theEvent, kEventParamControlPart, typeControlPartCode, 0, sizeof (ControlPartCode), 0, &desiredFocus) != noErr) + break; + + if (desiredFocus == kControlNoPart) + peer->viewFocusLoss(); + else + peer->viewFocusGain(); + + return noErr; + } + break; + + case kEventControlDragEnter: + { +#if MACOS_10_2_OR_EARLIER + enum { kEventParamControlWouldAcceptDrop = 'cldg' }; +#endif + Boolean accept = true; + SetEventParameter (theEvent, kEventParamControlWouldAcceptDrop, typeBoolean, sizeof (accept), &accept); + return noErr; + } + + case kEventControlDragWithin: + return noErr; + + case kEventControlDragReceive: + return peer->handleDragAndDrop (theEvent); + + case kEventControlOwningWindowChanged: + return peer->ownerWindowChanged (theEvent); + +#if ! MACOS_10_2_OR_EARLIER + case kEventControlGetFrameMetrics: + { + CallNextEventHandler (myHandler, theEvent); + HIViewFrameMetrics metrics; + GetEventParameter (theEvent, kEventParamControlFrameMetrics, typeControlFrameMetrics, 0, sizeof (metrics), 0, &metrics); + metrics.top = metrics.bottom = 0; + SetEventParameter (theEvent, kEventParamControlFrameMetrics, typeControlFrameMetrics, sizeof (metrics), &metrics); + return noErr; + } +#endif + + case kEventControlInitialize: + { + UInt32 features = kControlSupportsDragAndDrop + | kControlSupportsFocus + | kControlHandlesTracking + | kControlSupportsEmbedding + | (1 << 8) /*kHIViewFeatureGetsFocusOnClick*/; + + SetEventParameter (theEvent, kEventParamControlFeatures, typeUInt32, sizeof (UInt32), &features); + return noErr; + } + + default: + break; + } + } + + return eventNotHandledErr; + } + + WindowRef createNewWindow (const int windowStyleFlags) + { + jassert (windowRef == 0); + + static ToolboxObjectClassRef customWindowClass = 0; + + if (customWindowClass == 0) + { + // Register our window class + const EventTypeSpec customTypes[] = { { kEventClassWindow, kEventWindowDrawFrame } }; + + UnsignedWide t; + Microseconds (&t); + const String randomString ((int) (t.lo & 0x7ffffff)); + const String juceWindowClassName (T("JUCEWindowClass_") + randomString); + CFStringRef juceWindowClassNameCFString = PlatformUtilities::juceStringToCFString (juceWindowClassName); + + RegisterToolboxObjectClass (juceWindowClassNameCFString, + 0, 1, customTypes, + NewEventHandlerUPP (handleFrameRepaintEvent), + 0, &customWindowClass); + + CFRelease (juceWindowClassNameCFString); + } + + Rect pos; + pos.left = getComponent()->getX(); + pos.top = getComponent()->getY(); + pos.right = getComponent()->getRight(); + pos.bottom = getComponent()->getBottom(); + + int attributes = kWindowStandardHandlerAttribute | kWindowCompositingAttribute; + if ((windowStyleFlags & windowHasDropShadow) == 0) + attributes |= kWindowNoShadowAttribute; + + if ((windowStyleFlags & windowIgnoresMouseClicks) != 0) + attributes |= kWindowIgnoreClicksAttribute; + +#if ! MACOS_10_3_OR_EARLIER + if ((windowStyleFlags & windowIsTemporary) != 0) + attributes |= kWindowDoesNotCycleAttribute; +#endif + + WindowRef newWindow = 0; + + if ((windowStyleFlags & windowHasTitleBar) == 0) + { + attributes |= kWindowCollapseBoxAttribute; + + WindowDefSpec customWindowSpec; + customWindowSpec.defType = kWindowDefObjectClass; + customWindowSpec.u.classRef = customWindowClass; + + CreateCustomWindow (&customWindowSpec, + ((windowStyleFlags & windowIsTemporary) != 0) ? kUtilityWindowClass : + (getComponent()->isAlwaysOnTop() ? kUtilityWindowClass + : kDocumentWindowClass), + attributes, + &pos, + &newWindow); + } + else + { + if ((windowStyleFlags & windowHasCloseButton) != 0) + attributes |= kWindowCloseBoxAttribute; + + if ((windowStyleFlags & windowHasMinimiseButton) != 0) + attributes |= kWindowCollapseBoxAttribute; + + if ((windowStyleFlags & windowHasMaximiseButton) != 0) + attributes |= kWindowFullZoomAttribute; + + if ((windowStyleFlags & windowIsResizable) != 0) + attributes |= kWindowResizableAttribute | kWindowLiveResizeAttribute; + + CreateNewWindow (kDocumentWindowClass, attributes, &pos, &newWindow); + } + + jassert (newWindow != 0); + if (newWindow != 0) + { + HideWindow (newWindow); + + SetAutomaticControlDragTrackingEnabledForWindow (newWindow, true); + + if (! getComponent()->isOpaque()) + SetWindowAlpha (newWindow, 0.9999999f); // to fool it into giving the window an alpha-channel + } + + return newWindow; + } + + OSStatus ownerWindowChanged (EventRef theEvent) + { + WindowRef newWindow = 0; + GetEventParameter (theEvent, kEventParamControlCurrentOwningWindow, typeWindowRef, 0, sizeof (newWindow), 0, &newWindow); + + if (windowRef != newWindow) + { + if (eventHandlerRef != 0) + { + RemoveEventHandler (eventHandlerRef); + eventHandlerRef = 0; + } + + windowRef = newWindow; + + if (windowRef != 0) + { + const EventTypeSpec eventTypes[] = + { + { kEventClassWindow, kEventWindowBoundsChanged }, + { kEventClassWindow, kEventWindowBoundsChanging }, + { kEventClassWindow, kEventWindowFocusAcquired }, + { kEventClassWindow, kEventWindowFocusRelinquish }, + { kEventClassWindow, kEventWindowCollapsed }, + { kEventClassWindow, kEventWindowExpanded }, + { kEventClassWindow, kEventWindowShown }, + { kEventClassWindow, kEventWindowClose }, + { kEventClassMouse, kEventMouseDown }, + { kEventClassMouse, kEventMouseUp }, + { kEventClassMouse, kEventMouseMoved }, + { kEventClassMouse, kEventMouseDragged }, + { kEventClassMouse, kEventMouseEntered }, + { kEventClassMouse, kEventMouseExited }, + { kEventClassMouse, kEventMouseWheelMoved }, + //{ kEventClassKeyboard, kEventRawKeyDown }, + { kEventClassKeyboard, kEventRawKeyUp }, + { kEventClassKeyboard, kEventRawKeyRepeat }, + { kEventClassKeyboard, kEventRawKeyModifiersChanged }, + { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } + }; + + static EventHandlerUPP handleWindowEventUPP = 0; + + if (handleWindowEventUPP == 0) + handleWindowEventUPP = NewEventHandlerUPP (handleWindowEvent); + + InstallWindowEventHandler (windowRef, handleWindowEventUPP, + GetEventTypeCount (eventTypes), eventTypes, + (void*) this, (EventHandlerRef*) &eventHandlerRef); + + WindowAttributes attributes; + GetWindowAttributes (windowRef, &attributes); + +#if MACOS_10_3_OR_EARLIER + isCompositingWindow = ((attributes & kWindowCompositingAttribute) != 0); +#else + isCompositingWindow = HIViewIsCompositingEnabled (viewRef); +#endif + + MouseCheckTimer::getInstance()->resetMouseMoveChecker(); + } + } + + resizeViewToFitWindow(); + return noErr; + } + + void createNewHIView() + { + jassert (viewRef == 0); + + if (viewClassRef == 0) + { + // Register our HIView class + EventTypeSpec viewEvents[] = + { + { kEventClassHIObject, kEventHIObjectConstruct }, + { kEventClassHIObject, kEventHIObjectInitialize }, + { kEventClassHIObject, kEventHIObjectDestruct }, + { kEventClassControl, kEventControlInitialize }, + { kEventClassControl, kEventControlDraw }, + { kEventClassControl, kEventControlBoundsChanged }, + { kEventClassControl, kEventControlSetFocusPart }, + { kEventClassControl, kEventControlHitTest }, + { kEventClassControl, kEventControlDragEnter }, + { kEventClassControl, kEventControlDragWithin }, + { kEventClassControl, kEventControlDragReceive }, + { kEventClassControl, kEventControlOwningWindowChanged } + }; + + UnsignedWide t; + Microseconds (&t); + const String randomString ((int) (t.lo & 0x7ffffff)); + const String juceHiViewClassName (T("JUCEHIViewClass_") + randomString); + juceHiViewClassNameCFString = PlatformUtilities::juceStringToCFString (juceHiViewClassName); + + HIObjectRegisterSubclass (juceHiViewClassNameCFString, + kHIViewClassID, 0, + NewEventHandlerUPP (hiViewEventHandler), + GetEventTypeCount (viewEvents), + viewEvents, 0, + &viewClassRef); + } + + EventRef event; + CreateEvent (0, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), kEventAttributeNone, &event); + + void* thisPointer = this; + SetEventParameter (event, 'peer', typeVoidPtr, sizeof (void*), &thisPointer); + + HIObjectCreate (juceHiViewClassNameCFString, event, (HIObjectRef*) &viewRef); + + SetControlDragTrackingEnabled (viewRef, true); + + if (isSharedWindow) + { + setBounds (component->getX(), component->getY(), + component->getWidth(), component->getHeight(), false); + } + } +}; + +bool juce_isHIViewCreatedByJuce (HIViewRef view) +{ + return juceHiViewClassNameCFString != 0 + && HIObjectIsOfClass ((HIObjectRef) view, juceHiViewClassNameCFString); +} + +static void trackNextMouseEvent() +{ + UInt32 mods; + MouseTrackingResult result; + ::Point where; + + if (TrackMouseLocationWithOptions ((GrafPtr) -1, 0, 0.01, //kEventDurationForever, + &where, &mods, &result) != noErr + || ! ComponentPeer::isValidPeer (juce_currentMouseTrackingPeer)) + { + juce_currentMouseTrackingPeer = 0; + return; + } + + if (result == kMouseTrackingTimedOut) + return; + +#if MACOS_10_3_OR_EARLIER + const int x = where.h - juce_currentMouseTrackingPeer->getScreenX(); + const int y = where.v - juce_currentMouseTrackingPeer->getScreenY(); +#else + HIPoint p; + p.x = where.h; + p.y = where.v; + HIPointConvert (&p, kHICoordSpaceScreenPixel, 0, + kHICoordSpaceView, ((HIViewComponentPeer*) juce_currentMouseTrackingPeer)->viewRef); + const int x = p.x; + const int y = p.y; +#endif + + if (result == kMouseTrackingMouseDragged) + { + updateModifiers (0); + juce_currentMouseTrackingPeer->handleMouseDrag (x, y, getEventTime (0)); + + if (! ComponentPeer::isValidPeer (juce_currentMouseTrackingPeer)) + { + juce_currentMouseTrackingPeer = 0; + return; + } + } + else if (result == kMouseTrackingMouseUp + || result == kMouseTrackingUserCancelled + || result == kMouseTrackingMouseMoved) + { + if (ComponentPeer::isValidPeer (juce_currentMouseTrackingPeer)) + { + const int oldModifiers = currentModifiers; + currentModifiers &= ~(ModifierKeys::leftButtonModifier | ModifierKeys::rightButtonModifier | ModifierKeys::middleButtonModifier); + updateModifiers (0); + + juce_currentMouseTrackingPeer->handleMouseUp (oldModifiers, x, y, getEventTime (0)); + } + + juce_currentMouseTrackingPeer = 0; + } +} + +bool juce_dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) +{ + if (juce_currentMouseTrackingPeer != 0) + trackNextMouseEvent(); + + EventRef theEvent; + + if (ReceiveNextEvent (0, 0, (returnIfNoPendingMessages) ? kEventDurationNoWait + : kEventDurationForever, + true, &theEvent) == noErr) + { + if (GetEventClass (theEvent) == kEventClassAppleEvent) + { + EventRecord eventRec; + if (ConvertEventRefToEventRecord (theEvent, &eventRec)) + AEProcessAppleEvent (&eventRec); + } + else + { + EventTargetRef theTarget = GetEventDispatcherTarget(); + SendEventToEventTarget (theEvent, theTarget); + } + + ReleaseEvent (theEvent); + return true; + } + + return false; +} + +//============================================================================== +ComponentPeer* Component::createNewPeer (int styleFlags, void* windowToAttachTo) +{ + return new HIViewComponentPeer (this, styleFlags, (HIViewRef) windowToAttachTo); +} + +//============================================================================== +void MouseCheckTimer::timerCallback() +{ + if (ModifierKeys::getCurrentModifiersRealtime().isAnyMouseButtonDown()) + return; + + if (Process::isForegroundProcess()) + { + bool stillOver = false; + int x = 0, y = 0, w = 0, h = 0; + int mx = 0, my = 0; + const bool validWindow = ComponentPeer::isValidPeer (lastPeerUnderMouse); + + if (validWindow) + { + lastPeerUnderMouse->getBounds (x, y, w, h, true); + Desktop::getMousePosition (mx, my); + + stillOver = (mx >= x && my >= y && mx < x + w && my < y + h); + + if (stillOver) + { + // check if it's over an embedded HIView + int rx = mx, ry = my; + lastPeerUnderMouse->globalPositionToRelative (rx, ry); + HIPoint hipoint; + hipoint.x = rx; + hipoint.y = ry; + + HIViewRef root; + GetRootControl ((WindowRef) lastPeerUnderMouse->getNativeHandle(), &root); + + HIViewRef hitview; + if (HIViewGetSubviewHit (root, &hipoint, true, &hitview) == noErr && hitview != 0) + { + stillOver = HIObjectIsOfClass ((HIObjectRef) hitview, juceHiViewClassNameCFString); + } + } + } + + if (! stillOver) + { + // mouse is outside our windows so set a normal cursor (only + // if we're running as an app, not a plugin) + if (JUCEApplication::getInstance() != 0) + SetThemeCursor (kThemeArrowCursor); + + if (validWindow) + lastPeerUnderMouse->handleMouseExit (mx - x, my - y, Time::currentTimeMillis()); + + if (hasEverHadAMouseMove) + stopTimer(); + } + + if ((! hasEverHadAMouseMove) && validWindow + && (mx != lastX || my != lastY)) + { + lastX = mx; + lastY = my; + + if (stillOver) + lastPeerUnderMouse->handleMouseMove (mx - x, my - y, Time::currentTimeMillis()); + } + } +} + +//============================================================================== +// called from juce_Messaging.cpp +void juce_HandleProcessFocusChange() +{ + keysCurrentlyDown.clear(); + + if (HIViewComponentPeer::isValidPeer (currentlyFocusedPeer)) + { + if (Process::isForegroundProcess()) + currentlyFocusedPeer->handleFocusGain(); + else + currentlyFocusedPeer->handleFocusLoss(); + } +} + +static bool performDrag (DragRef drag) +{ + EventRecord event; + event.what = mouseDown; + event.message = 0; + event.when = TickCount(); + + int x, y; + Desktop::getMousePosition (x, y); + event.where.h = x; + event.where.v = y; + + event.modifiers = GetCurrentKeyModifiers(); + + RgnHandle rgn = NewRgn(); + RgnHandle rgn2 = NewRgn(); + SetRectRgn (rgn, + event.where.h - 8, event.where.v - 8, + event.where.h + 8, event.where.v + 8); + CopyRgn (rgn, rgn2); + InsetRgn (rgn2, 1, 1); + DiffRgn (rgn, rgn2, rgn); + DisposeRgn (rgn2); + + bool result = TrackDrag (drag, &event, rgn) == noErr; + + DisposeRgn (rgn); + return result; +} + +bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMoveFiles) +{ + for (int i = ComponentPeer::getNumPeers(); --i >= 0;) + ComponentPeer::getPeer (i)->performAnyPendingRepaintsNow(); + + DragRef drag; + bool result = false; + + if (NewDrag (&drag) == noErr) + { + for (int i = 0; i < files.size(); ++i) + { + HFSFlavor hfsData; + + if (PlatformUtilities::makeFSSpecFromPath (&hfsData.fileSpec, files[i])) + { + FInfo info; + if (FSpGetFInfo (&hfsData.fileSpec, &info) == noErr) + { + hfsData.fileType = info.fdType; + hfsData.fileCreator = info.fdCreator; + hfsData.fdFlags = info.fdFlags; + + AddDragItemFlavor (drag, i + 1, kDragFlavorTypeHFS, &hfsData, sizeof (hfsData), 0); + result = true; + } + } + } + + SetDragAllowableActions (drag, canMoveFiles ? kDragActionAll + : kDragActionCopy, false); + + if (result) + result = performDrag (drag); + + DisposeDrag (drag); + } + + return result; +} + +bool DragAndDropContainer::performExternalDragDropOfText (const String& text) +{ + jassertfalse // not implemented! + return false; +} + + +//============================================================================== +bool Process::isForegroundProcess() +{ + ProcessSerialNumber psn, front; + GetCurrentProcess (&psn); + GetFrontProcess (&front); + + Boolean b; + return (SameProcess (&psn, &front, &b) == noErr) && b; +} + +//============================================================================== +bool Desktop::canUseSemiTransparentWindows() +{ + return true; +} + + +//============================================================================== +void Desktop::getMousePosition (int& x, int& y) +{ + CGrafPtr currentPort; + GetPort (¤tPort); + + if (! IsValidPort (currentPort)) + { + WindowRef front = FrontWindow(); + + if (front != 0) + { + SetPortWindowPort (front); + } + else + { + x = y = 0; + return; + } + } + + ::Point p; + GetMouse (&p); + LocalToGlobal (&p); + x = p.h; + y = p.v; + + SetPort (currentPort); +} + +void Desktop::setMousePosition (int x, int y) +{ + CGDirectDisplayID mainDisplayID = CGMainDisplayID(); + CGPoint pos = { x, y }; + CGDisplayMoveCursorToPoint (mainDisplayID, pos); +} + +const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() +{ + return ModifierKeys (currentModifiers); +} + +//============================================================================== +void juce_updateMultiMonitorInfo (Array & monitorCoords, const bool clipToWorkArea) +{ + int mainMon = 0; + int distFrom00 = 0x7fffff; + + GDHandle h = DMGetFirstScreenDevice (true); + + while (h != 0) + { + Rect rect; + + GetAvailableWindowPositioningBounds (h, &rect); + + const int dist = abs (rect.left) + abs (rect.top); + if (distFrom00 > dist) + { + distFrom00 = dist; + mainMon = monitorCoords.size(); + } + + monitorCoords.add (Rectangle (rect.left, + rect.top, + rect.right - rect.left, + rect.bottom - rect.top)); + + h = DMGetNextScreenDevice (h, true); + } + + // make sure the first in the list is the main monitor + if (mainMon > 0) + monitorCoords.swap (mainMon, 0); + + if (monitorCoords.size() == 0) + { + BitMap screenBits; + Rect r = GetQDGlobalsScreenBits (&screenBits)->bounds; + + monitorCoords.add (Rectangle (r.left, + r.top + GetMBarHeight(), + r.right - r.left, + r.bottom - r.top)); + } + + //xxx need to register for display change callbacks +} + +//============================================================================== +struct CursorWrapper +{ + Cursor* cursor; + ThemeCursor themeCursor; +}; + +void* juce_createMouseCursorFromImage (const Image& image, int hotspotX, int hotspotY) +{ + const int maxW = 16; + const int maxH = 16; + + const Image* im = ℑ + Image* newIm = 0; + + if (image.getWidth() > maxW || image.getHeight() > maxH) + { + im = newIm = image.createCopy (maxW, maxH); + + hotspotX = (hotspotX * maxW) / image.getWidth(); + hotspotY = (hotspotY * maxH) / image.getHeight(); + } + + Cursor* c = new Cursor(); + c->hotSpot.h = hotspotX; + c->hotSpot.v = hotspotY; + + for (int y = 0; y < maxH; ++y) + { + c->data[y] = 0; + c->mask[y] = 0; + + for (int x = 0; x < maxW; ++x) + { + const Colour pixelColour (im->getPixelAt (15 - x, y)); + + if (pixelColour.getAlpha() > 0.5f) + { + c->mask[y] |= (1 << x); + + if (pixelColour.getBrightness() < 0.5f) + c->data[y] |= (1 << x); + } + } + + c->data[y] = CFSwapInt16BigToHost (c->data[y]); + c->mask[y] = CFSwapInt16BigToHost (c->mask[y]); + } + + if (newIm != 0) + delete newIm; + + CursorWrapper* cw = new CursorWrapper(); + cw->cursor = c; + cw->themeCursor = kThemeArrowCursor; + return (void*)cw; +} + +static void* cursorFromData (const unsigned char* data, const int size, int hx, int hy) +{ + Image* const im = ImageFileFormat::loadFrom ((const char*) data, size); + jassert (im != 0); + void* curs = juce_createMouseCursorFromImage (*im, hx, hy); + delete im; + return curs; +} + +const unsigned int kSpecialNoCursor = 'nocr'; + +void* juce_createStandardMouseCursor (MouseCursor::StandardCursorType type) +{ + ThemeCursor id = kThemeArrowCursor; + + switch (type) + { + case MouseCursor::NormalCursor: + id = kThemeArrowCursor; + break; + + case MouseCursor::NoCursor: + id = kSpecialNoCursor; + break; + + case MouseCursor::DraggingHandCursor: + { + static unsigned char cursData[] = {71,73,70,56,57,97,16,0,16,0,145,2,0,0,0,0,255,255,255,0, + 0,0,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,52,148,47,0,200,185,16,130,90,12,74,139,107,84,123,39, + 132,117,151,116,132,146,248,60,209,138,98,22,203,114,34,236,37,52,77,217, + 247,154,191,119,110,240,193,128,193,95,163,56,60,234,98,135,2,0,59 }; + const int cursDataSize = 99; + + return cursorFromData (cursData, cursDataSize, 8, 8); + } + break; + + case MouseCursor::CopyingCursor: + id = kThemeCopyArrowCursor; + break; + + case MouseCursor::WaitCursor: + id = kThemeWatchCursor; + break; + + case MouseCursor::IBeamCursor: + id = kThemeIBeamCursor; + break; + + case MouseCursor::PointingHandCursor: + id = kThemePointingHandCursor; + break; + + case MouseCursor::LeftRightResizeCursor: + case MouseCursor::LeftEdgeResizeCursor: + case MouseCursor::RightEdgeResizeCursor: + { + static const unsigned char cursData[] = {71,73,70,56,57,97,16,0,16,0,145,0,0,255,255,255,0,0,0,255, + 255,255,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,38,148,143,169,203,237,15,19,0,106,202,64,111,22,32,224, + 9,78,30,213,121,230,121,146,99,8,142,71,183,189,152,20,27,86,132,231, + 58,83,0,0,59 }; + const int cursDataSize = 85; + + return cursorFromData (cursData, cursDataSize, 8, 8); + } + + case MouseCursor::UpDownResizeCursor: + case MouseCursor::TopEdgeResizeCursor: + case MouseCursor::BottomEdgeResizeCursor: + { + static const unsigned char cursData[] = {71,73,70,56,57,97,16,0,16,0,145,0,0,255,255,255,0,0,0,255, + 255,255,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,38,148,111,128,187,16,202,90,152,48,10,55,169,189,192,245, + 106,121,27,34,142,201,99,158,224,86,154,109,216,61,29,155,105,180,61,190, + 121,84,0,0,59 }; + const int cursDataSize = 85; + + return cursorFromData (cursData, cursDataSize, 8, 8); + } + + case MouseCursor::TopLeftCornerResizeCursor: + case MouseCursor::BottomRightCornerResizeCursor: + { + static const unsigned char cursData[] = {71,73,70,56,57,97,16,0,16,0,145,0,0,255,255,255,0,0,0,255, + 255,255,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,43,132,15,162,187,16,255,18,99,14,202,217,44,158,213,221, + 237,9,225,38,94,35,73,5,31,42,170,108,106,174,112,43,195,209,91,185, + 104,174,131,208,77,66,28,10,0,59 }; + const int cursDataSize = 90; + + return cursorFromData (cursData, cursDataSize, 8, 8); + } + + case MouseCursor::TopRightCornerResizeCursor: + case MouseCursor::BottomLeftCornerResizeCursor: + { + static const unsigned char cursData[] = {71,73,70,56,57,97,16,0,16,0,145,0,0,255,255,255,0,0,0,255, + 255,255,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,45,148,127,160,11,232,16,98,108,14,65,73,107,194,122,223, + 92,65,141,216,145,134,162,153,221,25,128,73,166,62,173,16,203,237,188,94, + 120,46,237,105,239,123,48,80,157,2,0,59 }; + const int cursDataSize = 92; + + return cursorFromData (cursData, cursDataSize, 8, 8); + } + + case MouseCursor::UpDownLeftRightResizeCursor: + { + static const unsigned char cursData[] = {71,73,70,56,57,97,15,0,15,0,145,0,0,0,0,0,255,255,255,0, + 128,128,255,255,255,33,249,4,1,0,0,3,0,44,0,0,0,0,15,0, + 15,0,0,2,46,156,63,129,139,1,202,26,152,48,186,73,109,114,65,85, + 195,37,143,88,93,29,215,101,23,198,178,30,149,158,25,56,134,97,179,61, + 158,213,126,203,234,99,220,34,56,70,1,0,59,0,0 }; + const int cursDataSize = 93; + + return cursorFromData (cursData, cursDataSize, 7, 7); + } + + case MouseCursor::CrosshairCursor: + id = kThemeCrossCursor; + break; + } + + CursorWrapper* cw = new CursorWrapper(); + cw->cursor = 0; + cw->themeCursor = id; + + return (void*) cw; +} + +void juce_deleteMouseCursor (void* cursorHandle, bool isStandard) +{ + CursorWrapper* cw = (CursorWrapper*)cursorHandle; + + if (cw != 0) + { + if (cw->cursor != 0) + delete cw->cursor; + + delete cw; + } +} + +void MouseCursor::showInAllWindows() const +{ + showInWindow (0); +} + +void MouseCursor::showInWindow (ComponentPeer*) const +{ + const CursorWrapper* const cw = (CursorWrapper*) getHandle(); + + if (cw != 0) + { + static bool isCursorHidden = false; + static bool showingWaitCursor = false; + const bool shouldShowWaitCursor = (cw->themeCursor == kThemeWatchCursor); + const bool shouldHideCursor = (cw->themeCursor == kSpecialNoCursor); + + if (shouldShowWaitCursor != showingWaitCursor + && Process::isForegroundProcess()) + { + showingWaitCursor = shouldShowWaitCursor; + QDDisplayWaitCursor (shouldShowWaitCursor); + } + + if (shouldHideCursor != isCursorHidden) + { + isCursorHidden = shouldHideCursor; + + if (shouldHideCursor) + HideCursor(); + else + ShowCursor(); + } + + if (cw->cursor != 0) + SetCursor (cw->cursor); + else if (! (shouldShowWaitCursor || shouldHideCursor)) + SetThemeCursor (cw->themeCursor); + } +} + +//============================================================================== +Image* juce_createIconForFile (const File& file) +{ + return 0; +} + + +//============================================================================== +class MainMenuHandler : private MenuBarModelListener, + private DeletedAtShutdown +{ +public: + MainMenuHandler() throw() + : currentModel (0) + { + } + + ~MainMenuHandler() throw() + { + setMenu (0); + } + + void setMenu (MenuBarModel* const newMenuBarModel) throw() + { + if (currentModel != newMenuBarModel) + { + if (currentModel != 0) + currentModel->removeListener (this); + + currentModel = newMenuBarModel; + + if (currentModel != 0) + currentModel->addListener (this); + + menuBarItemsChanged (0); + } + } + + void menuBarItemsChanged (MenuBarModel*) + { + ClearMenuBar(); + + if (currentModel != 0) + { + int id = 1000; + const StringArray menuNames (currentModel->getMenuBarNames()); + + for (int i = 0; i < menuNames.size(); ++i) + { + const PopupMenu menu (currentModel->getMenuForIndex (i, menuNames [i])); + + MenuRef m = createMenu (menu, menuNames [i], id); + + InsertMenu (m, 0); + CFRelease (m); + } + } + } + + void menuCommandInvoked (MenuBarModel*, const ApplicationCommandTarget::InvocationInfo& info) + { + MenuRef menu = 0; + MenuItemIndex index = 0; + GetIndMenuItemWithCommandID (0, info.commandID, 1, &menu, &index); + + FlashMenuBar (GetMenuID (menu)); + FlashMenuBar (GetMenuID (menu)); + } + + void invoke (const int id, ApplicationCommandManager* commandManager, const int topLevelIndex) const + { + if (currentModel != 0) + { + if (commandManager != 0) + { + ApplicationCommandTarget::InvocationInfo info (id); + info.invocationMethod = ApplicationCommandTarget::InvocationInfo::fromMenu; + + commandManager->invoke (info, true); + } + + currentModel->menuItemSelected (id, topLevelIndex); + } + } + + MenuBarModel* currentModel; + +private: + static MenuRef createMenu (const PopupMenu menu, + const String& menuName, + int& id) + { + MenuRef m = 0; + + if (CreateNewMenu (id++, kMenuAttrAutoDisable, &m) == noErr) + { + CFStringRef name = PlatformUtilities::juceStringToCFString (menuName); + SetMenuTitleWithCFString (m, name); + CFRelease (name); + + PopupMenu::MenuItemIterator iter (menu); + int topLevelIndex = 0; + + while (iter.next()) + { + MenuItemIndex index = 0; + + int flags = kMenuAttrAutoDisable | kMenuItemAttrIgnoreMeta | kMenuItemAttrNotPreviousAlternate; + if (! iter.isEnabled) + flags |= kMenuItemAttrDisabled; + + CFStringRef text = PlatformUtilities::juceStringToCFString (iter.itemName.upToFirstOccurrenceOf (T(""), false, true)); + + if (iter.isSeparator) + { + AppendMenuItemTextWithCFString (m, text, kMenuItemAttrSeparator, 0, &index); + } + else if (iter.isSectionHeader) + { + AppendMenuItemTextWithCFString (m, text, kMenuItemAttrSectionHeader, 0, &index); + } + else if (iter.subMenu != 0) + { + AppendMenuItemTextWithCFString (m, text, flags, id++, &index); + + MenuRef sub = createMenu (*iter.subMenu, iter.itemName, id); + SetMenuItemHierarchicalMenu (m, index, sub); + CFRelease (sub); + } + else + { + AppendMenuItemTextWithCFString (m, text, flags, iter.itemId, &index); + + if (iter.isTicked) + CheckMenuItem (m, index, true); + + SetMenuItemProperty (m, index, 'juce', 'apcm', sizeof (void*), &iter.commandManager); + SetMenuItemProperty (m, index, 'juce', 'topi', sizeof (int), &topLevelIndex); + + if (iter.commandManager != 0) + { + const Array keyPresses (iter.commandManager->getKeyMappings() + ->getKeyPressesAssignedToCommand (iter.itemId)); + + if (keyPresses.size() > 0) + { + const KeyPress& kp = keyPresses.getUnchecked(0); + int mods = 0; + + if (kp.getModifiers().isShiftDown()) + mods |= kMenuShiftModifier; + if (kp.getModifiers().isCtrlDown()) + mods |= kMenuControlModifier; + if (kp.getModifiers().isAltDown()) + mods |= kMenuOptionModifier; + if (! kp.getModifiers().isCommandDown()) + mods |= kMenuNoCommandModifier; + + tchar keyCode = (tchar) kp.getKeyCode(); + + if (kp.getKeyCode() >= KeyPress::numberPad0 + && kp.getKeyCode() <= KeyPress::numberPad9) + { + keyCode = (tchar) ((T('0') - KeyPress::numberPad0) + kp.getKeyCode()); + } + + if (CharacterFunctions::isLetterOrDigit (keyCode) + || CharacterFunctions::indexOfChar (T(",.;/\\'[]=-+_<>?{}\":"), keyCode, false) >= 0) + { + SetMenuItemModifiers (m, index, mods); + SetMenuItemCommandKey (m, index, false, CharacterFunctions::toUpperCase (keyCode)); + } + else + { + const SInt16 glyph = getGlyphForKeyCode (kp.getKeyCode()); + + if (glyph != 0) + { + SetMenuItemModifiers (m, index, mods); + SetMenuItemKeyGlyph (m, index, glyph); + } + } + + // if we set the key glyph to be a text char, and enable virtual + // key triggering, it stops the menu automatically triggering the callback + ChangeMenuItemAttributes (m, index, kMenuItemAttrUseVirtualKey, 0); + } + } + } + + CFRelease (text); + ++topLevelIndex; + } + } + + return m; + } + + static SInt16 getGlyphForKeyCode (const int keyCode) throw() + { + if (keyCode == KeyPress::spaceKey) + return kMenuSpaceGlyph; + else if (keyCode == KeyPress::returnKey) + return kMenuReturnGlyph; + else if (keyCode == KeyPress::escapeKey) + return kMenuEscapeGlyph; + else if (keyCode == KeyPress::backspaceKey) + return kMenuDeleteLeftGlyph; + else if (keyCode == KeyPress::leftKey) + return kMenuLeftArrowGlyph; + else if (keyCode == KeyPress::rightKey) + return kMenuRightArrowGlyph; + else if (keyCode == KeyPress::upKey) + return kMenuUpArrowGlyph; + else if (keyCode == KeyPress::downKey) + return kMenuDownArrowGlyph; + else if (keyCode == KeyPress::pageUpKey) + return kMenuPageUpGlyph; + else if (keyCode == KeyPress::pageDownKey) + return kMenuPageDownGlyph; + else if (keyCode == KeyPress::endKey) + return kMenuSoutheastArrowGlyph; + else if (keyCode == KeyPress::homeKey) + return kMenuNorthwestArrowGlyph; + else if (keyCode == KeyPress::deleteKey) + return kMenuDeleteRightGlyph; + else if (keyCode == KeyPress::tabKey) + return kMenuTabRightGlyph; + else if (keyCode == KeyPress::F1Key) + return kMenuF1Glyph; + else if (keyCode == KeyPress::F2Key) + return kMenuF2Glyph; + else if (keyCode == KeyPress::F3Key) + return kMenuF3Glyph; + else if (keyCode == KeyPress::F4Key) + return kMenuF4Glyph; + else if (keyCode == KeyPress::F5Key) + return kMenuF5Glyph; + else if (keyCode == KeyPress::F6Key) + return kMenuF6Glyph; + else if (keyCode == KeyPress::F7Key) + return kMenuF7Glyph; + else if (keyCode == KeyPress::F8Key) + return kMenuF8Glyph; + else if (keyCode == KeyPress::F9Key) + return kMenuF9Glyph; + else if (keyCode == KeyPress::F10Key) + return kMenuF10Glyph; + else if (keyCode == KeyPress::F11Key) + return kMenuF11Glyph; + else if (keyCode == KeyPress::F12Key) + return kMenuF12Glyph; + else if (keyCode == KeyPress::F13Key) + return kMenuF13Glyph; + else if (keyCode == KeyPress::F14Key) + return kMenuF14Glyph; + else if (keyCode == KeyPress::F15Key) + return kMenuF15Glyph; + + return 0; + } +}; + +static MainMenuHandler* mainMenu = 0; + +void MenuBarModel::setMacMainMenu (MenuBarModel* newMenuBarModel) throw() +{ + if (getMacMainMenu() != newMenuBarModel) + { + if (newMenuBarModel == 0) + { + deleteAndZero (mainMenu); + } + else + { + if (mainMenu == 0) + mainMenu = new MainMenuHandler(); + + mainMenu->setMenu (newMenuBarModel); + } + } +} + +MenuBarModel* MenuBarModel::getMacMainMenu() throw() +{ + return mainMenu != 0 ? mainMenu->currentModel : 0; +} + +// these functions are called externally from the message handling code +void juce_MainMenuAboutToBeUsed() +{ + // force an update of the items just before the menu appears.. + if (mainMenu != 0) + mainMenu->menuBarItemsChanged (0); +} + +void juce_InvokeMainMenuCommand (const HICommand& command) +{ + if (mainMenu != 0) + { + ApplicationCommandManager* commandManager = 0; + int topLevelIndex = 0; + + if (GetMenuItemProperty (command.menu.menuRef, command.menu.menuItemIndex, + 'juce', 'apcm', sizeof (commandManager), 0, &commandManager) == noErr + && GetMenuItemProperty (command.menu.menuRef, command.menu.menuItemIndex, + 'juce', 'topi', sizeof (topLevelIndex), 0, &topLevelIndex) == noErr) + { + mainMenu->invoke (command.commandID, commandManager, topLevelIndex); + } + } +} + +//============================================================================== +void PlatformUtilities::beep() +{ + SysBeep (30); +} + +//============================================================================== +void SystemClipboard::copyTextToClipboard (const String& text) +{ + ClearCurrentScrap(); + ScrapRef ref; + GetCurrentScrap (&ref); + + const int len = text.length(); + const int numBytes = sizeof (UniChar) * len; + UniChar* const temp = (UniChar*) juce_calloc (numBytes); + + for (int i = 0; i < len; ++i) + temp[i] = (UniChar) text[i]; + + PutScrapFlavor (ref, + kScrapFlavorTypeUnicode, + kScrapFlavorMaskNone, + numBytes, + temp); + + juce_free (temp); +} + +const String SystemClipboard::getTextFromClipboard() +{ + String result; + + ScrapRef ref; + GetCurrentScrap (&ref); + Size size = 0; + + if (GetScrapFlavorSize (ref, kScrapFlavorTypeUnicode, &size) == noErr + && size > 0) + { + void* const data = juce_calloc (size + 8); + + if (GetScrapFlavorData (ref, kScrapFlavorTypeUnicode, &size, data) == noErr) + { + result = PlatformUtilities::convertUTF16ToString ((UniChar*) data); + } + + juce_free (data); + } + + return result; +} + + +//============================================================================== +bool AlertWindow::showNativeDialogBox (const String& title, + const String& bodyText, + bool isOkCancel) +{ + Str255 tit, txt; + PlatformUtilities::copyToStr255 (tit, title); + PlatformUtilities::copyToStr255 (txt, bodyText); + + AlertStdAlertParamRec ar; + ar.movable = true; + ar.helpButton = false; + ar.filterProc = 0; + ar.defaultText = (const unsigned char*)-1; + ar.cancelText = (const unsigned char*)((isOkCancel) ? -1 : 0); + ar.otherText = 0; + ar.defaultButton = kAlertStdAlertOKButton; + ar.cancelButton = 0; + ar.position = kWindowDefaultPosition; + + SInt16 result; + StandardAlert (kAlertNoteAlert, tit, txt, &ar, &result); + return result == kAlertStdAlertOKButton; +} + +//============================================================================== +const int KeyPress::spaceKey = ' '; +const int KeyPress::returnKey = kReturnCharCode; +const int KeyPress::escapeKey = kEscapeCharCode; +const int KeyPress::backspaceKey = kBackspaceCharCode; +const int KeyPress::leftKey = kLeftArrowCharCode; +const int KeyPress::rightKey = kRightArrowCharCode; +const int KeyPress::upKey = kUpArrowCharCode; +const int KeyPress::downKey = kDownArrowCharCode; +const int KeyPress::pageUpKey = kPageUpCharCode; +const int KeyPress::pageDownKey = kPageDownCharCode; +const int KeyPress::endKey = kEndCharCode; +const int KeyPress::homeKey = kHomeCharCode; +const int KeyPress::deleteKey = kDeleteCharCode; +const int KeyPress::insertKey = -1; +const int KeyPress::tabKey = kTabCharCode; +const int KeyPress::F1Key = 0x10110; +const int KeyPress::F2Key = 0x10111; +const int KeyPress::F3Key = 0x10112; +const int KeyPress::F4Key = 0x10113; +const int KeyPress::F5Key = 0x10114; +const int KeyPress::F6Key = 0x10115; +const int KeyPress::F7Key = 0x10116; +const int KeyPress::F8Key = 0x10117; +const int KeyPress::F9Key = 0x10118; +const int KeyPress::F10Key = 0x10119; +const int KeyPress::F11Key = 0x1011a; +const int KeyPress::F12Key = 0x1011b; +const int KeyPress::F13Key = 0x1011c; +const int KeyPress::F14Key = 0x1011d; +const int KeyPress::F15Key = 0x1011e; +const int KeyPress::F16Key = 0x1011f; +const int KeyPress::numberPad0 = 0x30020; +const int KeyPress::numberPad1 = 0x30021; +const int KeyPress::numberPad2 = 0x30022; +const int KeyPress::numberPad3 = 0x30023; +const int KeyPress::numberPad4 = 0x30024; +const int KeyPress::numberPad5 = 0x30025; +const int KeyPress::numberPad6 = 0x30026; +const int KeyPress::numberPad7 = 0x30027; +const int KeyPress::numberPad8 = 0x30028; +const int KeyPress::numberPad9 = 0x30029; +const int KeyPress::numberPadAdd = 0x3002a; +const int KeyPress::numberPadSubtract = 0x3002b; +const int KeyPress::numberPadMultiply = 0x3002c; +const int KeyPress::numberPadDivide = 0x3002d; +const int KeyPress::numberPadSeparator = 0x3002e; +const int KeyPress::numberPadDecimalPoint = 0x3002f; +const int KeyPress::playKey = 0x30000; +const int KeyPress::stopKey = 0x30001; +const int KeyPress::fastForwardKey = 0x30002; +const int KeyPress::rewindKey = 0x30003; + +//============================================================================== +#if JUCE_OPENGL + +struct OpenGLContextInfo +{ + AGLContext renderContext; +}; + +void* juce_createOpenGLContext (OpenGLComponent* component, void* sharedContext) +{ + jassert (component != 0); + + HIViewComponentPeer* const peer = dynamic_cast (component->getTopLevelComponent()->getPeer()); + + if (peer == 0) + return 0; + + OpenGLContextInfo* const oc = new OpenGLContextInfo(); + + GLint attrib[] = { AGL_RGBA, AGL_DOUBLEBUFFER, + AGL_RED_SIZE, 8, + AGL_ALPHA_SIZE, 8, + AGL_DEPTH_SIZE, 24, + AGL_CLOSEST_POLICY, AGL_NO_RECOVERY, + AGL_SAMPLE_BUFFERS_ARB, 1, + AGL_SAMPLES_ARB, 4, + AGL_NONE }; + + oc->renderContext = aglCreateContext (aglChoosePixelFormat (0, 0, attrib), + (sharedContext != 0) ? ((OpenGLContextInfo*) sharedContext)->renderContext + : 0); + + aglSetDrawable (oc->renderContext, + GetWindowPort (peer->windowRef)); + + return oc; +} + +void juce_updateOpenGLWindowPos (void* context, Component* owner, Component* topComp) +{ + jassert (context != 0); + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + GLint bufferRect[4]; + + bufferRect[0] = owner->getScreenX() - topComp->getScreenX(); + bufferRect[1] = topComp->getHeight() - (owner->getHeight() + owner->getScreenY() - topComp->getScreenY()); + bufferRect[2] = owner->getWidth(); + bufferRect[3] = owner->getHeight(); + + aglSetInteger (oc->renderContext, AGL_BUFFER_RECT, bufferRect); + aglEnable (oc->renderContext, AGL_BUFFER_RECT); +} + +void juce_deleteOpenGLContext (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + aglDestroyContext (oc->renderContext); + + delete oc; +} + +bool juce_makeOpenGLContextCurrent (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + return aglSetCurrentContext ((oc != 0) ? oc->renderContext : 0); +} + +void juce_swapOpenGLBuffers (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + aglSwapBuffers (oc->renderContext); +} + +void juce_repaintOpenGLWindow (void* context) +{ +} + +#endif + +END_JUCE_NAMESPACE diff --git a/build/win32/devcpp/Makefile.win b/build/win32/devcpp/Makefile.win new file mode 100644 index 0000000000..6d51d35ee6 --- /dev/null +++ b/build/win32/devcpp/Makefile.win @@ -0,0 +1,979 @@ +# Project: juce +# Makefile created by Dev-C++ 4.9.9.2 + +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +RES = +OBJ = ../../../bin/intermediate_devcpp/juce_Logger.o ../../../bin/intermediate_devcpp/juce_Random.o ../../../bin/intermediate_devcpp/juce_RelativeTime.o ../../../bin/intermediate_devcpp/juce_SystemStats.o ../../../bin/intermediate_devcpp/juce_Time.o ../../../bin/intermediate_devcpp/juce_BitArray.o ../../../bin/intermediate_devcpp/juce_MemoryBlock.o ../../../bin/intermediate_devcpp/juce_BlowFish.o ../../../bin/intermediate_devcpp/juce_MD5.o ../../../bin/intermediate_devcpp/juce_Primes.o ../../../bin/intermediate_devcpp/juce_RSAKey.o ../../../bin/intermediate_devcpp/juce_InputStream.o ../../../bin/intermediate_devcpp/juce_OutputStream.o ../../../bin/intermediate_devcpp/juce_DirectoryIterator.o ../../../bin/intermediate_devcpp/juce_File.o ../../../bin/intermediate_devcpp/juce_FileInputStream.o ../../../bin/intermediate_devcpp/juce_FileOutputStream.o ../../../bin/intermediate_devcpp/juce_FileSearchPath.o ../../../bin/intermediate_devcpp/juce_URL.o ../../../bin/intermediate_devcpp/juce_BufferedInputStream.o ../../../bin/intermediate_devcpp/juce_GZIPCompressorOutputStream.o ../../../bin/intermediate_devcpp/juce_GZIPDecompressorInputStream.o ../../../bin/intermediate_devcpp/juce_MemoryInputStream.o ../../../bin/intermediate_devcpp/juce_MemoryOutputStream.o ../../../bin/intermediate_devcpp/juce_SubregionStream.o ../../../bin/intermediate_devcpp/juce_PerformanceCounter.o ../../../bin/intermediate_devcpp/juce_Uuid.o ../../../bin/intermediate_devcpp/juce_ZipFile.o ../../../bin/intermediate_devcpp/juce_String.o ../../../bin/intermediate_devcpp/juce_StringArray.o ../../../bin/intermediate_devcpp/juce_StringPairArray.o ../../../bin/intermediate_devcpp/juce_XmlDocument.o ../../../bin/intermediate_devcpp/juce_XmlElement.o ../../../bin/intermediate_devcpp/juce_InterProcessLock.o ../../../bin/intermediate_devcpp/juce_Thread.o ../../../bin/intermediate_devcpp/juce_ThreadPool.o ../../../bin/intermediate_devcpp/juce_Application.o ../../../bin/intermediate_devcpp/juce_DeletedAtShutdown.o ../../../bin/intermediate_devcpp/juce_AiffAudioFormat.o ../../../bin/intermediate_devcpp/juce_AudioCDReader.o ../../../bin/intermediate_devcpp/juce_AudioFormat.o ../../../bin/intermediate_devcpp/juce_AudioSubsectionReader.o ../../../bin/intermediate_devcpp/juce_WavAudioFormat.o ../../../bin/intermediate_devcpp/juce_ActionBroadcaster.o ../../../bin/intermediate_devcpp/juce_ActionListenerList.o ../../../bin/intermediate_devcpp/juce_AsyncUpdater.o ../../../bin/intermediate_devcpp/juce_ChangeBroadcaster.o ../../../bin/intermediate_devcpp/juce_ChangeListenerList.o ../../../bin/intermediate_devcpp/juce_Message.o ../../../bin/intermediate_devcpp/juce_MessageListener.o ../../../bin/intermediate_devcpp/juce_MessageManager.o ../../../bin/intermediate_devcpp/juce_Timer.o ../../../bin/intermediate_devcpp/juce_Brush.o ../../../bin/intermediate_devcpp/juce_GradientBrush.o ../../../bin/intermediate_devcpp/juce_ImageBrush.o ../../../bin/intermediate_devcpp/juce_SolidColourBrush.o ../../../bin/intermediate_devcpp/juce_Colour.o ../../../bin/intermediate_devcpp/juce_Colours.o ../../../bin/intermediate_devcpp/juce_EdgeTable.o ../../../bin/intermediate_devcpp/juce_Graphics.o ../../../bin/intermediate_devcpp/juce_Justification.o ../../../bin/intermediate_devcpp/juce_DropShadowEffect.o ../../../bin/intermediate_devcpp/juce_GlowEffect.o ../../../bin/intermediate_devcpp/juce_ReduceOpacityEffect.o ../../../bin/intermediate_devcpp/juce_Font.o ../../../bin/intermediate_devcpp/juce_GlyphArrangement.o ../../../bin/intermediate_devcpp/juce_TextLayout.o ../../../bin/intermediate_devcpp/juce_Typeface.o ../../../bin/intermediate_devcpp/juce_AffineTransform.o ../../../bin/intermediate_devcpp/juce_Line.o ../../../bin/intermediate_devcpp/juce_Path.o ../../../bin/intermediate_devcpp/juce_PathIterator.o ../../../bin/intermediate_devcpp/juce_PathStrokeType.o ../../../bin/intermediate_devcpp/juce_Point.o ../../../bin/intermediate_devcpp/juce_Rectangle.o ../../../bin/intermediate_devcpp/juce_RectangleList.o ../../../bin/intermediate_devcpp/juce_Image.o ../../../bin/intermediate_devcpp/juce_ImageCache.o ../../../bin/intermediate_devcpp/juce_ImageConvolutionKernel.o ../../../bin/intermediate_devcpp/juce_ImageFileFormat.o ../../../bin/intermediate_devcpp/juce_GIFLoader.o ../../../bin/intermediate_devcpp/juce_JPEGLoader.o ../../../bin/intermediate_devcpp/juce_PNGLoader.o ../../../bin/intermediate_devcpp/juce_win32_ASIO.o ../../../bin/intermediate_devcpp/juce_win32_AudioCDReader.o ../../../bin/intermediate_devcpp/juce_win32_DirectSound.o ../../../bin/intermediate_devcpp/juce_win32_DynamicLibraryLoader.o ../../../bin/intermediate_devcpp/juce_win32_FileChooser.o ../../../bin/intermediate_devcpp/juce_win32_Files.o ../../../bin/intermediate_devcpp/juce_win32_Fonts.o ../../../bin/intermediate_devcpp/juce_win32_Messaging.o ../../../bin/intermediate_devcpp/juce_win32_Midi.o ../../../bin/intermediate_devcpp/juce_win32_Misc.o ../../../bin/intermediate_devcpp/juce_win32_Network.o ../../../bin/intermediate_devcpp/juce_win32_PlatformUtils.o ../../../bin/intermediate_devcpp/juce_win32_SystemStats.o ../../../bin/intermediate_devcpp/juce_win32_Threads.o ../../../bin/intermediate_devcpp/juce_win32_Windowing.o ../../../bin/intermediate_devcpp/juce_AudioFormatReaderSource.o ../../../bin/intermediate_devcpp/juce_AudioSourcePlayer.o ../../../bin/intermediate_devcpp/juce_AudioTransportSource.o ../../../bin/intermediate_devcpp/juce_BufferingAudioSource.o ../../../bin/intermediate_devcpp/juce_MixerAudioSource.o ../../../bin/intermediate_devcpp/juce_ResamplingAudioSource.o ../../../bin/intermediate_devcpp/juce_TimeSliceThread.o ../../../bin/intermediate_devcpp/juce_ReadWriteLock.o ../../../bin/intermediate_devcpp/juce_LocalisedStrings.o ../../../bin/intermediate_devcpp/juce_PropertySet.o ../../../bin/intermediate_devcpp/juce_Drawable.o ../../../bin/intermediate_devcpp/juce_DrawableComposite.o ../../../bin/intermediate_devcpp/juce_DrawableImage.o ../../../bin/intermediate_devcpp/juce_DrawablePath.o ../../../bin/intermediate_devcpp/juce_DrawableText.o ../../../bin/intermediate_devcpp/juce_ColourGradient.o ../../../bin/intermediate_devcpp/juce_ArrowButton.o ../../../bin/intermediate_devcpp/juce_Button.o ../../../bin/intermediate_devcpp/juce_DrawableButton.o ../../../bin/intermediate_devcpp/juce_HyperlinkButton.o ../../../bin/intermediate_devcpp/juce_ImageButton.o ../../../bin/intermediate_devcpp/juce_ShapeButton.o ../../../bin/intermediate_devcpp/juce_TextButton.o ../../../bin/intermediate_devcpp/juce_ToggleButton.o ../../../bin/intermediate_devcpp/juce_ComboBox.o ../../../bin/intermediate_devcpp/juce_Label.o ../../../bin/intermediate_devcpp/juce_ListBox.o ../../../bin/intermediate_devcpp/juce_ProgressBar.o ../../../bin/intermediate_devcpp/juce_Slider.o ../../../bin/intermediate_devcpp/juce_TextEditor.o ../../../bin/intermediate_devcpp/juce_TreeView.o ../../../bin/intermediate_devcpp/juce_KeyListener.o ../../../bin/intermediate_devcpp/juce_KeyMappingEditorComponent.o ../../../bin/intermediate_devcpp/juce_KeyPress.o ../../../bin/intermediate_devcpp/juce_KeyPressMappingSet.o ../../../bin/intermediate_devcpp/juce_ModifierKeys.o ../../../bin/intermediate_devcpp/juce_GroupComponent.o ../../../bin/intermediate_devcpp/juce_ResizableBorderComponent.o ../../../bin/intermediate_devcpp/juce_ResizableCornerComponent.o ../../../bin/intermediate_devcpp/juce_ScrollBar.o ../../../bin/intermediate_devcpp/juce_StretchableLayoutManager.o ../../../bin/intermediate_devcpp/juce_StretchableLayoutResizerBar.o ../../../bin/intermediate_devcpp/juce_TabbedButtonBar.o ../../../bin/intermediate_devcpp/juce_TabbedComponent.o ../../../bin/intermediate_devcpp/juce_Viewport.o ../../../bin/intermediate_devcpp/juce_LookAndFeel.o ../../../bin/intermediate_devcpp/juce_ShinyLookAndFeel.o ../../../bin/intermediate_devcpp/juce_PopupMenu.o ../../../bin/intermediate_devcpp/juce_ComponentDragger.o ../../../bin/intermediate_devcpp/juce_DragAndDropContainer.o ../../../bin/intermediate_devcpp/juce_MouseCursor.o ../../../bin/intermediate_devcpp/juce_MouseEvent.o ../../../bin/intermediate_devcpp/juce_MouseHoverDetector.o ../../../bin/intermediate_devcpp/juce_MouseListener.o ../../../bin/intermediate_devcpp/juce_BubbleComponent.o ../../../bin/intermediate_devcpp/juce_ColourSelector.o ../../../bin/intermediate_devcpp/juce_DropShadower.o ../../../bin/intermediate_devcpp/juce_OpenGLComponent.o ../../../bin/intermediate_devcpp/juce_PreferencesPanel.o ../../../bin/intermediate_devcpp/juce_QuickTimeMovieComponent.o ../../../bin/intermediate_devcpp/juce_AlertWindow.o ../../../bin/intermediate_devcpp/juce_DialogWindow.o ../../../bin/intermediate_devcpp/juce_ResizableWindow.o ../../../bin/intermediate_devcpp/juce_SplashScreen.o ../../../bin/intermediate_devcpp/juce_ThreadWithProgressWindow.o ../../../bin/intermediate_devcpp/juce_ToolTipWindow.o ../../../bin/intermediate_devcpp/juce_MenuBarComponent.o ../../../bin/intermediate_devcpp/juce_BubbleMessageComponent.o ../../../bin/intermediate_devcpp/juce_Component.o ../../../bin/intermediate_devcpp/juce_ComponentListener.o ../../../bin/intermediate_devcpp/juce_Desktop.o ../../../bin/intermediate_devcpp/juce_ToneGeneratorAudioSource.o ../../../bin/intermediate_devcpp/adler32.o ../../../bin/intermediate_devcpp/compress.o ../../../bin/intermediate_devcpp/crc32.o ../../../bin/intermediate_devcpp/deflate.o ../../../bin/intermediate_devcpp/infback.o ../../../bin/intermediate_devcpp/inffast.o ../../../bin/intermediate_devcpp/inflate.o ../../../bin/intermediate_devcpp/inftrees.o ../../../bin/intermediate_devcpp/trees.o ../../../bin/intermediate_devcpp/uncompr.o ../../../bin/intermediate_devcpp/zutil.o ../../../bin/intermediate_devcpp/png.o ../../../bin/intermediate_devcpp/pngerror.o ../../../bin/intermediate_devcpp/pnggccrd.o ../../../bin/intermediate_devcpp/pngget.o ../../../bin/intermediate_devcpp/pngmem.o ../../../bin/intermediate_devcpp/pngpread.o ../../../bin/intermediate_devcpp/pngread.o ../../../bin/intermediate_devcpp/pngrio.o ../../../bin/intermediate_devcpp/pngrtran.o ../../../bin/intermediate_devcpp/pngrutil.o ../../../bin/intermediate_devcpp/pngset.o ../../../bin/intermediate_devcpp/pngtrans.o ../../../bin/intermediate_devcpp/pngvcrd.o ../../../bin/intermediate_devcpp/pngwio.o ../../../bin/intermediate_devcpp/pngwrite.o ../../../bin/intermediate_devcpp/pngwtran.o ../../../bin/intermediate_devcpp/pngwutil.o ../../../bin/intermediate_devcpp/jcapimin.o ../../../bin/intermediate_devcpp/jcapistd.o ../../../bin/intermediate_devcpp/jccoefct.o ../../../bin/intermediate_devcpp/jccolor.o ../../../bin/intermediate_devcpp/jcdctmgr.o ../../../bin/intermediate_devcpp/jchuff.o ../../../bin/intermediate_devcpp/jcinit.o ../../../bin/intermediate_devcpp/jcmainct.o ../../../bin/intermediate_devcpp/jcmarker.o ../../../bin/intermediate_devcpp/jcmaster.o ../../../bin/intermediate_devcpp/jcomapi.o ../../../bin/intermediate_devcpp/jcparam.o ../../../bin/intermediate_devcpp/jcphuff.o ../../../bin/intermediate_devcpp/jcprepct.o ../../../bin/intermediate_devcpp/jcsample.o ../../../bin/intermediate_devcpp/jctrans.o ../../../bin/intermediate_devcpp/jdapimin.o ../../../bin/intermediate_devcpp/jdapistd.o ../../../bin/intermediate_devcpp/jdatasrc.o ../../../bin/intermediate_devcpp/jdcoefct.o ../../../bin/intermediate_devcpp/jdcolor.o ../../../bin/intermediate_devcpp/jddctmgr.o ../../../bin/intermediate_devcpp/jdhuff.o ../../../bin/intermediate_devcpp/jdinput.o ../../../bin/intermediate_devcpp/jdmainct.o ../../../bin/intermediate_devcpp/jdmarker.o ../../../bin/intermediate_devcpp/jdmaster.o ../../../bin/intermediate_devcpp/jdmerge.o ../../../bin/intermediate_devcpp/jdphuff.o ../../../bin/intermediate_devcpp/jdpostct.o ../../../bin/intermediate_devcpp/jdsample.o ../../../bin/intermediate_devcpp/jdtrans.o ../../../bin/intermediate_devcpp/jerror.o ../../../bin/intermediate_devcpp/jfdctflt.o ../../../bin/intermediate_devcpp/jfdctfst.o ../../../bin/intermediate_devcpp/jfdctint.o ../../../bin/intermediate_devcpp/jidctflt.o ../../../bin/intermediate_devcpp/jidctfst.o ../../../bin/intermediate_devcpp/jidctint.o ../../../bin/intermediate_devcpp/jidctred.o ../../../bin/intermediate_devcpp/jmemmgr.o ../../../bin/intermediate_devcpp/jmemnobs.o ../../../bin/intermediate_devcpp/jquant1.o ../../../bin/intermediate_devcpp/jquant2.o ../../../bin/intermediate_devcpp/jutils.o ../../../bin/intermediate_devcpp/transupp.o ../../../bin/intermediate_devcpp/juce_MidiKeyboardComponent.o ../../../bin/intermediate_devcpp/juce_AudioFormatManager.o ../../../bin/intermediate_devcpp/juce_LowLevelGraphicsSoftwareRenderer.o ../../../bin/intermediate_devcpp/juce_AudioDeviceManager.o ../../../bin/intermediate_devcpp/juce_AudioDeviceSelectorComponent.o ../../../bin/intermediate_devcpp/juce_DocumentWindow.o ../../../bin/intermediate_devcpp/juce_ComponentBoundsConstrainer.o ../../../bin/intermediate_devcpp/juce_MidiBuffer.o ../../../bin/intermediate_devcpp/juce_MidiFile.o ../../../bin/intermediate_devcpp/juce_MidiKeyboardState.o ../../../bin/intermediate_devcpp/juce_MidiMessage.o ../../../bin/intermediate_devcpp/juce_MidiMessageCollector.o ../../../bin/intermediate_devcpp/juce_MidiMessageSequence.o ../../../bin/intermediate_devcpp/juce_TopLevelWindow.o ../../../bin/intermediate_devcpp/juce_ComponentPeer.o ../../../bin/intermediate_devcpp/juce_BorderSize.o ../../../bin/intermediate_devcpp/juce_PropertiesFile.o ../../../bin/intermediate_devcpp/juce_FileBasedDocument.o ../../../bin/intermediate_devcpp/juce_RecentlyOpenedFilesList.o ../../../bin/intermediate_devcpp/juce_UndoManager.o ../../../bin/intermediate_devcpp/juce_DirectoryContentsList.o ../../../bin/intermediate_devcpp/juce_FileBrowserComponent.o ../../../bin/intermediate_devcpp/juce_FileChooser.o ../../../bin/intermediate_devcpp/juce_FileChooserDialogBox.o ../../../bin/intermediate_devcpp/juce_FileFilter.o ../../../bin/intermediate_devcpp/juce_FileListComponent.o ../../../bin/intermediate_devcpp/juce_ImagePreviewComponent.o ../../../bin/intermediate_devcpp/juce_WildcardFileFilter.o ../../../bin/intermediate_devcpp/juce_AudioIODevice.o ../../../bin/intermediate_devcpp/juce_AudioIODeviceType.o ../../../bin/intermediate_devcpp/juce_Socket.o ../../../bin/intermediate_devcpp/juce_NamedPipe.o ../../../bin/intermediate_devcpp/juce_InterprocessConnection.o ../../../bin/intermediate_devcpp/juce_InterprocessConnectionServer.o ../../../bin/intermediate_devcpp/juce_FlacAudioFormat.o ../../../bin/intermediate_devcpp/juce_OggVorbisAudioFormat.o ../../../bin/intermediate_devcpp/juce_ApplicationCommandInfo.o ../../../bin/intermediate_devcpp/juce_ApplicationCommandManager.o ../../../bin/intermediate_devcpp/juce_ApplicationCommandTarget.o ../../../bin/intermediate_devcpp/juce_PositionedRectangle.o ../../../bin/intermediate_devcpp/juce_MultiDocumentPanel.o ../../../bin/intermediate_devcpp/juce_ButtonPropertyComponent.o ../../../bin/intermediate_devcpp/juce_ChoicePropertyComponent.o ../../../bin/intermediate_devcpp/juce_PropertyComponent.o ../../../bin/intermediate_devcpp/juce_PropertyPanel.o ../../../bin/intermediate_devcpp/juce_SliderPropertyComponent.o ../../../bin/intermediate_devcpp/juce_TextPropertyComponent.o ../../../bin/intermediate_devcpp/juce_MagnifierComponent.o ../../../bin/intermediate_devcpp/juce_FilenameComponent.o ../../../bin/intermediate_devcpp/juce_KeyboardFocusTraverser.o ../../../bin/intermediate_devcpp/juce_BooleanPropertyComponent.o ../../../bin/intermediate_devcpp/juce_CharacterFunctions.o ../../../bin/intermediate_devcpp/juce_SVGParser.o ../../../bin/intermediate_devcpp/juce_RectanglePlacement.o ../../../bin/intermediate_devcpp/juce_TableHeaderComponent.o ../../../bin/intermediate_devcpp/juce_TableListBox.o ../../../bin/intermediate_devcpp/juce_StretchableObjectResizer.o ../../../bin/intermediate_devcpp/juce_Toolbar.o ../../../bin/intermediate_devcpp/juce_ToolbarItemComponent.o ../../../bin/intermediate_devcpp/juce_ToolbarItemPalette.o ../../../bin/intermediate_devcpp/juce_ComponentAnimator.o ../../../bin/intermediate_devcpp/juce_MultiTimer.o ../../../bin/intermediate_devcpp/juce_ToolbarButton.o ../../../bin/intermediate_devcpp/juce_Sampler.o ../../../bin/intermediate_devcpp/juce_Synthesiser.o ../../../bin/intermediate_devcpp/juce_ComponentMovementWatcher.o ../../../bin/intermediate_devcpp/juce_AudioDataConverters.o ../../../bin/intermediate_devcpp/juce_AudioSampleBuffer.o ../../../bin/intermediate_devcpp/juce_IIRFilter.o ../../../bin/intermediate_devcpp/juce_ApplicationProperties.o ../../../bin/intermediate_devcpp/juce_SystemTrayIconComponent.o ../../../bin/intermediate_devcpp/juce_MenuBarModel.o ../../../bin/intermediate_devcpp/juce_ChannelRemappingAudioSource.o $(RES) +LINKOBJ = ../../../bin/intermediate_devcpp/juce_Logger.o ../../../bin/intermediate_devcpp/juce_Random.o ../../../bin/intermediate_devcpp/juce_RelativeTime.o ../../../bin/intermediate_devcpp/juce_SystemStats.o ../../../bin/intermediate_devcpp/juce_Time.o ../../../bin/intermediate_devcpp/juce_BitArray.o ../../../bin/intermediate_devcpp/juce_MemoryBlock.o ../../../bin/intermediate_devcpp/juce_BlowFish.o ../../../bin/intermediate_devcpp/juce_MD5.o ../../../bin/intermediate_devcpp/juce_Primes.o ../../../bin/intermediate_devcpp/juce_RSAKey.o ../../../bin/intermediate_devcpp/juce_InputStream.o ../../../bin/intermediate_devcpp/juce_OutputStream.o ../../../bin/intermediate_devcpp/juce_DirectoryIterator.o ../../../bin/intermediate_devcpp/juce_File.o ../../../bin/intermediate_devcpp/juce_FileInputStream.o ../../../bin/intermediate_devcpp/juce_FileOutputStream.o ../../../bin/intermediate_devcpp/juce_FileSearchPath.o ../../../bin/intermediate_devcpp/juce_URL.o ../../../bin/intermediate_devcpp/juce_BufferedInputStream.o ../../../bin/intermediate_devcpp/juce_GZIPCompressorOutputStream.o ../../../bin/intermediate_devcpp/juce_GZIPDecompressorInputStream.o ../../../bin/intermediate_devcpp/juce_MemoryInputStream.o ../../../bin/intermediate_devcpp/juce_MemoryOutputStream.o ../../../bin/intermediate_devcpp/juce_SubregionStream.o ../../../bin/intermediate_devcpp/juce_PerformanceCounter.o ../../../bin/intermediate_devcpp/juce_Uuid.o ../../../bin/intermediate_devcpp/juce_ZipFile.o ../../../bin/intermediate_devcpp/juce_String.o ../../../bin/intermediate_devcpp/juce_StringArray.o ../../../bin/intermediate_devcpp/juce_StringPairArray.o ../../../bin/intermediate_devcpp/juce_XmlDocument.o ../../../bin/intermediate_devcpp/juce_XmlElement.o ../../../bin/intermediate_devcpp/juce_InterProcessLock.o ../../../bin/intermediate_devcpp/juce_Thread.o ../../../bin/intermediate_devcpp/juce_ThreadPool.o ../../../bin/intermediate_devcpp/juce_Application.o ../../../bin/intermediate_devcpp/juce_DeletedAtShutdown.o ../../../bin/intermediate_devcpp/juce_AiffAudioFormat.o ../../../bin/intermediate_devcpp/juce_AudioCDReader.o ../../../bin/intermediate_devcpp/juce_AudioFormat.o ../../../bin/intermediate_devcpp/juce_AudioSubsectionReader.o ../../../bin/intermediate_devcpp/juce_WavAudioFormat.o ../../../bin/intermediate_devcpp/juce_ActionBroadcaster.o ../../../bin/intermediate_devcpp/juce_ActionListenerList.o ../../../bin/intermediate_devcpp/juce_AsyncUpdater.o ../../../bin/intermediate_devcpp/juce_ChangeBroadcaster.o ../../../bin/intermediate_devcpp/juce_ChangeListenerList.o ../../../bin/intermediate_devcpp/juce_Message.o ../../../bin/intermediate_devcpp/juce_MessageListener.o ../../../bin/intermediate_devcpp/juce_MessageManager.o ../../../bin/intermediate_devcpp/juce_Timer.o ../../../bin/intermediate_devcpp/juce_Brush.o ../../../bin/intermediate_devcpp/juce_GradientBrush.o ../../../bin/intermediate_devcpp/juce_ImageBrush.o ../../../bin/intermediate_devcpp/juce_SolidColourBrush.o ../../../bin/intermediate_devcpp/juce_Colour.o ../../../bin/intermediate_devcpp/juce_Colours.o ../../../bin/intermediate_devcpp/juce_EdgeTable.o ../../../bin/intermediate_devcpp/juce_Graphics.o ../../../bin/intermediate_devcpp/juce_Justification.o ../../../bin/intermediate_devcpp/juce_DropShadowEffect.o ../../../bin/intermediate_devcpp/juce_GlowEffect.o ../../../bin/intermediate_devcpp/juce_ReduceOpacityEffect.o ../../../bin/intermediate_devcpp/juce_Font.o ../../../bin/intermediate_devcpp/juce_GlyphArrangement.o ../../../bin/intermediate_devcpp/juce_TextLayout.o ../../../bin/intermediate_devcpp/juce_Typeface.o ../../../bin/intermediate_devcpp/juce_AffineTransform.o ../../../bin/intermediate_devcpp/juce_Line.o ../../../bin/intermediate_devcpp/juce_Path.o ../../../bin/intermediate_devcpp/juce_PathIterator.o ../../../bin/intermediate_devcpp/juce_PathStrokeType.o ../../../bin/intermediate_devcpp/juce_Point.o ../../../bin/intermediate_devcpp/juce_Rectangle.o ../../../bin/intermediate_devcpp/juce_RectangleList.o ../../../bin/intermediate_devcpp/juce_Image.o ../../../bin/intermediate_devcpp/juce_ImageCache.o ../../../bin/intermediate_devcpp/juce_ImageConvolutionKernel.o ../../../bin/intermediate_devcpp/juce_ImageFileFormat.o ../../../bin/intermediate_devcpp/juce_GIFLoader.o ../../../bin/intermediate_devcpp/juce_JPEGLoader.o ../../../bin/intermediate_devcpp/juce_PNGLoader.o ../../../bin/intermediate_devcpp/juce_win32_ASIO.o ../../../bin/intermediate_devcpp/juce_win32_AudioCDReader.o ../../../bin/intermediate_devcpp/juce_win32_DirectSound.o ../../../bin/intermediate_devcpp/juce_win32_DynamicLibraryLoader.o ../../../bin/intermediate_devcpp/juce_win32_FileChooser.o ../../../bin/intermediate_devcpp/juce_win32_Files.o ../../../bin/intermediate_devcpp/juce_win32_Fonts.o ../../../bin/intermediate_devcpp/juce_win32_Messaging.o ../../../bin/intermediate_devcpp/juce_win32_Midi.o ../../../bin/intermediate_devcpp/juce_win32_Misc.o ../../../bin/intermediate_devcpp/juce_win32_Network.o ../../../bin/intermediate_devcpp/juce_win32_PlatformUtils.o ../../../bin/intermediate_devcpp/juce_win32_SystemStats.o ../../../bin/intermediate_devcpp/juce_win32_Threads.o ../../../bin/intermediate_devcpp/juce_win32_Windowing.o ../../../bin/intermediate_devcpp/juce_AudioFormatReaderSource.o ../../../bin/intermediate_devcpp/juce_AudioSourcePlayer.o ../../../bin/intermediate_devcpp/juce_AudioTransportSource.o ../../../bin/intermediate_devcpp/juce_BufferingAudioSource.o ../../../bin/intermediate_devcpp/juce_MixerAudioSource.o ../../../bin/intermediate_devcpp/juce_ResamplingAudioSource.o ../../../bin/intermediate_devcpp/juce_TimeSliceThread.o ../../../bin/intermediate_devcpp/juce_ReadWriteLock.o ../../../bin/intermediate_devcpp/juce_LocalisedStrings.o ../../../bin/intermediate_devcpp/juce_PropertySet.o ../../../bin/intermediate_devcpp/juce_Drawable.o ../../../bin/intermediate_devcpp/juce_DrawableComposite.o ../../../bin/intermediate_devcpp/juce_DrawableImage.o ../../../bin/intermediate_devcpp/juce_DrawablePath.o ../../../bin/intermediate_devcpp/juce_DrawableText.o ../../../bin/intermediate_devcpp/juce_ColourGradient.o ../../../bin/intermediate_devcpp/juce_ArrowButton.o ../../../bin/intermediate_devcpp/juce_Button.o ../../../bin/intermediate_devcpp/juce_DrawableButton.o ../../../bin/intermediate_devcpp/juce_HyperlinkButton.o ../../../bin/intermediate_devcpp/juce_ImageButton.o ../../../bin/intermediate_devcpp/juce_ShapeButton.o ../../../bin/intermediate_devcpp/juce_TextButton.o ../../../bin/intermediate_devcpp/juce_ToggleButton.o ../../../bin/intermediate_devcpp/juce_ComboBox.o ../../../bin/intermediate_devcpp/juce_Label.o ../../../bin/intermediate_devcpp/juce_ListBox.o ../../../bin/intermediate_devcpp/juce_ProgressBar.o ../../../bin/intermediate_devcpp/juce_Slider.o ../../../bin/intermediate_devcpp/juce_TextEditor.o ../../../bin/intermediate_devcpp/juce_TreeView.o ../../../bin/intermediate_devcpp/juce_KeyListener.o ../../../bin/intermediate_devcpp/juce_KeyMappingEditorComponent.o ../../../bin/intermediate_devcpp/juce_KeyPress.o ../../../bin/intermediate_devcpp/juce_KeyPressMappingSet.o ../../../bin/intermediate_devcpp/juce_ModifierKeys.o ../../../bin/intermediate_devcpp/juce_GroupComponent.o ../../../bin/intermediate_devcpp/juce_ResizableBorderComponent.o ../../../bin/intermediate_devcpp/juce_ResizableCornerComponent.o ../../../bin/intermediate_devcpp/juce_ScrollBar.o ../../../bin/intermediate_devcpp/juce_StretchableLayoutManager.o ../../../bin/intermediate_devcpp/juce_StretchableLayoutResizerBar.o ../../../bin/intermediate_devcpp/juce_TabbedButtonBar.o ../../../bin/intermediate_devcpp/juce_TabbedComponent.o ../../../bin/intermediate_devcpp/juce_Viewport.o ../../../bin/intermediate_devcpp/juce_LookAndFeel.o ../../../bin/intermediate_devcpp/juce_ShinyLookAndFeel.o ../../../bin/intermediate_devcpp/juce_PopupMenu.o ../../../bin/intermediate_devcpp/juce_ComponentDragger.o ../../../bin/intermediate_devcpp/juce_DragAndDropContainer.o ../../../bin/intermediate_devcpp/juce_MouseCursor.o ../../../bin/intermediate_devcpp/juce_MouseEvent.o ../../../bin/intermediate_devcpp/juce_MouseHoverDetector.o ../../../bin/intermediate_devcpp/juce_MouseListener.o ../../../bin/intermediate_devcpp/juce_BubbleComponent.o ../../../bin/intermediate_devcpp/juce_ColourSelector.o ../../../bin/intermediate_devcpp/juce_DropShadower.o ../../../bin/intermediate_devcpp/juce_OpenGLComponent.o ../../../bin/intermediate_devcpp/juce_PreferencesPanel.o ../../../bin/intermediate_devcpp/juce_QuickTimeMovieComponent.o ../../../bin/intermediate_devcpp/juce_AlertWindow.o ../../../bin/intermediate_devcpp/juce_DialogWindow.o ../../../bin/intermediate_devcpp/juce_ResizableWindow.o ../../../bin/intermediate_devcpp/juce_SplashScreen.o ../../../bin/intermediate_devcpp/juce_ThreadWithProgressWindow.o ../../../bin/intermediate_devcpp/juce_ToolTipWindow.o ../../../bin/intermediate_devcpp/juce_MenuBarComponent.o ../../../bin/intermediate_devcpp/juce_BubbleMessageComponent.o ../../../bin/intermediate_devcpp/juce_Component.o ../../../bin/intermediate_devcpp/juce_ComponentListener.o ../../../bin/intermediate_devcpp/juce_Desktop.o ../../../bin/intermediate_devcpp/juce_ToneGeneratorAudioSource.o ../../../bin/intermediate_devcpp/adler32.o ../../../bin/intermediate_devcpp/compress.o ../../../bin/intermediate_devcpp/crc32.o ../../../bin/intermediate_devcpp/deflate.o ../../../bin/intermediate_devcpp/infback.o ../../../bin/intermediate_devcpp/inffast.o ../../../bin/intermediate_devcpp/inflate.o ../../../bin/intermediate_devcpp/inftrees.o ../../../bin/intermediate_devcpp/trees.o ../../../bin/intermediate_devcpp/uncompr.o ../../../bin/intermediate_devcpp/zutil.o ../../../bin/intermediate_devcpp/png.o ../../../bin/intermediate_devcpp/pngerror.o ../../../bin/intermediate_devcpp/pnggccrd.o ../../../bin/intermediate_devcpp/pngget.o ../../../bin/intermediate_devcpp/pngmem.o ../../../bin/intermediate_devcpp/pngpread.o ../../../bin/intermediate_devcpp/pngread.o ../../../bin/intermediate_devcpp/pngrio.o ../../../bin/intermediate_devcpp/pngrtran.o ../../../bin/intermediate_devcpp/pngrutil.o ../../../bin/intermediate_devcpp/pngset.o ../../../bin/intermediate_devcpp/pngtrans.o ../../../bin/intermediate_devcpp/pngvcrd.o ../../../bin/intermediate_devcpp/pngwio.o ../../../bin/intermediate_devcpp/pngwrite.o ../../../bin/intermediate_devcpp/pngwtran.o ../../../bin/intermediate_devcpp/pngwutil.o ../../../bin/intermediate_devcpp/jcapimin.o ../../../bin/intermediate_devcpp/jcapistd.o ../../../bin/intermediate_devcpp/jccoefct.o ../../../bin/intermediate_devcpp/jccolor.o ../../../bin/intermediate_devcpp/jcdctmgr.o ../../../bin/intermediate_devcpp/jchuff.o ../../../bin/intermediate_devcpp/jcinit.o ../../../bin/intermediate_devcpp/jcmainct.o ../../../bin/intermediate_devcpp/jcmarker.o ../../../bin/intermediate_devcpp/jcmaster.o ../../../bin/intermediate_devcpp/jcomapi.o ../../../bin/intermediate_devcpp/jcparam.o ../../../bin/intermediate_devcpp/jcphuff.o ../../../bin/intermediate_devcpp/jcprepct.o ../../../bin/intermediate_devcpp/jcsample.o ../../../bin/intermediate_devcpp/jctrans.o ../../../bin/intermediate_devcpp/jdapimin.o ../../../bin/intermediate_devcpp/jdapistd.o ../../../bin/intermediate_devcpp/jdatasrc.o ../../../bin/intermediate_devcpp/jdcoefct.o ../../../bin/intermediate_devcpp/jdcolor.o ../../../bin/intermediate_devcpp/jddctmgr.o ../../../bin/intermediate_devcpp/jdhuff.o ../../../bin/intermediate_devcpp/jdinput.o ../../../bin/intermediate_devcpp/jdmainct.o ../../../bin/intermediate_devcpp/jdmarker.o ../../../bin/intermediate_devcpp/jdmaster.o ../../../bin/intermediate_devcpp/jdmerge.o ../../../bin/intermediate_devcpp/jdphuff.o ../../../bin/intermediate_devcpp/jdpostct.o ../../../bin/intermediate_devcpp/jdsample.o ../../../bin/intermediate_devcpp/jdtrans.o ../../../bin/intermediate_devcpp/jerror.o ../../../bin/intermediate_devcpp/jfdctflt.o ../../../bin/intermediate_devcpp/jfdctfst.o ../../../bin/intermediate_devcpp/jfdctint.o ../../../bin/intermediate_devcpp/jidctflt.o ../../../bin/intermediate_devcpp/jidctfst.o ../../../bin/intermediate_devcpp/jidctint.o ../../../bin/intermediate_devcpp/jidctred.o ../../../bin/intermediate_devcpp/jmemmgr.o ../../../bin/intermediate_devcpp/jmemnobs.o ../../../bin/intermediate_devcpp/jquant1.o ../../../bin/intermediate_devcpp/jquant2.o ../../../bin/intermediate_devcpp/jutils.o ../../../bin/intermediate_devcpp/transupp.o ../../../bin/intermediate_devcpp/juce_MidiKeyboardComponent.o ../../../bin/intermediate_devcpp/juce_AudioFormatManager.o ../../../bin/intermediate_devcpp/juce_LowLevelGraphicsSoftwareRenderer.o ../../../bin/intermediate_devcpp/juce_AudioDeviceManager.o ../../../bin/intermediate_devcpp/juce_AudioDeviceSelectorComponent.o ../../../bin/intermediate_devcpp/juce_DocumentWindow.o ../../../bin/intermediate_devcpp/juce_ComponentBoundsConstrainer.o ../../../bin/intermediate_devcpp/juce_MidiBuffer.o ../../../bin/intermediate_devcpp/juce_MidiFile.o ../../../bin/intermediate_devcpp/juce_MidiKeyboardState.o ../../../bin/intermediate_devcpp/juce_MidiMessage.o ../../../bin/intermediate_devcpp/juce_MidiMessageCollector.o ../../../bin/intermediate_devcpp/juce_MidiMessageSequence.o ../../../bin/intermediate_devcpp/juce_TopLevelWindow.o ../../../bin/intermediate_devcpp/juce_ComponentPeer.o ../../../bin/intermediate_devcpp/juce_BorderSize.o ../../../bin/intermediate_devcpp/juce_PropertiesFile.o ../../../bin/intermediate_devcpp/juce_FileBasedDocument.o ../../../bin/intermediate_devcpp/juce_RecentlyOpenedFilesList.o ../../../bin/intermediate_devcpp/juce_UndoManager.o ../../../bin/intermediate_devcpp/juce_DirectoryContentsList.o ../../../bin/intermediate_devcpp/juce_FileBrowserComponent.o ../../../bin/intermediate_devcpp/juce_FileChooser.o ../../../bin/intermediate_devcpp/juce_FileChooserDialogBox.o ../../../bin/intermediate_devcpp/juce_FileFilter.o ../../../bin/intermediate_devcpp/juce_FileListComponent.o ../../../bin/intermediate_devcpp/juce_ImagePreviewComponent.o ../../../bin/intermediate_devcpp/juce_WildcardFileFilter.o ../../../bin/intermediate_devcpp/juce_AudioIODevice.o ../../../bin/intermediate_devcpp/juce_AudioIODeviceType.o ../../../bin/intermediate_devcpp/juce_Socket.o ../../../bin/intermediate_devcpp/juce_NamedPipe.o ../../../bin/intermediate_devcpp/juce_InterprocessConnection.o ../../../bin/intermediate_devcpp/juce_InterprocessConnectionServer.o ../../../bin/intermediate_devcpp/juce_FlacAudioFormat.o ../../../bin/intermediate_devcpp/juce_OggVorbisAudioFormat.o ../../../bin/intermediate_devcpp/juce_ApplicationCommandInfo.o ../../../bin/intermediate_devcpp/juce_ApplicationCommandManager.o ../../../bin/intermediate_devcpp/juce_ApplicationCommandTarget.o ../../../bin/intermediate_devcpp/juce_PositionedRectangle.o ../../../bin/intermediate_devcpp/juce_MultiDocumentPanel.o ../../../bin/intermediate_devcpp/juce_ButtonPropertyComponent.o ../../../bin/intermediate_devcpp/juce_ChoicePropertyComponent.o ../../../bin/intermediate_devcpp/juce_PropertyComponent.o ../../../bin/intermediate_devcpp/juce_PropertyPanel.o ../../../bin/intermediate_devcpp/juce_SliderPropertyComponent.o ../../../bin/intermediate_devcpp/juce_TextPropertyComponent.o ../../../bin/intermediate_devcpp/juce_MagnifierComponent.o ../../../bin/intermediate_devcpp/juce_FilenameComponent.o ../../../bin/intermediate_devcpp/juce_KeyboardFocusTraverser.o ../../../bin/intermediate_devcpp/juce_BooleanPropertyComponent.o ../../../bin/intermediate_devcpp/juce_CharacterFunctions.o ../../../bin/intermediate_devcpp/juce_SVGParser.o ../../../bin/intermediate_devcpp/juce_RectanglePlacement.o ../../../bin/intermediate_devcpp/juce_TableHeaderComponent.o ../../../bin/intermediate_devcpp/juce_TableListBox.o ../../../bin/intermediate_devcpp/juce_StretchableObjectResizer.o ../../../bin/intermediate_devcpp/juce_Toolbar.o ../../../bin/intermediate_devcpp/juce_ToolbarItemComponent.o ../../../bin/intermediate_devcpp/juce_ToolbarItemPalette.o ../../../bin/intermediate_devcpp/juce_ComponentAnimator.o ../../../bin/intermediate_devcpp/juce_MultiTimer.o ../../../bin/intermediate_devcpp/juce_ToolbarButton.o ../../../bin/intermediate_devcpp/juce_Sampler.o ../../../bin/intermediate_devcpp/juce_Synthesiser.o ../../../bin/intermediate_devcpp/juce_ComponentMovementWatcher.o ../../../bin/intermediate_devcpp/juce_AudioDataConverters.o ../../../bin/intermediate_devcpp/juce_AudioSampleBuffer.o ../../../bin/intermediate_devcpp/juce_IIRFilter.o ../../../bin/intermediate_devcpp/juce_ApplicationProperties.o ../../../bin/intermediate_devcpp/juce_SystemTrayIconComponent.o ../../../bin/intermediate_devcpp/juce_MenuBarModel.o ../../../bin/intermediate_devcpp/juce_ChannelRemappingAudioSource.o $(RES) +LIBS = -L"C:/prog/Dev-Cpp/lib" -L"C:/essentials/QT6 SDK (Win)/Interfaces & Libraries/QTDevWin/Libraries" -s +INCS = -I"C:/prog/Dev-Cpp/include" +CXXINCS = -I"C:/prog/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/prog/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/prog/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/prog/Dev-Cpp/include/c++/3.4.2" -I"C:/prog/Dev-Cpp/include" -I"C:/essentials/asiosdk2/common" -I"C:/essentials/QT6 SDK (Win)/Interfaces & Libraries/QTDevWin/CIncludes" -I"c:/program files/QuickTime" +BIN = ../../../bin/libjuce.a +CXXFLAGS = $(CXXINCS) -Wno-multichar -DJUCE_USE_FLAC=0 -DJUCE_USE_OGGVORBIS=0 -Wall -fexceptions -fexpensive-optimizations -O3 +CFLAGS = $(INCS) -Wall -fexceptions -fexpensive-optimizations -O3 +RM = rm -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before ../../../bin/libjuce.a all-after + + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(LINKOBJ) + ar r $(BIN) $(LINKOBJ) + ranlib $(BIN) + +../../../bin/intermediate_devcpp/juce_Logger.o: ../../../src/juce_core/basics/juce_Logger.cpp + $(CPP) -c ../../../src/juce_core/basics/juce_Logger.cpp -o ../../../bin/intermediate_devcpp/juce_Logger.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Random.o: ../../../src/juce_core/basics/juce_Random.cpp + $(CPP) -c ../../../src/juce_core/basics/juce_Random.cpp -o ../../../bin/intermediate_devcpp/juce_Random.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_RelativeTime.o: ../../../src/juce_core/basics/juce_RelativeTime.cpp + $(CPP) -c ../../../src/juce_core/basics/juce_RelativeTime.cpp -o ../../../bin/intermediate_devcpp/juce_RelativeTime.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SystemStats.o: ../../../src/juce_core/basics/juce_SystemStats.cpp + $(CPP) -c ../../../src/juce_core/basics/juce_SystemStats.cpp -o ../../../bin/intermediate_devcpp/juce_SystemStats.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Time.o: ../../../src/juce_core/basics/juce_Time.cpp + $(CPP) -c ../../../src/juce_core/basics/juce_Time.cpp -o ../../../bin/intermediate_devcpp/juce_Time.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BitArray.o: ../../../src/juce_core/containers/juce_BitArray.cpp + $(CPP) -c ../../../src/juce_core/containers/juce_BitArray.cpp -o ../../../bin/intermediate_devcpp/juce_BitArray.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MemoryBlock.o: ../../../src/juce_core/containers/juce_MemoryBlock.cpp + $(CPP) -c ../../../src/juce_core/containers/juce_MemoryBlock.cpp -o ../../../bin/intermediate_devcpp/juce_MemoryBlock.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BlowFish.o: ../../../src/juce_core/cryptography/juce_BlowFish.cpp + $(CPP) -c ../../../src/juce_core/cryptography/juce_BlowFish.cpp -o ../../../bin/intermediate_devcpp/juce_BlowFish.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MD5.o: ../../../src/juce_core/cryptography/juce_MD5.cpp + $(CPP) -c ../../../src/juce_core/cryptography/juce_MD5.cpp -o ../../../bin/intermediate_devcpp/juce_MD5.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Primes.o: ../../../src/juce_core/cryptography/juce_Primes.cpp + $(CPP) -c ../../../src/juce_core/cryptography/juce_Primes.cpp -o ../../../bin/intermediate_devcpp/juce_Primes.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_RSAKey.o: ../../../src/juce_core/cryptography/juce_RSAKey.cpp + $(CPP) -c ../../../src/juce_core/cryptography/juce_RSAKey.cpp -o ../../../bin/intermediate_devcpp/juce_RSAKey.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_InputStream.o: ../../../src/juce_core/io/juce_InputStream.cpp + $(CPP) -c ../../../src/juce_core/io/juce_InputStream.cpp -o ../../../bin/intermediate_devcpp/juce_InputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_OutputStream.o: ../../../src/juce_core/io/juce_OutputStream.cpp + $(CPP) -c ../../../src/juce_core/io/juce_OutputStream.cpp -o ../../../bin/intermediate_devcpp/juce_OutputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DirectoryIterator.o: ../../../src/juce_core/io/files/juce_DirectoryIterator.cpp + $(CPP) -c ../../../src/juce_core/io/files/juce_DirectoryIterator.cpp -o ../../../bin/intermediate_devcpp/juce_DirectoryIterator.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_File.o: ../../../src/juce_core/io/files/juce_File.cpp + $(CPP) -c ../../../src/juce_core/io/files/juce_File.cpp -o ../../../bin/intermediate_devcpp/juce_File.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileInputStream.o: ../../../src/juce_core/io/files/juce_FileInputStream.cpp + $(CPP) -c ../../../src/juce_core/io/files/juce_FileInputStream.cpp -o ../../../bin/intermediate_devcpp/juce_FileInputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileOutputStream.o: ../../../src/juce_core/io/files/juce_FileOutputStream.cpp + $(CPP) -c ../../../src/juce_core/io/files/juce_FileOutputStream.cpp -o ../../../bin/intermediate_devcpp/juce_FileOutputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileSearchPath.o: ../../../src/juce_core/io/files/juce_FileSearchPath.cpp + $(CPP) -c ../../../src/juce_core/io/files/juce_FileSearchPath.cpp -o ../../../bin/intermediate_devcpp/juce_FileSearchPath.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_URL.o: ../../../src/juce_core/io/network/juce_URL.cpp + $(CPP) -c ../../../src/juce_core/io/network/juce_URL.cpp -o ../../../bin/intermediate_devcpp/juce_URL.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BufferedInputStream.o: ../../../src/juce_core/io/streams/juce_BufferedInputStream.cpp + $(CPP) -c ../../../src/juce_core/io/streams/juce_BufferedInputStream.cpp -o ../../../bin/intermediate_devcpp/juce_BufferedInputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GZIPCompressorOutputStream.o: ../../../src/juce_core/io/streams/juce_GZIPCompressorOutputStream.cpp + $(CPP) -c ../../../src/juce_core/io/streams/juce_GZIPCompressorOutputStream.cpp -o ../../../bin/intermediate_devcpp/juce_GZIPCompressorOutputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GZIPDecompressorInputStream.o: ../../../src/juce_core/io/streams/juce_GZIPDecompressorInputStream.cpp + $(CPP) -c ../../../src/juce_core/io/streams/juce_GZIPDecompressorInputStream.cpp -o ../../../bin/intermediate_devcpp/juce_GZIPDecompressorInputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MemoryInputStream.o: ../../../src/juce_core/io/streams/juce_MemoryInputStream.cpp + $(CPP) -c ../../../src/juce_core/io/streams/juce_MemoryInputStream.cpp -o ../../../bin/intermediate_devcpp/juce_MemoryInputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MemoryOutputStream.o: ../../../src/juce_core/io/streams/juce_MemoryOutputStream.cpp + $(CPP) -c ../../../src/juce_core/io/streams/juce_MemoryOutputStream.cpp -o ../../../bin/intermediate_devcpp/juce_MemoryOutputStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SubregionStream.o: ../../../src/juce_core/io/streams/juce_SubregionStream.cpp + $(CPP) -c ../../../src/juce_core/io/streams/juce_SubregionStream.cpp -o ../../../bin/intermediate_devcpp/juce_SubregionStream.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PerformanceCounter.o: ../../../src/juce_core/misc/juce_PerformanceCounter.cpp + $(CPP) -c ../../../src/juce_core/misc/juce_PerformanceCounter.cpp -o ../../../bin/intermediate_devcpp/juce_PerformanceCounter.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Uuid.o: ../../../src/juce_core/misc/juce_Uuid.cpp + $(CPP) -c ../../../src/juce_core/misc/juce_Uuid.cpp -o ../../../bin/intermediate_devcpp/juce_Uuid.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ZipFile.o: ../../../src/juce_core/misc/juce_ZipFile.cpp + $(CPP) -c ../../../src/juce_core/misc/juce_ZipFile.cpp -o ../../../bin/intermediate_devcpp/juce_ZipFile.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_String.o: ../../../src/juce_core/text/juce_String.cpp + $(CPP) -c ../../../src/juce_core/text/juce_String.cpp -o ../../../bin/intermediate_devcpp/juce_String.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_StringArray.o: ../../../src/juce_core/text/juce_StringArray.cpp + $(CPP) -c ../../../src/juce_core/text/juce_StringArray.cpp -o ../../../bin/intermediate_devcpp/juce_StringArray.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_StringPairArray.o: ../../../src/juce_core/text/juce_StringPairArray.cpp + $(CPP) -c ../../../src/juce_core/text/juce_StringPairArray.cpp -o ../../../bin/intermediate_devcpp/juce_StringPairArray.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_XmlDocument.o: ../../../src/juce_core/text/juce_XmlDocument.cpp + $(CPP) -c ../../../src/juce_core/text/juce_XmlDocument.cpp -o ../../../bin/intermediate_devcpp/juce_XmlDocument.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_XmlElement.o: ../../../src/juce_core/text/juce_XmlElement.cpp + $(CPP) -c ../../../src/juce_core/text/juce_XmlElement.cpp -o ../../../bin/intermediate_devcpp/juce_XmlElement.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_InterProcessLock.o: ../../../src/juce_core/threads/juce_InterProcessLock.cpp + $(CPP) -c ../../../src/juce_core/threads/juce_InterProcessLock.cpp -o ../../../bin/intermediate_devcpp/juce_InterProcessLock.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Thread.o: ../../../src/juce_core/threads/juce_Thread.cpp + $(CPP) -c ../../../src/juce_core/threads/juce_Thread.cpp -o ../../../bin/intermediate_devcpp/juce_Thread.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ThreadPool.o: ../../../src/juce_core/threads/juce_ThreadPool.cpp + $(CPP) -c ../../../src/juce_core/threads/juce_ThreadPool.cpp -o ../../../bin/intermediate_devcpp/juce_ThreadPool.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Application.o: ../../../src/juce_appframework/application/juce_Application.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_Application.cpp -o ../../../bin/intermediate_devcpp/juce_Application.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DeletedAtShutdown.o: ../../../src/juce_appframework/application/juce_DeletedAtShutdown.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_DeletedAtShutdown.cpp -o ../../../bin/intermediate_devcpp/juce_DeletedAtShutdown.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AiffAudioFormat.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp -o ../../../bin/intermediate_devcpp/juce_AiffAudioFormat.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioCDReader.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.cpp -o ../../../bin/intermediate_devcpp/juce_AudioCDReader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioFormat.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormat.cpp -o ../../../bin/intermediate_devcpp/juce_AudioFormat.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioSubsectionReader.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioSubsectionReader.cpp -o ../../../bin/intermediate_devcpp/juce_AudioSubsectionReader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_WavAudioFormat.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.cpp -o ../../../bin/intermediate_devcpp/juce_WavAudioFormat.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ActionBroadcaster.o: ../../../src/juce_appframework/events/juce_ActionBroadcaster.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_ActionBroadcaster.cpp -o ../../../bin/intermediate_devcpp/juce_ActionBroadcaster.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ActionListenerList.o: ../../../src/juce_appframework/events/juce_ActionListenerList.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_ActionListenerList.cpp -o ../../../bin/intermediate_devcpp/juce_ActionListenerList.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AsyncUpdater.o: ../../../src/juce_appframework/events/juce_AsyncUpdater.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_AsyncUpdater.cpp -o ../../../bin/intermediate_devcpp/juce_AsyncUpdater.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ChangeBroadcaster.o: ../../../src/juce_appframework/events/juce_ChangeBroadcaster.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_ChangeBroadcaster.cpp -o ../../../bin/intermediate_devcpp/juce_ChangeBroadcaster.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ChangeListenerList.o: ../../../src/juce_appframework/events/juce_ChangeListenerList.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_ChangeListenerList.cpp -o ../../../bin/intermediate_devcpp/juce_ChangeListenerList.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Message.o: ../../../src/juce_appframework/events/juce_Message.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_Message.cpp -o ../../../bin/intermediate_devcpp/juce_Message.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MessageListener.o: ../../../src/juce_appframework/events/juce_MessageListener.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_MessageListener.cpp -o ../../../bin/intermediate_devcpp/juce_MessageListener.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MessageManager.o: ../../../src/juce_appframework/events/juce_MessageManager.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_MessageManager.cpp -o ../../../bin/intermediate_devcpp/juce_MessageManager.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Timer.o: ../../../src/juce_appframework/events/juce_Timer.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_Timer.cpp -o ../../../bin/intermediate_devcpp/juce_Timer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Brush.o: ../../../src/juce_appframework/gui/graphics/brushes/juce_Brush.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/brushes/juce_Brush.cpp -o ../../../bin/intermediate_devcpp/juce_Brush.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GradientBrush.o: ../../../src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/brushes/juce_GradientBrush.cpp -o ../../../bin/intermediate_devcpp/juce_GradientBrush.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ImageBrush.o: ../../../src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/brushes/juce_ImageBrush.cpp -o ../../../bin/intermediate_devcpp/juce_ImageBrush.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SolidColourBrush.o: ../../../src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/brushes/juce_SolidColourBrush.cpp -o ../../../bin/intermediate_devcpp/juce_SolidColourBrush.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Colour.o: ../../../src/juce_appframework/gui/graphics/colour/juce_Colour.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/colour/juce_Colour.cpp -o ../../../bin/intermediate_devcpp/juce_Colour.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Colours.o: ../../../src/juce_appframework/gui/graphics/colour/juce_Colours.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/colour/juce_Colours.cpp -o ../../../bin/intermediate_devcpp/juce_Colours.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_EdgeTable.o: ../../../src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/contexts/juce_EdgeTable.cpp -o ../../../bin/intermediate_devcpp/juce_EdgeTable.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Graphics.o: ../../../src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp -o ../../../bin/intermediate_devcpp/juce_Graphics.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Justification.o: ../../../src/juce_appframework/gui/graphics/contexts/juce_Justification.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/contexts/juce_Justification.cpp -o ../../../bin/intermediate_devcpp/juce_Justification.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DropShadowEffect.o: ../../../src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/effects/juce_DropShadowEffect.cpp -o ../../../bin/intermediate_devcpp/juce_DropShadowEffect.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GlowEffect.o: ../../../src/juce_appframework/gui/graphics/effects/juce_GlowEffect.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/effects/juce_GlowEffect.cpp -o ../../../bin/intermediate_devcpp/juce_GlowEffect.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ReduceOpacityEffect.o: ../../../src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/effects/juce_ReduceOpacityEffect.cpp -o ../../../bin/intermediate_devcpp/juce_ReduceOpacityEffect.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Font.o: ../../../src/juce_appframework/gui/graphics/fonts/juce_Font.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/fonts/juce_Font.cpp -o ../../../bin/intermediate_devcpp/juce_Font.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GlyphArrangement.o: ../../../src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/fonts/juce_GlyphArrangement.cpp -o ../../../bin/intermediate_devcpp/juce_GlyphArrangement.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TextLayout.o: ../../../src/juce_appframework/gui/graphics/fonts/juce_TextLayout.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/fonts/juce_TextLayout.cpp -o ../../../bin/intermediate_devcpp/juce_TextLayout.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Typeface.o: ../../../src/juce_appframework/gui/graphics/fonts/juce_Typeface.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/fonts/juce_Typeface.cpp -o ../../../bin/intermediate_devcpp/juce_Typeface.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AffineTransform.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_AffineTransform.cpp -o ../../../bin/intermediate_devcpp/juce_AffineTransform.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Line.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_Line.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_Line.cpp -o ../../../bin/intermediate_devcpp/juce_Line.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Path.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_Path.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_Path.cpp -o ../../../bin/intermediate_devcpp/juce_Path.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PathIterator.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_PathIterator.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_PathIterator.cpp -o ../../../bin/intermediate_devcpp/juce_PathIterator.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PathStrokeType.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_PathStrokeType.cpp -o ../../../bin/intermediate_devcpp/juce_PathStrokeType.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Point.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_Point.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_Point.cpp -o ../../../bin/intermediate_devcpp/juce_Point.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Rectangle.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_Rectangle.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_Rectangle.cpp -o ../../../bin/intermediate_devcpp/juce_Rectangle.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_RectangleList.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_RectangleList.cpp -o ../../../bin/intermediate_devcpp/juce_RectangleList.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Image.o: ../../../src/juce_appframework/gui/graphics/imaging/juce_Image.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/juce_Image.cpp -o ../../../bin/intermediate_devcpp/juce_Image.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ImageCache.o: ../../../src/juce_appframework/gui/graphics/imaging/juce_ImageCache.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/juce_ImageCache.cpp -o ../../../bin/intermediate_devcpp/juce_ImageCache.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ImageConvolutionKernel.o: ../../../src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/juce_ImageConvolutionKernel.cpp -o ../../../bin/intermediate_devcpp/juce_ImageConvolutionKernel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ImageFileFormat.o: ../../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.cpp -o ../../../bin/intermediate_devcpp/juce_ImageFileFormat.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GIFLoader.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp -o ../../../bin/intermediate_devcpp/juce_GIFLoader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_JPEGLoader.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_JPEGLoader.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_JPEGLoader.cpp -o ../../../bin/intermediate_devcpp/juce_JPEGLoader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PNGLoader.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_PNGLoader.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/juce_PNGLoader.cpp -o ../../../bin/intermediate_devcpp/juce_PNGLoader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_ASIO.o: ../platform_specific_code/juce_win32_ASIO.cpp + $(CPP) -c ../platform_specific_code/juce_win32_ASIO.cpp -o ../../../bin/intermediate_devcpp/juce_win32_ASIO.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_AudioCDReader.o: ../platform_specific_code/juce_win32_AudioCDReader.cpp + $(CPP) -c ../platform_specific_code/juce_win32_AudioCDReader.cpp -o ../../../bin/intermediate_devcpp/juce_win32_AudioCDReader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_DirectSound.o: ../platform_specific_code/juce_win32_DirectSound.cpp + $(CPP) -c ../platform_specific_code/juce_win32_DirectSound.cpp -o ../../../bin/intermediate_devcpp/juce_win32_DirectSound.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_DynamicLibraryLoader.o: ../platform_specific_code/juce_win32_DynamicLibraryLoader.cpp + $(CPP) -c ../platform_specific_code/juce_win32_DynamicLibraryLoader.cpp -o ../../../bin/intermediate_devcpp/juce_win32_DynamicLibraryLoader.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_FileChooser.o: ../platform_specific_code/juce_win32_FileChooser.cpp + $(CPP) -c ../platform_specific_code/juce_win32_FileChooser.cpp -o ../../../bin/intermediate_devcpp/juce_win32_FileChooser.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Files.o: ../platform_specific_code/juce_win32_Files.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Files.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Files.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Fonts.o: ../platform_specific_code/juce_win32_Fonts.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Fonts.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Fonts.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Messaging.o: ../platform_specific_code/juce_win32_Messaging.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Messaging.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Messaging.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Midi.o: ../platform_specific_code/juce_win32_Midi.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Midi.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Midi.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Misc.o: ../platform_specific_code/juce_win32_Misc.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Misc.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Misc.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Network.o: ../platform_specific_code/juce_win32_Network.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Network.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Network.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_PlatformUtils.o: ../platform_specific_code/juce_win32_PlatformUtils.cpp + $(CPP) -c ../platform_specific_code/juce_win32_PlatformUtils.cpp -o ../../../bin/intermediate_devcpp/juce_win32_PlatformUtils.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_SystemStats.o: ../platform_specific_code/juce_win32_SystemStats.cpp + $(CPP) -c ../platform_specific_code/juce_win32_SystemStats.cpp -o ../../../bin/intermediate_devcpp/juce_win32_SystemStats.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Threads.o: ../platform_specific_code/juce_win32_Threads.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Threads.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Threads.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_win32_Windowing.o: ../platform_specific_code/juce_win32_Windowing.cpp + $(CPP) -c ../platform_specific_code/juce_win32_Windowing.cpp -o ../../../bin/intermediate_devcpp/juce_win32_Windowing.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioFormatReaderSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_AudioFormatReaderSource.cpp -o ../../../bin/intermediate_devcpp/juce_AudioFormatReaderSource.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioSourcePlayer.o: ../../../src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_AudioSourcePlayer.cpp -o ../../../bin/intermediate_devcpp/juce_AudioSourcePlayer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioTransportSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp -o ../../../bin/intermediate_devcpp/juce_AudioTransportSource.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BufferingAudioSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp -o ../../../bin/intermediate_devcpp/juce_BufferingAudioSource.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MixerAudioSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_MixerAudioSource.cpp -o ../../../bin/intermediate_devcpp/juce_MixerAudioSource.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ResamplingAudioSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_ResamplingAudioSource.cpp -o ../../../bin/intermediate_devcpp/juce_ResamplingAudioSource.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TimeSliceThread.o: ../../../src/juce_core/threads/juce_TimeSliceThread.cpp + $(CPP) -c ../../../src/juce_core/threads/juce_TimeSliceThread.cpp -o ../../../bin/intermediate_devcpp/juce_TimeSliceThread.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ReadWriteLock.o: ../../../src/juce_core/threads/juce_ReadWriteLock.cpp + $(CPP) -c ../../../src/juce_core/threads/juce_ReadWriteLock.cpp -o ../../../bin/intermediate_devcpp/juce_ReadWriteLock.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_LocalisedStrings.o: ../../../src/juce_core/text/juce_LocalisedStrings.cpp + $(CPP) -c ../../../src/juce_core/text/juce_LocalisedStrings.cpp -o ../../../bin/intermediate_devcpp/juce_LocalisedStrings.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PropertySet.o: ../../../src/juce_core/containers/juce_PropertySet.cpp + $(CPP) -c ../../../src/juce_core/containers/juce_PropertySet.cpp -o ../../../bin/intermediate_devcpp/juce_PropertySet.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Drawable.o: ../../../src/juce_appframework/gui/graphics/drawables/juce_Drawable.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/drawables/juce_Drawable.cpp -o ../../../bin/intermediate_devcpp/juce_Drawable.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DrawableComposite.o: ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawableComposite.cpp -o ../../../bin/intermediate_devcpp/juce_DrawableComposite.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DrawableImage.o: ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawableImage.cpp -o ../../../bin/intermediate_devcpp/juce_DrawableImage.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DrawablePath.o: ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawablePath.cpp -o ../../../bin/intermediate_devcpp/juce_DrawablePath.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DrawableText.o: ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawableText.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/drawables/juce_DrawableText.cpp -o ../../../bin/intermediate_devcpp/juce_DrawableText.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ColourGradient.o: ../../../src/juce_appframework/gui/graphics/colour/juce_ColourGradient.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/colour/juce_ColourGradient.cpp -o ../../../bin/intermediate_devcpp/juce_ColourGradient.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ArrowButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_ArrowButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_ArrowButton.cpp -o ../../../bin/intermediate_devcpp/juce_ArrowButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Button.o: ../../../src/juce_appframework/gui/components/buttons/juce_Button.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_Button.cpp -o ../../../bin/intermediate_devcpp/juce_Button.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DrawableButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp -o ../../../bin/intermediate_devcpp/juce_DrawableButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_HyperlinkButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_HyperlinkButton.cpp -o ../../../bin/intermediate_devcpp/juce_HyperlinkButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ImageButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp -o ../../../bin/intermediate_devcpp/juce_ImageButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ShapeButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_ShapeButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_ShapeButton.cpp -o ../../../bin/intermediate_devcpp/juce_ShapeButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TextButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_TextButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_TextButton.cpp -o ../../../bin/intermediate_devcpp/juce_TextButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ToggleButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_ToggleButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_ToggleButton.cpp -o ../../../bin/intermediate_devcpp/juce_ToggleButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComboBox.o: ../../../src/juce_appframework/gui/components/controls/juce_ComboBox.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_ComboBox.cpp -o ../../../bin/intermediate_devcpp/juce_ComboBox.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Label.o: ../../../src/juce_appframework/gui/components/controls/juce_Label.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_Label.cpp -o ../../../bin/intermediate_devcpp/juce_Label.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ListBox.o: ../../../src/juce_appframework/gui/components/controls/juce_ListBox.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_ListBox.cpp -o ../../../bin/intermediate_devcpp/juce_ListBox.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ProgressBar.o: ../../../src/juce_appframework/gui/components/controls/juce_ProgressBar.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_ProgressBar.cpp -o ../../../bin/intermediate_devcpp/juce_ProgressBar.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Slider.o: ../../../src/juce_appframework/gui/components/controls/juce_Slider.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_Slider.cpp -o ../../../bin/intermediate_devcpp/juce_Slider.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TextEditor.o: ../../../src/juce_appframework/gui/components/controls/juce_TextEditor.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_TextEditor.cpp -o ../../../bin/intermediate_devcpp/juce_TextEditor.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TreeView.o: ../../../src/juce_appframework/gui/components/controls/juce_TreeView.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_TreeView.cpp -o ../../../bin/intermediate_devcpp/juce_TreeView.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_KeyListener.o: ../../../src/juce_appframework/gui/components/keyboard/juce_KeyListener.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/keyboard/juce_KeyListener.cpp -o ../../../bin/intermediate_devcpp/juce_KeyListener.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_KeyMappingEditorComponent.o: ../../../src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp -o ../../../bin/intermediate_devcpp/juce_KeyMappingEditorComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_KeyPress.o: ../../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.cpp -o ../../../bin/intermediate_devcpp/juce_KeyPress.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_KeyPressMappingSet.o: ../../../src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/keyboard/juce_KeyPressMappingSet.cpp -o ../../../bin/intermediate_devcpp/juce_KeyPressMappingSet.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ModifierKeys.o: ../../../src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/keyboard/juce_ModifierKeys.cpp -o ../../../bin/intermediate_devcpp/juce_ModifierKeys.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_GroupComponent.o: ../../../src/juce_appframework/gui/components/layout/juce_GroupComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_GroupComponent.cpp -o ../../../bin/intermediate_devcpp/juce_GroupComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ResizableBorderComponent.o: ../../../src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_ResizableBorderComponent.cpp -o ../../../bin/intermediate_devcpp/juce_ResizableBorderComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ResizableCornerComponent.o: ../../../src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_ResizableCornerComponent.cpp -o ../../../bin/intermediate_devcpp/juce_ResizableCornerComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ScrollBar.o: ../../../src/juce_appframework/gui/components/layout/juce_ScrollBar.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_ScrollBar.cpp -o ../../../bin/intermediate_devcpp/juce_ScrollBar.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_StretchableLayoutManager.o: ../../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutManager.cpp -o ../../../bin/intermediate_devcpp/juce_StretchableLayoutManager.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_StretchableLayoutResizerBar.o: ../../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_StretchableLayoutResizerBar.cpp -o ../../../bin/intermediate_devcpp/juce_StretchableLayoutResizerBar.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TabbedButtonBar.o: ../../../src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_TabbedButtonBar.cpp -o ../../../bin/intermediate_devcpp/juce_TabbedButtonBar.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TabbedComponent.o: ../../../src/juce_appframework/gui/components/layout/juce_TabbedComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_TabbedComponent.cpp -o ../../../bin/intermediate_devcpp/juce_TabbedComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Viewport.o: ../../../src/juce_appframework/gui/components/layout/juce_Viewport.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_Viewport.cpp -o ../../../bin/intermediate_devcpp/juce_Viewport.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_LookAndFeel.o: ../../../src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp -o ../../../bin/intermediate_devcpp/juce_LookAndFeel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ShinyLookAndFeel.o: ../../../src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/lookandfeel/juce_ShinyLookAndFeel.cpp -o ../../../bin/intermediate_devcpp/juce_ShinyLookAndFeel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PopupMenu.o: ../../../src/juce_appframework/gui/components/menus/juce_PopupMenu.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/menus/juce_PopupMenu.cpp -o ../../../bin/intermediate_devcpp/juce_PopupMenu.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComponentDragger.o: ../../../src/juce_appframework/gui/components/mouse/juce_ComponentDragger.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/mouse/juce_ComponentDragger.cpp -o ../../../bin/intermediate_devcpp/juce_ComponentDragger.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DragAndDropContainer.o: ../../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.cpp -o ../../../bin/intermediate_devcpp/juce_DragAndDropContainer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MouseCursor.o: ../../../src/juce_appframework/gui/components/mouse/juce_MouseCursor.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/mouse/juce_MouseCursor.cpp -o ../../../bin/intermediate_devcpp/juce_MouseCursor.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MouseEvent.o: ../../../src/juce_appframework/gui/components/mouse/juce_MouseEvent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/mouse/juce_MouseEvent.cpp -o ../../../bin/intermediate_devcpp/juce_MouseEvent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MouseHoverDetector.o: ../../../src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/mouse/juce_MouseHoverDetector.cpp -o ../../../bin/intermediate_devcpp/juce_MouseHoverDetector.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MouseListener.o: ../../../src/juce_appframework/gui/components/mouse/juce_MouseListener.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/mouse/juce_MouseListener.cpp -o ../../../bin/intermediate_devcpp/juce_MouseListener.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BubbleComponent.o: ../../../src/juce_appframework/gui/components/special/juce_BubbleComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_BubbleComponent.cpp -o ../../../bin/intermediate_devcpp/juce_BubbleComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ColourSelector.o: ../../../src/juce_appframework/gui/components/special/juce_ColourSelector.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_ColourSelector.cpp -o ../../../bin/intermediate_devcpp/juce_ColourSelector.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DropShadower.o: ../../../src/juce_appframework/gui/components/special/juce_DropShadower.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_DropShadower.cpp -o ../../../bin/intermediate_devcpp/juce_DropShadower.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_OpenGLComponent.o: ../../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.cpp -o ../../../bin/intermediate_devcpp/juce_OpenGLComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PreferencesPanel.o: ../../../src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp -o ../../../bin/intermediate_devcpp/juce_PreferencesPanel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_QuickTimeMovieComponent.o: ../../../src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_QuickTimeMovieComponent.cpp -o ../../../bin/intermediate_devcpp/juce_QuickTimeMovieComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AlertWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_AlertWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_AlertWindow.cpp -o ../../../bin/intermediate_devcpp/juce_AlertWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DialogWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_DialogWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_DialogWindow.cpp -o ../../../bin/intermediate_devcpp/juce_DialogWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ResizableWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_ResizableWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_ResizableWindow.cpp -o ../../../bin/intermediate_devcpp/juce_ResizableWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SplashScreen.o: ../../../src/juce_appframework/gui/components/windows/juce_SplashScreen.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_SplashScreen.cpp -o ../../../bin/intermediate_devcpp/juce_SplashScreen.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ThreadWithProgressWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_ThreadWithProgressWindow.cpp -o ../../../bin/intermediate_devcpp/juce_ThreadWithProgressWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ToolTipWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_ToolTipWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_ToolTipWindow.cpp -o ../../../bin/intermediate_devcpp/juce_ToolTipWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MenuBarComponent.o: ../../../src/juce_appframework/gui/components/menus/juce_MenuBarComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/menus/juce_MenuBarComponent.cpp -o ../../../bin/intermediate_devcpp/juce_MenuBarComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BubbleMessageComponent.o: ../../../src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_BubbleMessageComponent.cpp -o ../../../bin/intermediate_devcpp/juce_BubbleMessageComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Component.o: ../../../src/juce_appframework/gui/components/juce_Component.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/juce_Component.cpp -o ../../../bin/intermediate_devcpp/juce_Component.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComponentListener.o: ../../../src/juce_appframework/gui/components/juce_ComponentListener.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/juce_ComponentListener.cpp -o ../../../bin/intermediate_devcpp/juce_ComponentListener.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Desktop.o: ../../../src/juce_appframework/gui/components/juce_Desktop.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/juce_Desktop.cpp -o ../../../bin/intermediate_devcpp/juce_Desktop.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ToneGeneratorAudioSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp -o ../../../bin/intermediate_devcpp/juce_ToneGeneratorAudioSource.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/adler32.o: ../../../src/juce_core/io/streams/zlib/adler32.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/adler32.c -o ../../../bin/intermediate_devcpp/adler32.o $(CFLAGS) + +../../../bin/intermediate_devcpp/compress.o: ../../../src/juce_core/io/streams/zlib/compress.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/compress.c -o ../../../bin/intermediate_devcpp/compress.o $(CFLAGS) + +../../../bin/intermediate_devcpp/crc32.o: ../../../src/juce_core/io/streams/zlib/crc32.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/crc32.c -o ../../../bin/intermediate_devcpp/crc32.o $(CFLAGS) + +../../../bin/intermediate_devcpp/deflate.o: ../../../src/juce_core/io/streams/zlib/deflate.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/deflate.c -o ../../../bin/intermediate_devcpp/deflate.o $(CFLAGS) + +../../../bin/intermediate_devcpp/infback.o: ../../../src/juce_core/io/streams/zlib/infback.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/infback.c -o ../../../bin/intermediate_devcpp/infback.o $(CFLAGS) + +../../../bin/intermediate_devcpp/inffast.o: ../../../src/juce_core/io/streams/zlib/inffast.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/inffast.c -o ../../../bin/intermediate_devcpp/inffast.o $(CFLAGS) + +../../../bin/intermediate_devcpp/inflate.o: ../../../src/juce_core/io/streams/zlib/inflate.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/inflate.c -o ../../../bin/intermediate_devcpp/inflate.o $(CFLAGS) + +../../../bin/intermediate_devcpp/inftrees.o: ../../../src/juce_core/io/streams/zlib/inftrees.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/inftrees.c -o ../../../bin/intermediate_devcpp/inftrees.o $(CFLAGS) + +../../../bin/intermediate_devcpp/trees.o: ../../../src/juce_core/io/streams/zlib/trees.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/trees.c -o ../../../bin/intermediate_devcpp/trees.o $(CFLAGS) + +../../../bin/intermediate_devcpp/uncompr.o: ../../../src/juce_core/io/streams/zlib/uncompr.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/uncompr.c -o ../../../bin/intermediate_devcpp/uncompr.o $(CFLAGS) + +../../../bin/intermediate_devcpp/zutil.o: ../../../src/juce_core/io/streams/zlib/zutil.c + $(CC) -c ../../../src/juce_core/io/streams/zlib/zutil.c -o ../../../bin/intermediate_devcpp/zutil.o $(CFLAGS) + +../../../bin/intermediate_devcpp/png.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/png.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/png.c -o ../../../bin/intermediate_devcpp/png.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngerror.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngerror.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngerror.c -o ../../../bin/intermediate_devcpp/pngerror.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pnggccrd.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pnggccrd.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pnggccrd.c -o ../../../bin/intermediate_devcpp/pnggccrd.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngget.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngget.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngget.c -o ../../../bin/intermediate_devcpp/pngget.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngmem.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngmem.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngmem.c -o ../../../bin/intermediate_devcpp/pngmem.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngpread.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngpread.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngpread.c -o ../../../bin/intermediate_devcpp/pngpread.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngread.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngread.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngread.c -o ../../../bin/intermediate_devcpp/pngread.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngrio.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrio.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrio.c -o ../../../bin/intermediate_devcpp/pngrio.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngrtran.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrtran.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrtran.c -o ../../../bin/intermediate_devcpp/pngrtran.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngrutil.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrutil.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngrutil.c -o ../../../bin/intermediate_devcpp/pngrutil.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngset.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngset.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngset.c -o ../../../bin/intermediate_devcpp/pngset.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngtrans.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngtrans.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngtrans.c -o ../../../bin/intermediate_devcpp/pngtrans.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngvcrd.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngvcrd.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngvcrd.c -o ../../../bin/intermediate_devcpp/pngvcrd.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngwio.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwio.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwio.c -o ../../../bin/intermediate_devcpp/pngwio.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngwrite.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwrite.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwrite.c -o ../../../bin/intermediate_devcpp/pngwrite.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngwtran.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwtran.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwtran.c -o ../../../bin/intermediate_devcpp/pngwtran.o $(CFLAGS) + +../../../bin/intermediate_devcpp/pngwutil.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwutil.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib/pngwutil.c -o ../../../bin/intermediate_devcpp/pngwutil.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcapimin.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapimin.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapimin.c -o ../../../bin/intermediate_devcpp/jcapimin.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcapistd.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapistd.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcapistd.c -o ../../../bin/intermediate_devcpp/jcapistd.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jccoefct.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccoefct.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccoefct.c -o ../../../bin/intermediate_devcpp/jccoefct.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jccolor.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccolor.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jccolor.c -o ../../../bin/intermediate_devcpp/jccolor.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcdctmgr.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcdctmgr.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcdctmgr.c -o ../../../bin/intermediate_devcpp/jcdctmgr.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jchuff.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jchuff.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jchuff.c -o ../../../bin/intermediate_devcpp/jchuff.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcinit.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcinit.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcinit.c -o ../../../bin/intermediate_devcpp/jcinit.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcmainct.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmainct.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmainct.c -o ../../../bin/intermediate_devcpp/jcmainct.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcmarker.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmarker.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmarker.c -o ../../../bin/intermediate_devcpp/jcmarker.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcmaster.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmaster.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcmaster.c -o ../../../bin/intermediate_devcpp/jcmaster.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcomapi.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcomapi.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcomapi.c -o ../../../bin/intermediate_devcpp/jcomapi.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcparam.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcparam.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcparam.c -o ../../../bin/intermediate_devcpp/jcparam.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcphuff.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcphuff.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcphuff.c -o ../../../bin/intermediate_devcpp/jcphuff.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcprepct.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcprepct.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcprepct.c -o ../../../bin/intermediate_devcpp/jcprepct.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jcsample.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcsample.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jcsample.c -o ../../../bin/intermediate_devcpp/jcsample.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jctrans.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jctrans.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jctrans.c -o ../../../bin/intermediate_devcpp/jctrans.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdapimin.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapimin.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapimin.c -o ../../../bin/intermediate_devcpp/jdapimin.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdapistd.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapistd.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdapistd.c -o ../../../bin/intermediate_devcpp/jdapistd.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdatasrc.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdatasrc.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdatasrc.c -o ../../../bin/intermediate_devcpp/jdatasrc.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdcoefct.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcoefct.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcoefct.c -o ../../../bin/intermediate_devcpp/jdcoefct.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdcolor.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcolor.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdcolor.c -o ../../../bin/intermediate_devcpp/jdcolor.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jddctmgr.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jddctmgr.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jddctmgr.c -o ../../../bin/intermediate_devcpp/jddctmgr.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdhuff.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdhuff.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdhuff.c -o ../../../bin/intermediate_devcpp/jdhuff.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdinput.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdinput.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdinput.c -o ../../../bin/intermediate_devcpp/jdinput.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdmainct.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmainct.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmainct.c -o ../../../bin/intermediate_devcpp/jdmainct.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdmarker.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmarker.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmarker.c -o ../../../bin/intermediate_devcpp/jdmarker.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdmaster.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmaster.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmaster.c -o ../../../bin/intermediate_devcpp/jdmaster.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdmerge.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmerge.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdmerge.c -o ../../../bin/intermediate_devcpp/jdmerge.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdphuff.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdphuff.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdphuff.c -o ../../../bin/intermediate_devcpp/jdphuff.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdpostct.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdpostct.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdpostct.c -o ../../../bin/intermediate_devcpp/jdpostct.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdsample.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdsample.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdsample.c -o ../../../bin/intermediate_devcpp/jdsample.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jdtrans.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdtrans.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jdtrans.c -o ../../../bin/intermediate_devcpp/jdtrans.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jerror.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jerror.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jerror.c -o ../../../bin/intermediate_devcpp/jerror.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jfdctflt.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctflt.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctflt.c -o ../../../bin/intermediate_devcpp/jfdctflt.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jfdctfst.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctfst.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctfst.c -o ../../../bin/intermediate_devcpp/jfdctfst.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jfdctint.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctint.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jfdctint.c -o ../../../bin/intermediate_devcpp/jfdctint.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jidctflt.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctflt.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctflt.c -o ../../../bin/intermediate_devcpp/jidctflt.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jidctfst.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctfst.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctfst.c -o ../../../bin/intermediate_devcpp/jidctfst.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jidctint.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctint.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctint.c -o ../../../bin/intermediate_devcpp/jidctint.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jidctred.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctred.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jidctred.c -o ../../../bin/intermediate_devcpp/jidctred.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jmemmgr.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemmgr.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemmgr.c -o ../../../bin/intermediate_devcpp/jmemmgr.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jmemnobs.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemnobs.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jmemnobs.c -o ../../../bin/intermediate_devcpp/jmemnobs.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jquant1.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant1.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant1.c -o ../../../bin/intermediate_devcpp/jquant1.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jquant2.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant2.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jquant2.c -o ../../../bin/intermediate_devcpp/jquant2.o $(CFLAGS) + +../../../bin/intermediate_devcpp/jutils.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jutils.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/jutils.c -o ../../../bin/intermediate_devcpp/jutils.o $(CFLAGS) + +../../../bin/intermediate_devcpp/transupp.o: ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/transupp.c + $(CC) -c ../../../src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib/transupp.c -o ../../../bin/intermediate_devcpp/transupp.o $(CFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiKeyboardComponent.o: ../../../src/juce_appframework/gui/components/special/juce_MidiKeyboardComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_MidiKeyboardComponent.cpp -o ../../../bin/intermediate_devcpp/juce_MidiKeyboardComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioFormatManager.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormatManager.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_AudioFormatManager.cpp -o ../../../bin/intermediate_devcpp/juce_AudioFormatManager.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_LowLevelGraphicsSoftwareRenderer.o: ../../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp -o ../../../bin/intermediate_devcpp/juce_LowLevelGraphicsSoftwareRenderer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioDeviceManager.o: ../../../src/juce_appframework/audio/devices/juce_AudioDeviceManager.cpp + $(CPP) -c ../../../src/juce_appframework/audio/devices/juce_AudioDeviceManager.cpp -o ../../../bin/intermediate_devcpp/juce_AudioDeviceManager.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioDeviceSelectorComponent.o: ../../../src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp -o ../../../bin/intermediate_devcpp/juce_AudioDeviceSelectorComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DocumentWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_DocumentWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_DocumentWindow.cpp -o ../../../bin/intermediate_devcpp/juce_DocumentWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComponentBoundsConstrainer.o: ../../../src/juce_appframework/gui/components/layout/juce_ComponentBoundsConstrainer.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_ComponentBoundsConstrainer.cpp -o ../../../bin/intermediate_devcpp/juce_ComponentBoundsConstrainer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiBuffer.o: ../../../src/juce_appframework/audio/midi/juce_MidiBuffer.cpp + $(CPP) -c ../../../src/juce_appframework/audio/midi/juce_MidiBuffer.cpp -o ../../../bin/intermediate_devcpp/juce_MidiBuffer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiFile.o: ../../../src/juce_appframework/audio/midi/juce_MidiFile.cpp + $(CPP) -c ../../../src/juce_appframework/audio/midi/juce_MidiFile.cpp -o ../../../bin/intermediate_devcpp/juce_MidiFile.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiKeyboardState.o: ../../../src/juce_appframework/audio/midi/juce_MidiKeyboardState.cpp + $(CPP) -c ../../../src/juce_appframework/audio/midi/juce_MidiKeyboardState.cpp -o ../../../bin/intermediate_devcpp/juce_MidiKeyboardState.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiMessage.o: ../../../src/juce_appframework/audio/midi/juce_MidiMessage.cpp + $(CPP) -c ../../../src/juce_appframework/audio/midi/juce_MidiMessage.cpp -o ../../../bin/intermediate_devcpp/juce_MidiMessage.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiMessageCollector.o: ../../../src/juce_appframework/audio/midi/juce_MidiMessageCollector.cpp + $(CPP) -c ../../../src/juce_appframework/audio/midi/juce_MidiMessageCollector.cpp -o ../../../bin/intermediate_devcpp/juce_MidiMessageCollector.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MidiMessageSequence.o: ../../../src/juce_appframework/audio/midi/juce_MidiMessageSequence.cpp + $(CPP) -c ../../../src/juce_appframework/audio/midi/juce_MidiMessageSequence.cpp -o ../../../bin/intermediate_devcpp/juce_MidiMessageSequence.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TopLevelWindow.o: ../../../src/juce_appframework/gui/components/windows/juce_TopLevelWindow.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_TopLevelWindow.cpp -o ../../../bin/intermediate_devcpp/juce_TopLevelWindow.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComponentPeer.o: ../../../src/juce_appframework/gui/components/windows/juce_ComponentPeer.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/windows/juce_ComponentPeer.cpp -o ../../../bin/intermediate_devcpp/juce_ComponentPeer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BorderSize.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_BorderSize.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_BorderSize.cpp -o ../../../bin/intermediate_devcpp/juce_BorderSize.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PropertiesFile.o: ../../../src/juce_appframework/application/juce_PropertiesFile.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_PropertiesFile.cpp -o ../../../bin/intermediate_devcpp/juce_PropertiesFile.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileBasedDocument.o: ../../../src/juce_appframework/documents/juce_FileBasedDocument.cpp + $(CPP) -c ../../../src/juce_appframework/documents/juce_FileBasedDocument.cpp -o ../../../bin/intermediate_devcpp/juce_FileBasedDocument.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_RecentlyOpenedFilesList.o: ../../../src/juce_appframework/documents/juce_RecentlyOpenedFilesList.cpp + $(CPP) -c ../../../src/juce_appframework/documents/juce_RecentlyOpenedFilesList.cpp -o ../../../bin/intermediate_devcpp/juce_RecentlyOpenedFilesList.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_UndoManager.o: ../../../src/juce_appframework/documents/juce_UndoManager.cpp + $(CPP) -c ../../../src/juce_appframework/documents/juce_UndoManager.cpp -o ../../../bin/intermediate_devcpp/juce_UndoManager.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_DirectoryContentsList.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_DirectoryContentsList.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_DirectoryContentsList.cpp -o ../../../bin/intermediate_devcpp/juce_DirectoryContentsList.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileBrowserComponent.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_FileBrowserComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_FileBrowserComponent.cpp -o ../../../bin/intermediate_devcpp/juce_FileBrowserComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileChooser.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.cpp -o ../../../bin/intermediate_devcpp/juce_FileChooser.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileChooserDialogBox.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooserDialogBox.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooserDialogBox.cpp -o ../../../bin/intermediate_devcpp/juce_FileChooserDialogBox.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileFilter.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_FileFilter.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_FileFilter.cpp -o ../../../bin/intermediate_devcpp/juce_FileFilter.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FileListComponent.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_FileListComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_FileListComponent.cpp -o ../../../bin/intermediate_devcpp/juce_FileListComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ImagePreviewComponent.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_ImagePreviewComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_ImagePreviewComponent.cpp -o ../../../bin/intermediate_devcpp/juce_ImagePreviewComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_WildcardFileFilter.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_WildcardFileFilter.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_WildcardFileFilter.cpp -o ../../../bin/intermediate_devcpp/juce_WildcardFileFilter.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioIODevice.o: ../../../src/juce_appframework/audio/devices/juce_AudioIODevice.cpp + $(CPP) -c ../../../src/juce_appframework/audio/devices/juce_AudioIODevice.cpp -o ../../../bin/intermediate_devcpp/juce_AudioIODevice.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioIODeviceType.o: ../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.cpp + $(CPP) -c ../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.cpp -o ../../../bin/intermediate_devcpp/juce_AudioIODeviceType.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Socket.o: ../../../src/juce_core/io/network/juce_Socket.cpp + $(CPP) -c ../../../src/juce_core/io/network/juce_Socket.cpp -o ../../../bin/intermediate_devcpp/juce_Socket.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_NamedPipe.o: ../../../src/juce_core/io/files/juce_NamedPipe.cpp + $(CPP) -c ../../../src/juce_core/io/files/juce_NamedPipe.cpp -o ../../../bin/intermediate_devcpp/juce_NamedPipe.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_InterprocessConnection.o: ../../../src/juce_appframework/events/juce_InterprocessConnection.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_InterprocessConnection.cpp -o ../../../bin/intermediate_devcpp/juce_InterprocessConnection.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_InterprocessConnectionServer.o: ../../../src/juce_appframework/events/juce_InterprocessConnectionServer.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_InterprocessConnectionServer.cpp -o ../../../bin/intermediate_devcpp/juce_InterprocessConnectionServer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FlacAudioFormat.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_FlacAudioFormat.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_FlacAudioFormat.cpp -o ../../../bin/intermediate_devcpp/juce_FlacAudioFormat.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_OggVorbisAudioFormat.o: ../../../src/juce_appframework/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp -o ../../../bin/intermediate_devcpp/juce_OggVorbisAudioFormat.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ApplicationCommandInfo.o: ../../../src/juce_appframework/application/juce_ApplicationCommandInfo.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_ApplicationCommandInfo.cpp -o ../../../bin/intermediate_devcpp/juce_ApplicationCommandInfo.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ApplicationCommandManager.o: ../../../src/juce_appframework/application/juce_ApplicationCommandManager.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_ApplicationCommandManager.cpp -o ../../../bin/intermediate_devcpp/juce_ApplicationCommandManager.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ApplicationCommandTarget.o: ../../../src/juce_appframework/application/juce_ApplicationCommandTarget.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_ApplicationCommandTarget.cpp -o ../../../bin/intermediate_devcpp/juce_ApplicationCommandTarget.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PositionedRectangle.o: ../../../src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.cpp -o ../../../bin/intermediate_devcpp/juce_PositionedRectangle.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MultiDocumentPanel.o: ../../../src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.cpp -o ../../../bin/intermediate_devcpp/juce_MultiDocumentPanel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ButtonPropertyComponent.o: ../../../src/juce_appframework/gui/components/properties/juce_ButtonPropertyComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_ButtonPropertyComponent.cpp -o ../../../bin/intermediate_devcpp/juce_ButtonPropertyComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ChoicePropertyComponent.o: ../../../src/juce_appframework/gui/components/properties/juce_ChoicePropertyComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_ChoicePropertyComponent.cpp -o ../../../bin/intermediate_devcpp/juce_ChoicePropertyComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PropertyComponent.o: ../../../src/juce_appframework/gui/components/properties/juce_PropertyComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_PropertyComponent.cpp -o ../../../bin/intermediate_devcpp/juce_PropertyComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_PropertyPanel.o: ../../../src/juce_appframework/gui/components/properties/juce_PropertyPanel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_PropertyPanel.cpp -o ../../../bin/intermediate_devcpp/juce_PropertyPanel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SliderPropertyComponent.o: ../../../src/juce_appframework/gui/components/properties/juce_SliderPropertyComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_SliderPropertyComponent.cpp -o ../../../bin/intermediate_devcpp/juce_SliderPropertyComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TextPropertyComponent.o: ../../../src/juce_appframework/gui/components/properties/juce_TextPropertyComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_TextPropertyComponent.cpp -o ../../../bin/intermediate_devcpp/juce_TextPropertyComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MagnifierComponent.o: ../../../src/juce_appframework/gui/components/special/juce_MagnifierComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_MagnifierComponent.cpp -o ../../../bin/intermediate_devcpp/juce_MagnifierComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_FilenameComponent.o: ../../../src/juce_appframework/gui/components/filebrowser/juce_FilenameComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/filebrowser/juce_FilenameComponent.cpp -o ../../../bin/intermediate_devcpp/juce_FilenameComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_KeyboardFocusTraverser.o: ../../../src/juce_appframework/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp -o ../../../bin/intermediate_devcpp/juce_KeyboardFocusTraverser.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_BooleanPropertyComponent.o: ../../../src/juce_appframework/gui/components/properties/juce_BooleanPropertyComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/properties/juce_BooleanPropertyComponent.cpp -o ../../../bin/intermediate_devcpp/juce_BooleanPropertyComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_CharacterFunctions.o: ../../../src/juce_core/text/juce_CharacterFunctions.cpp + $(CPP) -c ../../../src/juce_core/text/juce_CharacterFunctions.cpp -o ../../../bin/intermediate_devcpp/juce_CharacterFunctions.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SVGParser.o: ../../../src/juce_appframework/gui/graphics/drawables/juce_SVGParser.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/drawables/juce_SVGParser.cpp -o ../../../bin/intermediate_devcpp/juce_SVGParser.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_RectanglePlacement.o: ../../../src/juce_appframework/gui/graphics/contexts/juce_RectanglePlacement.cpp + $(CPP) -c ../../../src/juce_appframework/gui/graphics/contexts/juce_RectanglePlacement.cpp -o ../../../bin/intermediate_devcpp/juce_RectanglePlacement.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TableHeaderComponent.o: ../../../src/juce_appframework/gui/components/controls/juce_TableHeaderComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_TableHeaderComponent.cpp -o ../../../bin/intermediate_devcpp/juce_TableHeaderComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_TableListBox.o: ../../../src/juce_appframework/gui/components/controls/juce_TableListBox.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_TableListBox.cpp -o ../../../bin/intermediate_devcpp/juce_TableListBox.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_StretchableObjectResizer.o: ../../../src/juce_appframework/gui/components/layout/juce_StretchableObjectResizer.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_StretchableObjectResizer.cpp -o ../../../bin/intermediate_devcpp/juce_StretchableObjectResizer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Toolbar.o: ../../../src/juce_appframework/gui/components/controls/juce_Toolbar.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_Toolbar.cpp -o ../../../bin/intermediate_devcpp/juce_Toolbar.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ToolbarItemComponent.o: ../../../src/juce_appframework/gui/components/controls/juce_ToolbarItemComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_ToolbarItemComponent.cpp -o ../../../bin/intermediate_devcpp/juce_ToolbarItemComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ToolbarItemPalette.o: ../../../src/juce_appframework/gui/components/controls/juce_ToolbarItemPalette.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/controls/juce_ToolbarItemPalette.cpp -o ../../../bin/intermediate_devcpp/juce_ToolbarItemPalette.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComponentAnimator.o: ../../../src/juce_appframework/gui/components/layout/juce_ComponentAnimator.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_ComponentAnimator.cpp -o ../../../bin/intermediate_devcpp/juce_ComponentAnimator.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MultiTimer.o: ../../../src/juce_appframework/events/juce_MultiTimer.cpp + $(CPP) -c ../../../src/juce_appframework/events/juce_MultiTimer.cpp -o ../../../bin/intermediate_devcpp/juce_MultiTimer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ToolbarButton.o: ../../../src/juce_appframework/gui/components/buttons/juce_ToolbarButton.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/buttons/juce_ToolbarButton.cpp -o ../../../bin/intermediate_devcpp/juce_ToolbarButton.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Sampler.o: ../../../src/juce_appframework/audio/synthesisers/juce_Sampler.cpp + $(CPP) -c ../../../src/juce_appframework/audio/synthesisers/juce_Sampler.cpp -o ../../../bin/intermediate_devcpp/juce_Sampler.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_Synthesiser.o: ../../../src/juce_appframework/audio/synthesisers/juce_Synthesiser.cpp + $(CPP) -c ../../../src/juce_appframework/audio/synthesisers/juce_Synthesiser.cpp -o ../../../bin/intermediate_devcpp/juce_Synthesiser.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ComponentMovementWatcher.o: ../../../src/juce_appframework/gui/components/layout/juce_ComponentMovementWatcher.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/layout/juce_ComponentMovementWatcher.cpp -o ../../../bin/intermediate_devcpp/juce_ComponentMovementWatcher.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioDataConverters.o: ../../../src/juce_appframework/audio/dsp/juce_AudioDataConverters.cpp + $(CPP) -c ../../../src/juce_appframework/audio/dsp/juce_AudioDataConverters.cpp -o ../../../bin/intermediate_devcpp/juce_AudioDataConverters.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_AudioSampleBuffer.o: ../../../src/juce_appframework/audio/dsp/juce_AudioSampleBuffer.cpp + $(CPP) -c ../../../src/juce_appframework/audio/dsp/juce_AudioSampleBuffer.cpp -o ../../../bin/intermediate_devcpp/juce_AudioSampleBuffer.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_IIRFilter.o: ../../../src/juce_appframework/audio/dsp/juce_IIRFilter.cpp + $(CPP) -c ../../../src/juce_appframework/audio/dsp/juce_IIRFilter.cpp -o ../../../bin/intermediate_devcpp/juce_IIRFilter.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ApplicationProperties.o: ../../../src/juce_appframework/application/juce_ApplicationProperties.cpp + $(CPP) -c ../../../src/juce_appframework/application/juce_ApplicationProperties.cpp -o ../../../bin/intermediate_devcpp/juce_ApplicationProperties.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_SystemTrayIconComponent.o: ../../../src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.cpp -o ../../../bin/intermediate_devcpp/juce_SystemTrayIconComponent.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_MenuBarModel.o: ../../../src/juce_appframework/gui/components/menus/juce_MenuBarModel.cpp + $(CPP) -c ../../../src/juce_appframework/gui/components/menus/juce_MenuBarModel.cpp -o ../../../bin/intermediate_devcpp/juce_MenuBarModel.o $(CXXFLAGS) + +../../../bin/intermediate_devcpp/juce_ChannelRemappingAudioSource.o: ../../../src/juce_appframework/audio/audio_sources/juce_ChannelRemappingAudioSource.cpp + $(CPP) -c ../../../src/juce_appframework/audio/audio_sources/juce_ChannelRemappingAudioSource.cpp -o ../../../bin/intermediate_devcpp/juce_ChannelRemappingAudioSource.o $(CXXFLAGS) diff --git a/build/win32/devcpp/juce.dev b/build/win32/devcpp/juce.dev new file mode 100644 index 0000000000..82c6d74045 --- /dev/null +++ b/build/win32/devcpp/juce.dev @@ -0,0 +1,6759 @@ +[Project] +FileName=juce.dev +Name=juce +UnitCount=619 +Type=2 +Ver=1 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler=-Wno-multichar_@@_-DJUCE_USE_FLAC=0_@@_-DJUCE_USE_OGGVORBIS=0_@@_ +Linker= +IsCpp=1 +Icon= +ExeOutput=../../../bin +ObjectOutput=../../../bin/intermediate_devcpp +OverrideOutput=1 +OverrideOutputName=libjuce.a +HostApplication= +Folders=src,src/juce_appframework,src/juce_appframework/application,src/juce_appframework/audio,src/juce_appframework/audio/audio_file_formats,src/juce_appframework/audio/audio_sources,src/juce_appframework/audio/devices,src/juce_appframework/audio/dsp,src/juce_appframework/audio/midi,src/juce_appframework/audio/synthesisers,src/juce_appframework/documents,src/juce_appframework/events,src/juce_appframework/gui,src/juce_appframework/gui/components,src/juce_appframework/gui/components/buttons,src/juce_appframework/gui/components/controls,src/juce_appframework/gui/components/filebrowser,src/juce_appframework/gui/components/keyboard,src/juce_appframework/gui/components/layout,src/juce_appframework/gui/components/lookandfeel,src/juce_appframework/gui/components/menus,src/juce_appframework/gui/components/mouse,src/juce_appframework/gui/components/properties,src/juce_appframework/gui/components/special,src/juce_appframework/gui/components/windows,src/juce_appframework/gui/graphics,src/juce_appframework/gui/graphics/brushes,src/juce_appframework/gui/graphics/colour,src/juce_appframework/gui/graphics/contexts,src/juce_appframework/gui/graphics/drawables,src/juce_appframework/gui/graphics/effects,src/juce_appframework/gui/graphics/fonts,src/juce_appframework/gui/graphics/geometry,src/juce_appframework/gui/graphics/imaging,src/juce_appframework/gui/graphics/imaging/image_file_formats,src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib,src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib,src/juce_core,src/juce_core/basics,src/juce_core/containers,src/juce_core/cryptography,src/juce_core/io,src/juce_core/io/files,src/juce_core/io/network,src/juce_core/io/streams,src/juce_core/io/streams/zlib,src/juce_core/misc,src/juce_core/text,src/juce_core/threads,win32_platform_code +CommandLine= +UseCustomMakefile=0 +CustomMakefile= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000001001001000000100 + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit1] +FileName=..\..\..\src\juce_core\basics\juce_Atomic.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=..\..\..\src\juce_core\basics\juce_DataConversions.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=..\..\..\src\juce_core\basics\juce_Logger.cpp +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=..\..\..\src\juce_core\basics\juce_Logger.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=..\..\..\src\juce_core\basics\juce_MathsFunctions.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=..\..\..\src\juce_core\basics\juce_Memory.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=..\..\..\src\juce_core\basics\juce_PlatformDefs.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=..\..\..\src\juce_core\basics\juce_Random.cpp +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=..\..\..\src\juce_core\basics\juce_Random.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit10] +FileName=..\..\..\src\juce_core\basics\juce_RelativeTime.cpp +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit11] +FileName=..\..\..\src\juce_core\basics\juce_RelativeTime.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit12] +FileName=..\..\..\src\juce_core\basics\juce_Singleton.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit13] +FileName=..\..\..\src\juce_core\basics\juce_StandardHeader.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit14] +FileName=..\..\..\src\juce_core\basics\juce_SystemStats.cpp +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit15] +FileName=..\..\..\src\juce_core\basics\juce_SystemStats.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit16] +FileName=..\..\..\src\juce_core\basics\juce_Time.cpp +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit17] +FileName=..\..\..\src\juce_core\basics\juce_Time.h +CompileCpp=1 +Folder=src/juce_core/basics +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit18] +FileName=..\..\..\src\juce_core\containers\juce_Array.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit19] +FileName=..\..\..\src\juce_core\containers\juce_ArrayAllocationBase.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit20] +FileName=..\..\..\src\juce_core\containers\juce_BitArray.cpp +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit21] +FileName=..\..\..\src\juce_core\containers\juce_BitArray.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit22] +FileName=..\..\..\src\juce_core\containers\juce_ElementComparator.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit23] +FileName=..\..\..\src\juce_core\containers\juce_MemoryBlock.cpp +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit24] +FileName=..\..\..\src\juce_core\containers\juce_MemoryBlock.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit25] +FileName=..\..\..\src\juce_core\containers\juce_OwnedArray.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit26] +FileName=..\..\..\src\juce_core\containers\juce_ReferenceCountedArray.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit27] +FileName=..\..\..\src\juce_core\containers\juce_ReferenceCountedObject.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit28] +FileName=..\..\..\src\juce_core\containers\juce_SortedSet.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit29] +FileName=..\..\..\src\juce_core\containers\juce_VoidArray.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit30] +FileName=..\..\..\src\juce_core\cryptography\juce_BlowFish.cpp +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit31] +FileName=..\..\..\src\juce_core\cryptography\juce_BlowFish.h +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit32] +FileName=..\..\..\src\juce_core\cryptography\juce_MD5.cpp +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit33] +FileName=..\..\..\src\juce_core\cryptography\juce_MD5.h +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit34] +FileName=..\..\..\src\juce_core\cryptography\juce_Primes.cpp +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit35] +FileName=..\..\..\src\juce_core\cryptography\juce_Primes.h +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit36] +FileName=..\..\..\src\juce_core\cryptography\juce_RSAKey.cpp +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit37] +FileName=..\..\..\src\juce_core\cryptography\juce_RSAKey.h +CompileCpp=1 +Folder=src/juce_core/cryptography +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit38] +FileName=..\..\..\src\juce_core\io\juce_InputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit39] +FileName=..\..\..\src\juce_core\io\juce_InputStream.h +CompileCpp=1 +Folder=src/juce_core/io +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit40] +FileName=..\..\..\src\juce_core\io\juce_OutputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit41] +FileName=..\..\..\src\juce_core\io\juce_OutputStream.h +CompileCpp=1 +Folder=src/juce_core/io +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit42] +FileName=..\..\..\src\juce_core\io\files\juce_DirectoryIterator.cpp +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit43] +FileName=..\..\..\src\juce_core\io\files\juce_DirectoryIterator.h +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit44] +FileName=..\..\..\src\juce_core\io\files\juce_File.cpp +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit45] +FileName=..\..\..\src\juce_core\io\files\juce_File.h +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit46] +FileName=..\..\..\src\juce_core\io\files\juce_FileInputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit47] +FileName=..\..\..\src\juce_core\io\files\juce_FileInputStream.h +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit48] +FileName=..\..\..\src\juce_core\io\files\juce_FileOutputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit49] +FileName=..\..\..\src\juce_core\io\files\juce_FileOutputStream.h +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit50] +FileName=..\..\..\src\juce_core\io\files\juce_FileSearchPath.cpp +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit51] +FileName=..\..\..\src\juce_core\io\files\juce_FileSearchPath.h +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit52] +FileName=..\..\..\src\juce_core\io\network\juce_URL.cpp +CompileCpp=1 +Folder=src/juce_core/io/network +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit53] +FileName=..\..\..\src\juce_core\io\network\juce_URL.h +CompileCpp=1 +Folder=src/juce_core/io/network +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit54] +FileName=..\..\..\src\juce_core\io\streams\juce_BufferedInputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CPP) -c juce_BufferedInputStream.cpp -o juce_BufferedInputStream.o $(CXXFLAGS) + +[Unit55] +FileName=..\..\..\src\juce_core\io\streams\juce_BufferedInputStream.h +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit56] +FileName=..\..\..\src\juce_core\io\streams\juce_GZIPCompressorOutputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CPP) -c juce_GZIPCompressorOutputStream.cpp -o juce_GZIPCompressorOutputStream.o $(CXXFLAGS) + +[Unit57] +FileName=..\..\..\src\juce_core\io\streams\juce_GZIPCompressorOutputStream.h +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit58] +FileName=..\..\..\src\juce_core\io\streams\juce_GZIPDecompressorInputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit59] +FileName=..\..\..\src\juce_core\io\streams\juce_GZIPDecompressorInputStream.h +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit60] +FileName=..\..\..\src\juce_core\io\streams\juce_MemoryInputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit61] +FileName=..\..\..\src\juce_core\io\streams\juce_MemoryInputStream.h +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit62] +FileName=..\..\..\src\juce_core\io\streams\juce_MemoryOutputStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit63] +FileName=..\..\..\src\juce_core\io\streams\juce_MemoryOutputStream.h +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit64] +FileName=..\..\..\src\juce_core\io\streams\juce_SubregionStream.cpp +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit65] +FileName=..\..\..\src\juce_core\io\streams\juce_SubregionStream.h +CompileCpp=1 +Folder=src/juce_core/io/streams +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit68] +FileName=..\..\..\src\juce_core\misc\juce_PlatformUtilities.h +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit69] +FileName=..\..\..\src\juce_core\misc\juce_Uuid.cpp +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit70] +FileName=..\..\..\src\juce_core\misc\juce_Uuid.h +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit71] +FileName=..\..\..\src\juce_core\misc\juce_ZipFile.cpp +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit72] +FileName=..\..\..\src\juce_core\misc\juce_ZipFile.h +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit73] +FileName=..\..\..\src\juce_core\text\juce_String.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit74] +FileName=..\..\..\src\juce_core\text\juce_String.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit75] +FileName=..\..\..\src\juce_core\text\juce_StringArray.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit76] +FileName=..\..\..\src\juce_core\text\juce_StringArray.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit77] +FileName=..\..\..\src\juce_core\text\juce_StringPairArray.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit78] +FileName=..\..\..\src\juce_core\text\juce_StringPairArray.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit79] +FileName=..\..\..\src\juce_core\text\juce_XmlDocument.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit80] +FileName=..\..\..\src\juce_core\text\juce_XmlDocument.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit81] +FileName=..\..\..\src\juce_core\text\juce_XmlElement.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit82] +FileName=..\..\..\src\juce_core\text\juce_XmlElement.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit83] +FileName=..\..\..\src\juce_core\threads\juce_CriticalSection.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit84] +FileName=..\..\..\src\juce_core\threads\juce_InterProcessLock.cpp +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit85] +FileName=..\..\..\src\juce_core\threads\juce_InterProcessLock.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit86] +FileName=..\..\..\src\juce_core\threads\juce_Process.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit87] +FileName=..\..\..\src\juce_core\threads\juce_ScopedLock.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit88] +FileName=..\..\..\src\juce_core\threads\juce_Thread.cpp +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit89] +FileName=..\..\..\src\juce_core\threads\juce_Thread.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit90] +FileName=..\..\..\src\juce_core\threads\juce_ThreadPool.cpp +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit91] +FileName=..\..\..\src\juce_core\threads\juce_ThreadPool.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit92] +FileName=..\..\..\src\juce_core\threads\juce_WaitableEvent.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit93] +FileName=..\..\..\src\juce_appframework\application\juce_Application.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit94] +FileName=..\..\..\src\juce_appframework\application\juce_Application.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit95] +FileName=..\..\..\src\juce_appframework\application\juce_DeletedAtShutdown.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit96] +FileName=..\..\..\src\juce_appframework\application\juce_DeletedAtShutdown.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit97] +FileName=..\..\..\src\juce_appframework\application\juce_SystemClipboard.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit98] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AiffAudioFormat.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit99] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AiffAudioFormat.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit100] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioCDReader.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit101] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioCDReader.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit102] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormat.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit103] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormat.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit104] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatReader.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit105] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatWriter.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit106] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioSubsectionReader.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit107] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioSubsectionReader.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit108] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_WavAudioFormat.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit109] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_WavAudioFormat.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit110] +FileName=..\..\..\src\juce_appframework\events\juce_ActionBroadcaster.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit111] +FileName=..\..\..\src\juce_appframework\events\juce_ActionBroadcaster.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit112] +FileName=..\..\..\src\juce_appframework\events\juce_ActionListener.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit113] +FileName=..\..\..\src\juce_appframework\events\juce_ActionListenerList.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit114] +FileName=..\..\..\src\juce_appframework\events\juce_ActionListenerList.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit115] +FileName=..\..\..\src\juce_appframework\events\juce_AsyncUpdater.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit116] +FileName=..\..\..\src\juce_appframework\events\juce_AsyncUpdater.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit117] +FileName=..\..\..\src\juce_appframework\events\juce_ChangeBroadcaster.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit118] +FileName=..\..\..\src\juce_appframework\events\juce_ChangeBroadcaster.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit119] +FileName=..\..\..\src\juce_appframework\events\juce_ChangeListener.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit120] +FileName=..\..\..\src\juce_appframework\events\juce_ChangeListenerList.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit121] +FileName=..\..\..\src\juce_appframework\events\juce_ChangeListenerList.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit122] +FileName=..\..\..\src\juce_appframework\events\juce_Message.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit123] +FileName=..\..\..\src\juce_appframework\events\juce_Message.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit124] +FileName=..\..\..\src\juce_appframework\events\juce_MessageListener.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit125] +FileName=..\..\..\src\juce_appframework\events\juce_MessageListener.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit126] +FileName=..\..\..\src\juce_appframework\events\juce_MessageManager.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit127] +FileName=..\..\..\src\juce_appframework\events\juce_MessageManager.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit128] +FileName=..\..\..\src\juce_appframework\events\juce_Timer.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit129] +FileName=..\..\..\src\juce_appframework\events\juce_Timer.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit130] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_Brush.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit131] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_Brush.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit132] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_GradientBrush.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit133] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_GradientBrush.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit134] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_ImageBrush.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit135] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_ImageBrush.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit136] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_SolidColourBrush.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit137] +FileName=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_SolidColourBrush.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/brushes +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit138] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colour.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit139] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colour.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit140] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colours.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit141] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colours.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit142] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_PixelFormats.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit143] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_EdgeTable.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit144] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_EdgeTable.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit145] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Graphics.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit146] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Graphics.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit147] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Justification.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit148] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Justification.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit149] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_DropShadowEffect.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit150] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_DropShadowEffect.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit151] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_GlowEffect.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit152] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_GlowEffect.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit153] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_ImageEffectFilter.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit154] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_ReduceOpacityEffect.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit155] +FileName=..\..\..\src\juce_appframework\gui\graphics\effects\juce_ReduceOpacityEffect.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/effects +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit156] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Font.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit157] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Font.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit158] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_GlyphArrangement.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit159] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_GlyphArrangement.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit160] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_TextLayout.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit161] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_TextLayout.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit162] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Typeface.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit163] +FileName=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Typeface.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/fonts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit164] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_AffineTransform.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit165] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_AffineTransform.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit166] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Line.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit167] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Line.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit168] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Path.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit169] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Path.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit170] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathIterator.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit171] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathIterator.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit172] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathStrokeType.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit173] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathStrokeType.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit174] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Point.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit175] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Point.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit176] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Rectangle.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit177] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Rectangle.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit178] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_RectangleList.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit179] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_RectangleList.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit180] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_Image.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit181] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_Image.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit182] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageCache.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit183] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageCache.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit184] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageConvolutionKernel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit185] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageConvolutionKernel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit186] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageFileFormat.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit187] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageFileFormat.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit188] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_GIFLoader.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit189] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_GIFLoader.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit190] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_JPEGLoader.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit191] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_PNGLoader.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit192] +FileName=..\platform_specific_code\juce_win32_ASIO.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit193] +FileName=..\platform_specific_code\juce_win32_AudioCDReader.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit194] +FileName=..\platform_specific_code\juce_win32_DirectSound.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit195] +FileName=..\platform_specific_code\juce_win32_DynamicLibraryLoader.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit196] +FileName=..\platform_specific_code\juce_win32_DynamicLibraryLoader.h +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit197] +FileName=..\platform_specific_code\juce_win32_FileChooser.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit198] +FileName=..\platform_specific_code\juce_win32_Files.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit199] +FileName=..\platform_specific_code\juce_win32_Fonts.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit200] +FileName=..\platform_specific_code\juce_win32_Messaging.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit201] +FileName=..\platform_specific_code\juce_win32_Midi.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit202] +FileName=..\platform_specific_code\juce_win32_Misc.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit203] +FileName=..\platform_specific_code\juce_win32_Network.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit204] +FileName=..\platform_specific_code\juce_win32_PlatformUtils.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit205] +FileName=..\platform_specific_code\juce_win32_SystemStats.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit206] +FileName=..\platform_specific_code\juce_win32_Threads.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit207] +FileName=..\platform_specific_code\juce_win32_Windowing.cpp +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit208] +FileName=..\platform_specific_code\win32_headers.h +CompileCpp=1 +Folder=win32_platform_code +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit209] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioFormatReaderSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit210] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioFormatReaderSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit212] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioSourcePlayer.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit213] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioSourcePlayer.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit214] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioTransportSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit215] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioTransportSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit216] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_BufferingAudioSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit217] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_BufferingAudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit218] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_MixerAudioSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit219] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_MixerAudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit220] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_PositionableAudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit221] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_ResamplingAudioSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit222] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_ResamplingAudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit223] +FileName=..\..\..\juce.h +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit224] +FileName=..\..\..\juce_Config.h +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit225] +FileName=..\..\..\src\juce_core\threads\juce_ScopedWriteLock.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit226] +FileName=..\..\..\src\juce_core\threads\juce_TimeSliceThread.cpp +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit227] +FileName=..\..\..\src\juce_core\threads\juce_TimeSliceThread.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit228] +FileName=..\..\..\src\juce_core\threads\juce_ReadWriteLock.cpp +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit229] +FileName=..\..\..\src\juce_core\threads\juce_ReadWriteLock.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit230] +FileName=..\..\..\src\juce_core\threads\juce_ScopedReadLock.h +CompileCpp=1 +Folder=src/juce_core/threads +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit231] +FileName=..\..\..\src\juce_core\text\juce_LocalisedStrings.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit232] +FileName=..\..\..\src\juce_core\text\juce_LocalisedStrings.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit233] +FileName=..\..\..\src\juce_core\containers\juce_PropertySet.cpp +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit234] +FileName=..\..\..\src\juce_core\containers\juce_PropertySet.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit235] +FileName=..\..\..\src\juce_core\containers\juce_SparseSet.h +CompileCpp=1 +Folder=src/juce_core/containers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit236] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_Drawable.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit237] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_Drawable.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit238] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableComposite.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit239] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableComposite.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit240] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableImage.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit241] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableImage.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit242] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawablePath.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit243] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawablePath.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit244] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableText.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit245] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableText.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit246] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_ColourGradient.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit247] +FileName=..\..\..\src\juce_appframework\gui\graphics\colour\juce_ColourGradient.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/colour +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit248] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ArrowButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit249] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ArrowButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit251] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_Button.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit252] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_DrawableButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit253] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_DrawableButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit254] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_HyperlinkButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit255] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_HyperlinkButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit256] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ImageButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit257] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ImageButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit258] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ShapeButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit259] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ShapeButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit260] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_TextButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit261] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_TextButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit262] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToggleButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit263] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToggleButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit264] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ComboBox.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit265] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ComboBox.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit266] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_Label.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit267] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_Label.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit268] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ListBox.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit269] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ListBox.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit270] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ProgressBar.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit271] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ProgressBar.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit272] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_Slider.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit273] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_Slider.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit274] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TextEditor.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit275] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TextEditor.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit276] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TreeView.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit277] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TreeView.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit278] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyListener.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit279] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyListener.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit280] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyMappingEditorComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit281] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyMappingEditorComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit282] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPress.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit283] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPress.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit284] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPressMappingSet.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit285] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPressMappingSet.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit286] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_ModifierKeys.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit287] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_ModifierKeys.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit288] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_GroupComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit289] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_GroupComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit290] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableBorderComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit291] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableBorderComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit292] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableCornerComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit293] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableCornerComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit294] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ScrollBar.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit295] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ScrollBar.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit296] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutManager.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit297] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutManager.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit298] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutResizerBar.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit299] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutResizerBar.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit300] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedButtonBar.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit301] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedButtonBar.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit302] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit303] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit304] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_Viewport.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit305] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_Viewport.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit306] +FileName=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_LookAndFeel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/lookandfeel +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit307] +FileName=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_LookAndFeel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/lookandfeel +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit308] +FileName=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_ShinyLookAndFeel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/lookandfeel +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit309] +FileName=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_ShinyLookAndFeel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/lookandfeel +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit310] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_PopupMenu.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit311] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_PopupMenu.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit312] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_PopupMenuCustomComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit313] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_ComponentDragger.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit314] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_ComponentDragger.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit315] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_DragAndDropContainer.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit316] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_DragAndDropContainer.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit317] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_DragAndDropTarget.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit318] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseCursor.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit319] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseCursor.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit320] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseEvent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit321] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseEvent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit322] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseHoverDetector.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit323] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseHoverDetector.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit324] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseListener.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit325] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseListener.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit326] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit327] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit328] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_ColourSelector.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit329] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_ColourSelector.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit330] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_DropShadower.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit331] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_DropShadower.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit332] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_OpenGLComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit333] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_OpenGLComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit334] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_PreferencesPanel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit335] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_PreferencesPanel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit336] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_QuickTimeMovieComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit337] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_QuickTimeMovieComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit338] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_AlertWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit339] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_AlertWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit340] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_DialogWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit341] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_DialogWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit342] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ResizableWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit343] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ResizableWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit344] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_SplashScreen.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit345] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_SplashScreen.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit346] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ThreadWithProgressWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit347] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ThreadWithProgressWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit348] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ToolTipWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit349] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ToolTipWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit350] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit351] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit352] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarModel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit353] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleMessageComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit354] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleMessageComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit355] +FileName=..\..\..\src\juce_appframework\gui\components\juce_Desktop.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit356] +FileName=..\..\..\src\juce_appframework\gui\components\juce_Component.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit357] +FileName=..\..\..\src\juce_appframework\gui\components\juce_Component.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit358] +FileName=..\..\..\src\juce_appframework\gui\components\juce_ComponentDeletionWatcher.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit359] +FileName=..\..\..\src\juce_appframework\gui\components\juce_ComponentListener.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit360] +FileName=..\..\..\src\juce_appframework\gui\components\juce_ComponentListener.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit361] +FileName=..\..\..\src\juce_appframework\gui\components\juce_Desktop.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit362] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_ToneGeneratorAudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit363] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit364] +FileName=..\..\..\src\juce_core\io\streams\zlib\adler32.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c adler32.c -o ../../../bin/intermediate_devcpp/adler32.o $(CFLAGS) + +[Unit365] +FileName=..\..\..\src\juce_core\io\streams\zlib\compress.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c compress.c -o ../../../bin/intermediate_devcpp/compress.o $(CFLAGS) + +[Unit366] +FileName=..\..\..\src\juce_core\io\streams\zlib\crc32.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c crc32.c -o ../../../bin/intermediate_devcpp/crc32.o $(CFLAGS) + +[Unit367] +FileName=..\..\..\src\juce_core\io\streams\zlib\crc32.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit368] +FileName=..\..\..\src\juce_core\io\streams\zlib\deflate.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c deflate.c -o ../../../bin/intermediate_devcpp/deflate.o $(CFLAGS) + +[Unit369] +FileName=..\..\..\src\juce_core\io\streams\zlib\deflate.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit370] +FileName=..\..\..\src\juce_core\io\streams\zlib\infback.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c infback.c -o ../../../bin/intermediate_devcpp/infback.o $(CFLAGS) + +[Unit371] +FileName=..\..\..\src\juce_core\io\streams\zlib\inffast.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c inffast.c -o ../../../bin/intermediate_devcpp/inffast.o $(CFLAGS) + +[Unit372] +FileName=..\..\..\src\juce_core\io\streams\zlib\inffast.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit373] +FileName=..\..\..\src\juce_core\io\streams\zlib\inffixed.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit374] +FileName=..\..\..\src\juce_core\io\streams\zlib\inflate.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c inflate.c -o ../../../bin/intermediate_devcpp/inflate.o $(CFLAGS) + +[Unit375] +FileName=..\..\..\src\juce_core\io\streams\zlib\inflate.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit376] +FileName=..\..\..\src\juce_core\io\streams\zlib\inftrees.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c inftrees.c -o ../../../bin/intermediate_devcpp/inftrees.o $(CFLAGS) + +[Unit377] +FileName=..\..\..\src\juce_core\io\streams\zlib\inftrees.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit378] +FileName=..\..\..\src\juce_core\io\streams\zlib\trees.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c trees.c -o ../../../bin/intermediate_devcpp/trees.o $(CFLAGS) + +[Unit379] +FileName=..\..\..\src\juce_core\io\streams\zlib\trees.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit380] +FileName=..\..\..\src\juce_core\io\streams\zlib\uncompr.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c uncompr.c -o ../../../bin/intermediate_devcpp/uncompr.o $(CFLAGS) + +[Unit381] +FileName=..\..\..\src\juce_core\io\streams\zlib\zconf.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit382] +FileName=..\..\..\src\juce_core\io\streams\zlib\zlib.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit383] +FileName=..\..\..\src\juce_core\io\streams\zlib\zutil.c +CompileCpp=0 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd=$(CC) -c zutil.c -o ../../../bin/intermediate_devcpp/zutil.o $(CFLAGS) + +[Unit384] +FileName=..\..\..\src\juce_core\io\streams\zlib\zutil.h +CompileCpp=1 +Folder=src/juce_core/io/streams/zlib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit385] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\png.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit386] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\png.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit387] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngconf.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit388] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngerror.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit389] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pnggccrd.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit390] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngget.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit391] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngmem.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit392] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngpread.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit393] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngread.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit394] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngrio.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit395] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngrtran.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit396] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngrutil.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit397] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngset.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit398] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngtrans.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit399] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngvcrd.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit400] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwio.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit401] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwrite.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit402] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwtran.c +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= +CompileCpp=0 + +[Unit403] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwutil.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/pnglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit404] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\cderror.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit405] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcapimin.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit406] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcapistd.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit407] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jccoefct.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit408] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jccolor.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit409] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcdctmgr.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit410] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jchuff.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit411] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jchuff.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit412] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcinit.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit413] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcmainct.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit414] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcmarker.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit415] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcmaster.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit417] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jconfig.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit418] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcparam.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit419] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcphuff.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit420] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcprepct.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit421] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcsample.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit422] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jctrans.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit423] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdapimin.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit424] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdapistd.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit425] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdatasrc.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit426] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdcoefct.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit427] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdcolor.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit428] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdct.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit429] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jddctmgr.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit430] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdhuff.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit431] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdhuff.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit432] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdinput.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit433] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmainct.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit434] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmarker.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit435] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmaster.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit436] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmerge.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit437] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdphuff.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit438] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdpostct.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit439] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdsample.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit440] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdtrans.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit441] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jerror.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit442] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jerror.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit443] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jfdctflt.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit444] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jfdctfst.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit445] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jfdctint.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit446] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctflt.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit447] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctfst.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit448] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctint.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit449] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctred.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit450] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jinclude.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit451] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmemmgr.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit452] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmemnobs.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit453] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmemsys.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit454] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmorecfg.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit455] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jpegint.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit456] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jpeglib.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit457] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jquant1.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit458] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jquant2.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit459] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jutils.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit460] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jversion.h +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit461] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\transupp.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit462] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\transupp.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit66] +FileName=..\..\..\src\juce_core\misc\juce_PerformanceCounter.cpp +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit67] +FileName=..\..\..\src\juce_core\misc\juce_PerformanceCounter.h +CompileCpp=1 +Folder=src/juce_core/misc +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit211] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit250] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_Button.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit463] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_MidiKeyboardComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit464] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_MidiKeyboardComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit465] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatManager.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit466] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatManager.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit467] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsContext.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit468] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit469] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit470] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_AudioDeviceManager.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit471] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_AudioDeviceManager.h +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit472] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODevice.h +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit473] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_MidiInput.h +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit474] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_MidiOutput.h +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit475] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_AudioDeviceSelectorComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit476] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_AudioDeviceSelectorComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit477] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_DocumentWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit478] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_DocumentWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit479] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_LassoComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit480] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentBoundsConstrainer.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit481] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentBoundsConstrainer.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit482] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiBuffer.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit483] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiBuffer.h +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit484] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiFile.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit485] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiFile.h +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit486] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiKeyboardState.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit487] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiKeyboardState.h +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit488] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessage.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit489] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessage.h +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit490] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageCollector.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit491] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageCollector.h +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit492] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageSequence.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit493] +FileName=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageSequence.h +CompileCpp=1 +Folder=src/juce_appframework/audio/midi +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit494] +FileName=..\..\..\docs\JUCE changelist.txt +CompileCpp=1 +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit495] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_TopLevelWindow.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit496] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_TopLevelWindow.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit497] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ComponentPeer.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit416] +FileName=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcomapi.c +CompileCpp=0 +Folder=src/juce_appframework/gui/graphics/imaging/image_file_formats/jpglib +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit498] +FileName=..\..\..\src\juce_appframework\gui\components\windows\juce_ComponentPeer.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/windows +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit499] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_BorderSize.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit500] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_BorderSize.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit501] +FileName=..\..\..\src\juce_appframework\application\juce_PropertiesFile.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit502] +FileName=..\..\..\src\juce_appframework\application\juce_PropertiesFile.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit503] +FileName=..\..\..\src\juce_appframework\documents\juce_FileBasedDocument.cpp +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit504] +FileName=..\..\..\src\juce_appframework\documents\juce_FileBasedDocument.h +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit505] +FileName=..\..\..\src\juce_appframework\documents\juce_RecentlyOpenedFilesList.cpp +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit506] +FileName=..\..\..\src\juce_appframework\documents\juce_RecentlyOpenedFilesList.h +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit507] +FileName=..\..\..\src\juce_appframework\documents\juce_SelectedItemSet.h +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit508] +FileName=..\..\..\src\juce_appframework\documents\juce_UndoableAction.h +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit509] +FileName=..\..\..\src\juce_appframework\documents\juce_UndoManager.cpp +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit510] +FileName=..\..\..\src\juce_appframework\documents\juce_UndoManager.h +CompileCpp=1 +Folder=src/juce_appframework/documents +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit511] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_DirectoryContentsList.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit512] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_DirectoryContentsList.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit513] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileBrowserComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit514] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileBrowserComponent.h +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= +CompileCpp=1 + +[Unit515] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileBrowserListener.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit516] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooser.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit517] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooser.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit518] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooserDialogBox.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit519] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooserDialogBox.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit520] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileFilter.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit521] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileFilter.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit522] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileListComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit523] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileListComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit524] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FilePreviewComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit525] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_ImagePreviewComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit526] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_ImagePreviewComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit527] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_WildcardFileFilter.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit528] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_WildcardFileFilter.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit529] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODeviceType.h +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit530] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODevice.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit531] +FileName=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODeviceType.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/devices +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit532] +FileName=..\..\..\src\juce_core\io\network\juce_Socket.cpp +CompileCpp=1 +Folder=src/juce_core/io/network +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit533] +FileName=..\..\..\src\juce_core\io\network\juce_Socket.h +CompileCpp=1 +Folder=src/juce_core/io/network +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit534] +FileName=..\..\..\src\juce_core\io\files\juce_NamedPipe.cpp +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit535] +FileName=..\..\..\src\juce_core\io\files\juce_NamedPipe.h +CompileCpp=1 +Folder=src/juce_core/io/files +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit536] +FileName=..\..\..\src\juce_appframework\events\juce_InterprocessConnection.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit537] +FileName=..\..\..\src\juce_appframework\events\juce_InterprocessConnection.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit538] +FileName=..\..\..\src\juce_appframework\events\juce_InterprocessConnectionServer.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit539] +FileName=..\..\..\src\juce_appframework\events\juce_InterprocessConnectionServer.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit540] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_OggVorbisAudioFormat.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit541] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_FlacAudioFormat.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit542] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_FlacAudioFormat.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit543] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_OggVorbisAudioFormat.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit544] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandID.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit545] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandInfo.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit546] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandInfo.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit547] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandManager.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit548] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandManager.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit549] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandTarget.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit550] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationCommandTarget.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit551] +FileName=..\..\..\src\juce_appframework\gui\components\mouse\juce_TooltipClient.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/mouse +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit552] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PositionedRectangle.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit553] +FileName=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PositionedRectangle.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/geometry +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit554] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_MultiDocumentPanel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit555] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_MultiDocumentPanel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit556] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_ButtonPropertyComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit557] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_ButtonPropertyComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit558] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_ChoicePropertyComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit559] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_ChoicePropertyComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit560] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit561] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit562] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyPanel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit563] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyPanel.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit564] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_SliderPropertyComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit565] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_SliderPropertyComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit566] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_TextPropertyComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit567] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_TextPropertyComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit568] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_MagnifierComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit569] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_MagnifierComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit570] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FilenameComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit571] +FileName=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FilenameComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/filebrowser +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit572] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit573] +FileName=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyboardFocusTraverser.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/keyboard +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit574] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_BooleanPropertyComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit575] +FileName=..\..\..\src\juce_appframework\gui\components\properties\juce_BooleanPropertyComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/properties +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit576] +FileName=..\..\..\src\juce_core\text\juce_CharacterFunctions.cpp +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit577] +FileName=..\..\..\src\juce_core\text\juce_CharacterFunctions.h +CompileCpp=1 +Folder=src/juce_core/text +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit578] +FileName=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_SVGParser.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/drawables +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit579] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_RectanglePlacement.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit580] +FileName=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_RectanglePlacement.h +CompileCpp=1 +Folder=src/juce_appframework/gui/graphics/contexts +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit581] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_ActiveXControlComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit582] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TableHeaderComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit583] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TableHeaderComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit584] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TableListBox.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit585] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_TableListBox.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit586] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableObjectResizer.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit587] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableObjectResizer.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit588] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemPalette.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit589] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_Toolbar.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit590] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_Toolbar.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit591] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit592] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit593] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemFactory.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit594] +FileName=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemPalette.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/controls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit595] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentAnimator.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit596] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentAnimator.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit597] +FileName=..\..\..\src\juce_appframework\events\juce_MultiTimer.cpp +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit598] +FileName=..\..\..\src\juce_appframework\events\juce_MultiTimer.h +CompileCpp=1 +Folder=src/juce_appframework/events +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit599] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToolbarButton.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit600] +FileName=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToolbarButton.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/buttons +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit601] +FileName=..\..\..\src\juce_appframework\audio\synthesisers\juce_Sampler.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/synthesisers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit602] +FileName=..\..\..\src\juce_appframework\audio\synthesisers\juce_Sampler.h +CompileCpp=1 +Folder=src/juce_appframework/audio/synthesisers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit603] +FileName=..\..\..\src\juce_appframework\audio\synthesisers\juce_Synthesiser.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/synthesisers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit604] +FileName=..\..\..\src\juce_appframework\audio\synthesisers\juce_Synthesiser.h +CompileCpp=1 +Folder=src/juce_appframework/audio/synthesisers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit605] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentMovementWatcher.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit606] +FileName=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentMovementWatcher.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/layout +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit607] +FileName=..\..\..\src\juce_appframework\audio\dsp\juce_AudioDataConverters.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/dsp +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit608] +FileName=..\..\..\src\juce_appframework\audio\dsp\juce_AudioDataConverters.h +CompileCpp=1 +Folder=src/juce_appframework/audio/dsp +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit609] +FileName=..\..\..\src\juce_appframework\audio\dsp\juce_AudioSampleBuffer.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/dsp +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit610] +FileName=..\..\..\src\juce_appframework\audio\dsp\juce_AudioSampleBuffer.h +CompileCpp=1 +Folder=src/juce_appframework/audio/dsp +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit611] +FileName=..\..\..\src\juce_appframework\audio\dsp\juce_IIRFilter.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/dsp +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit612] +FileName=..\..\..\src\juce_appframework\audio\dsp\juce_IIRFilter.h +CompileCpp=1 +Folder=src/juce_appframework/audio/dsp +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit613] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationProperties.cpp +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit614] +FileName=..\..\..\src\juce_appframework\application\juce_ApplicationProperties.h +CompileCpp=1 +Folder=src/juce_appframework/application +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit615] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_SystemTrayIconComponent.h +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit616] +FileName=..\..\..\src\juce_appframework\gui\components\special\juce_SystemTrayIconComponent.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/special +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit618] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_ChannelRemappingAudioSource.cpp +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit619] +FileName=..\..\..\src\juce_appframework\audio\audio_sources\juce_ChannelRemappingAudioSource.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_sources +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit620] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\crc.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit621] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\fixed.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit622] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\float.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit623] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\format.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit624] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\lpc_flac.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit625] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\md5.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit626] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\memory.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit627] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\stream_decoder.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit628] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\stream_encoder.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit629] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\stream_encoder_framing.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit630] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\window_flac.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/flac +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit632] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\backends.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit633] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\bitrate.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit634] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\bitrate.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit635] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\block.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit636] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\codebook.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit637] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\codebook.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit638] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\codec_internal.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit639] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\envelope.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit640] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\envelope.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit641] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\floor0.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit642] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\floor1.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit643] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\highlevel.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit644] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\info.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit645] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lookup.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit646] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lookup.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit647] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lookup_data.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit648] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lpc.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit649] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lpc.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit650] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lsp.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit651] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lsp.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit652] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\mapping0.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit653] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\masking.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit654] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\mdct.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit655] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\mdct.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit656] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\misc.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit657] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\os.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit658] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\psy.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit659] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\psy.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit660] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\registry.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit662] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\res0.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit663] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\scales.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit664] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\sharedbook.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit665] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\smallft.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit666] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\smallft.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit667] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\synthesis.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit668] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\tone.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit670] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\vorbisfile.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit671] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\window.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit672] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\window.h +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit673] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\bitwise.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit674] +FileName=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\framing.c +CompileCpp=1 +Folder=src/juce_appframework/audio/audio_file_formats/oggvorbis +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit617] +FileName=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarModel.cpp +CompileCpp=1 +Folder=src/juce_appframework/gui/components/menus +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/build/win32/platform_specific_code/juce_win32_ASIO.cpp b/build/win32/platform_specific_code/juce_win32_ASIO.cpp new file mode 100644 index 0000000000..aa3e7701fe --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_ASIO.cpp @@ -0,0 +1,1947 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" + +#if JUCE_ASIO + +//============================================================================== +/* + This is very frustrating - we only need to use a handful of definitions from + a couple of the header files in Steinberg's ASIO SDK, and it'd be easy to copy + about 30 lines of code into this cpp file to create a fully stand-alone ASIO + implementation... + + ..unfortunately that would break Steinberg's license agreement for use of + their SDK, so I'm not allowed to do this. + + This means that anyone who wants to use JUCE's ASIO abilities will have to: + + 1) Agree to Steinberg's licensing terms and download the ASIO SDK + (see www.steinberg.net/Steinberg/Developers.asp). + + 2) Rebuild the whole of JUCE, setting the global definition JUCE_ASIO (you + can un-comment the "#define JUCE_ASIO" line in juce_Config.h + if you prefer). Make sure that your header search path will find the + iasiodrv.h file that comes with the SDK. (Only about 2-3 of the SDK header + files are actually needed - so to simplify things, you could just copy + these into your JUCE directory). +*/ +#include "iasiodrv.h" // if you're compiling and this line causes an error because + // you don't have the ASIO SDK installed, you can disable ASIO + // support by commenting-out the "#define JUCE_ASIO" line in + // juce_Config.h + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.h" +#include "../../../src/juce_core/threads/juce_ScopedLock.h" +#include "../../../src/juce_appframework/gui/components/juce_Component.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_appframework/events/juce_MessageManager.h" + + +//============================================================================== +// #define ASIO_DEBUGGING + +#ifdef ASIO_DEBUGGING + #define log(a) { Logger::writeToLog (a); DBG (a) } +#else + #define log(a) {} +#endif + + +//============================================================================== +#ifdef ASIO_DEBUGGING +static void logError (const String& context, long error) +{ + String err (T("unknown error")); + + if (error == ASE_NotPresent) + err = T("Not Present"); + else if (error == ASE_HWMalfunction) + err = T("Hardware Malfunction"); + else if (error == ASE_InvalidParameter) + err = T("Invalid Parameter"); + else if (error == ASE_InvalidMode) + err = T("Invalid Mode"); + else if (error == ASE_SPNotAdvancing) + err = T("Sample position not advancing"); + else if (error == ASE_NoClock) + err = T("No Clock"); + else if (error == ASE_NoMemory) + err = T("Out of memory"); + + log (T("!!error: ") + context + T(" - ") + err); +} +#else + #define logError(a, b) {} +#endif + +//============================================================================== +class ASIOAudioIODevice; +static ASIOAudioIODevice* volatile currentASIODev = 0; + +static IASIO* volatile asioObject = 0; + +static const int maxASIOChannels = 160; + +static ASIOCallbacks callbacks; +static ASIOBufferInfo bufferInfos[64]; + +static bool volatile insideControlPanelModalLoop = false; +static bool volatile shouldUsePreferredSize = false; + + +//============================================================================== +class JUCE_API ASIOAudioIODevice : public AudioIODevice, + private Thread, + private Timer +{ +public: + Component ourWindow; + + ASIOAudioIODevice (const String& name_, CLSID classId_) + : AudioIODevice (name_, T("ASIO")), + Thread (T("Juce ASIO")), + classId (classId_), + currentBitDepth (16), + currentSampleRate (0), + tempBuffer (0), + isOpen_ (false), + isStarted (false), + postOutput (true) + { + name = name_; + + ourWindow.addToDesktop (0); + windowHandle = ourWindow.getWindowHandle(); + + jassert (currentASIODev == 0); + currentASIODev = this; + shouldUseThread = false; + + openDevice(); + } + + ~ASIOAudioIODevice() + { + jassert (currentASIODev == this); + if (currentASIODev == this) + currentASIODev = 0; + + close(); + log (T("ASIO - exiting")); + removeCurrentDriver(); + + if (tempBuffer != 0) + juce_free (tempBuffer); + + if (isUsingThread) + { + signalThreadShouldExit(); + event1.signal(); + stopThread (3000); + } + } + + void updateSampleRates() + { + // find a list of sample rates.. + const double possibleSampleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 }; + sampleRates.clear(); + + if (asioObject != 0) + { + for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index) + { + const long err = asioObject->canSampleRate (possibleSampleRates[index]); + + if (err == 0) + { + sampleRates.add ((int) possibleSampleRates[index]); + log (T("rate: ") + String ((int) possibleSampleRates[index])); + } + else if (err != ASE_NoClock) + { + logError (T("CanSampleRate"), err); + } + } + + if (sampleRates.size() == 0) + { + double cr = 0; + const long err = asioObject->getSampleRate (&cr); + log (T("No sample rates supported - current rate: ") + String ((int) cr)); + + if (err == 0) + sampleRates.add ((int) cr); + } + } + } + + const StringArray getOutputChannelNames() + { + return outputChannelNames; + } + + const StringArray getInputChannelNames() + { + return inputChannelNames; + } + + int getNumSampleRates() + { + return sampleRates.size(); + } + + double getSampleRate (int index) + { + return sampleRates [index]; + } + + int getNumBufferSizesAvailable() + { + return bufferSizes.size(); + } + + int getBufferSizeSamples (int index) + { + return bufferSizes [index]; + } + + int getDefaultBufferSize() + { + return preferredSize; + } + + const String open (const BitArray& inputChannels, + const BitArray& outputChannels, + double sr, + int bufferSizeSamples) + { + close(); + currentCallback = 0; + + if (bufferSizeSamples <= 0) + shouldUsePreferredSize = true; + + if (asioObject == 0 || ! isASIOOpen) + { + log (T("Warning: device not open")); + const String err (openDevice()); + + if (asioObject == 0 || ! isASIOOpen) + return err; + } + + isStarted = false; + bufferIndex = -1; + long err = 0; + + long newPreferredSize = 0; + + // if the preferred size has just changed, assume it's a control panel thing and use it as the new value. + minSize = 0; + maxSize = 0; + newPreferredSize = 0; + granularity = 0; + + if (asioObject->getBufferSize (&minSize, &maxSize, &newPreferredSize, &granularity) == 0) + { + if (preferredSize != 0 && newPreferredSize != 0 && newPreferredSize != preferredSize) + shouldUsePreferredSize = true; + + preferredSize = newPreferredSize; + } + + // unfortunate workaround for certain manufacturers whose drivers crash horribly if you make + // dynamic changes to the buffer size... + shouldUsePreferredSize = shouldUsePreferredSize + || getName().containsIgnoreCase (T("Digidesign")); + + if (shouldUsePreferredSize) + { + log (T("Using preferred size for buffer..")); + + if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0) + { + bufferSizeSamples = preferredSize; + } + else + { + bufferSizeSamples = 1024; + logError (T("GetBufferSize1"), err); + } + + shouldUsePreferredSize = false; + } + + int sampleRate = roundDoubleToInt (sr); + currentSampleRate = sampleRate; + currentBlockSizeSamples = bufferSizeSamples; + currentChansOut = outputChannels; + currentChansIn = inputChannels; + + updateSampleRates(); + + if (sampleRate == 0 || (sampleRates.size() > 0 && ! sampleRates.contains (sampleRate))) + sampleRate = sampleRates[0]; + + jassert (sampleRate != 0); + if (sampleRate == 0) + sampleRate = 44100; + + long numSources = 32; + ASIOClockSource clocks[32]; + zeromem (clocks, sizeof (clocks)); + asioObject->getClockSources (clocks, &numSources); + bool isSourceSet = false; + + // careful not to remove this loop because it does more than just logging! + int i; + for (i = 0; i < numSources; ++i) + { + String s (T("clock: ")); + s += clocks[i].name; + + if (clocks[i].isCurrentSource) + { + isSourceSet = true; + s += T(" (cur)"); + } + + log (s); + } + + if (numSources > 1 && ! isSourceSet) + { + log (T("setting clock source")); + asioObject->setClockSource (clocks[0].index); + Thread::sleep (20); + } + else + { + if (numSources == 0) + { + log (T("ASIO - no clock sources!")); + } + } + + double cr = 0; + err = asioObject->getSampleRate (&cr); + if (err == 0) + { + currentSampleRate = cr; + } + else + { + logError (T("GetSampleRate"), err); + currentSampleRate = 0; + } + + error = String::empty; + needToReset = false; + isReSync = false; + err = 0; + bool buffersCreated = false; + + if (currentSampleRate != sampleRate) + { + log (T("ASIO samplerate: ") + String (currentSampleRate) + T(" to ") + String (sampleRate)); + err = asioObject->setSampleRate (sampleRate); + + if (err == ASE_NoClock && numSources > 0) + { + log (T("trying to set a clock source..")); + Thread::sleep (10); + err = asioObject->setClockSource (clocks[0].index); + if (err != 0) + { + logError (T("SetClock"), err); + } + + Thread::sleep (10); + err = asioObject->setSampleRate (sampleRate); + } + } + + if (err == 0) + { + currentSampleRate = sampleRate; + + if (needToReset) + { + if (isReSync) + { + log (T("Resync request")); + } + + log (T("! Resetting ASIO after sample rate change")); + removeCurrentDriver(); + + loadDriver(); + const String error (initDriver()); + + if (error.isNotEmpty()) + { + log (T("ASIOInit: ") + error); + } + + needToReset = false; + isReSync = false; + } + + numActiveInputChans = 0; + numActiveOutputChans = 0; + + ASIOBufferInfo* info = bufferInfos; + int i; + for (i = 0; i < numInputs; ++i) + { + if (inputChannels[i]) + { + info->isInput = 1; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = 0; + ++info; + ++numActiveInputChans; + } + } + + for (i = 0; i < numOutputs; ++i) + { + if (outputChannels[i]) + { + info->isInput = 0; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = 0; + ++info; + ++numActiveOutputChans; + } + } + + const int totalBuffers = numActiveInputChans + numActiveOutputChans; + + callbacks.bufferSwitch = &bufferSwitchCallback; + callbacks.sampleRateDidChange = &sampleRateChangedCallback; + callbacks.asioMessage = &asioMessagesCallback; + callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; + + log (T("disposing buffers")); + err = asioObject->disposeBuffers(); + + log (T("creating buffers: ") + String (totalBuffers) + T(", ") + String (currentBlockSizeSamples)); + err = asioObject->createBuffers (bufferInfos, + totalBuffers, + currentBlockSizeSamples, + &callbacks); + + if (err != 0) + { + currentBlockSizeSamples = preferredSize; + logError (T("create buffers 2"), err); + + asioObject->disposeBuffers(); + err = asioObject->createBuffers (bufferInfos, + totalBuffers, + currentBlockSizeSamples, + &callbacks); + } + + if (err == 0) + { + buffersCreated = true; + + jassert (! isThreadRunning()); + + if (tempBuffer != 0) + juce_free (tempBuffer); + + tempBuffer = (float*) juce_calloc (totalBuffers * currentBlockSizeSamples * sizeof (float) + 128); + + int n = 0; + Array types; + currentBitDepth = 16; + + for (i = 0; i < jmin (numInputs, maxASIOChannels); ++i) + { + if (inputChannels[i]) + { + inBuffers[i] = tempBuffer + (currentBlockSizeSamples * n++); + + ASIOChannelInfo channelInfo; + zerostruct (channelInfo); + + channelInfo.channel = i; + channelInfo.isInput = 1; + asioObject->getChannelInfo (&channelInfo); + + types.addIfNotAlreadyThere (channelInfo.type); + typeToFormatParameters (channelInfo.type, + inputChannelBitDepths[i], + inputChannelBytesPerSample[i], + inputChannelIsFloat[i], + inputChannelLittleEndian[i]); + + currentBitDepth = jmax (currentBitDepth, inputChannelBitDepths[i]); + } + else + { + inBuffers[i] = 0; + } + } + + for (i = 0; i < jmin (numOutputs, maxASIOChannels); ++i) + { + if (outputChannels[i]) + { + outBuffers[i] = tempBuffer + (currentBlockSizeSamples * n++); + + ASIOChannelInfo channelInfo; + zerostruct (channelInfo); + + channelInfo.channel = i; + channelInfo.isInput = 0; + asioObject->getChannelInfo (&channelInfo); + + types.addIfNotAlreadyThere (channelInfo.type); + typeToFormatParameters (channelInfo.type, + outputChannelBitDepths[i], + outputChannelBytesPerSample[i], + outputChannelIsFloat[i], + outputChannelLittleEndian[i]); + + currentBitDepth = jmax (currentBitDepth, outputChannelBitDepths[i]); + } + else + { + outBuffers[i] = 0; + } + } + + for (i = types.size(); --i >= 0;) + { + log (T("channel format: ") + String (types[i])); + } + + jassert (n <= totalBuffers); + + n = numActiveInputChans; + for (i = 0; i < numOutputs; ++i) + { + if (outputChannels[i]) + { + const int size = currentBlockSizeSamples * (outputChannelBitDepths[i] >> 3); + + if (bufferInfos[n].buffers[0] == 0 + || bufferInfos[n].buffers[1] == 0) + { + log (T("!! Null buffers")); + } + else + { + zeromem (bufferInfos[n].buffers[0], size); + zeromem (bufferInfos[n].buffers[1], size); + } + + ++n; + } + } + + jassert (n <= totalBuffers); + + inputLatency = outputLatency = 0; + + if (asioObject->getLatencies (&inputLatency, &outputLatency) != 0) + { + log (T("ASIO - no latencies")); + } + else + { + log (T("ASIO latencies: ") + + String ((int) outputLatency) + + T(", ") + + String ((int) inputLatency)); + } + + isOpen_ = true; + isThreadReady = false; + + if (isUsingThread) + { + event1.wait (1); // reset the event in case it was flipped by a callback from the ASIO->start call in openDevice() + startThread (8); + + int count = 5000; + while (--count > 0 && ! isThreadReady) + sleep (1); + } + + if (isUsingThread && ! isThreadRunning()) + { + error = T("Can't start thread!"); + } + else + { + log (T("starting ASIO")); + calledback = false; + err = asioObject->start(); + + if (err != 0) + { + if (isUsingThread) + { + signalThreadShouldExit(); + event1.signal(); + stopThread (3000); + } + + isOpen_ = false; + log (T("ASIO - stop on failure")); + Thread::sleep (10); + asioObject->stop(); + error = T("Can't start device"); + Thread::sleep (10); + } + else + { + int count = 300; + while (--count > 0 && ! calledback) + Thread::sleep (10); + + isStarted = true; + + if (! calledback) + { + error = T("Device didn't start correctly"); + log (T("ASIO didn't callback - stopping..")); + asioObject->stop(); + } + } + } + } + else + { + error = T("Can't create i/o buffers"); + } + } + else + { + error = T("Can't set sample rate: "); + error << sampleRate; + } + + if (error.isNotEmpty()) + { + logError (error, err); + + if (asioObject != 0 && buffersCreated) + asioObject->disposeBuffers(); + + Thread::sleep (20); + isStarted = false; + isOpen_ = false; + close(); + } + + needToReset = false; + isReSync = false; + + return error; + } + + void close() + { + error = String::empty; + stopTimer(); + stop(); + + if (isASIOOpen && isOpen_) + { + const ScopedLock sl (callbackLock); + + if (isUsingThread) + { + signalThreadShouldExit(); + event1.signal(); + stopThread (3000); + } + + isOpen_ = false; + isStarted = false; + needToReset = false; + isReSync = false; + + log (T("ASIO - stopping")); + + if (asioObject != 0) + { + Thread::sleep (20); + asioObject->stop(); + Thread::sleep (10); + asioObject->disposeBuffers(); + } + + Thread::sleep (10); + } + } + + bool isOpen() + { + return isOpen_ || insideControlPanelModalLoop; + } + + int getCurrentBufferSizeSamples() + { + return currentBlockSizeSamples; + } + + double getCurrentSampleRate() + { + return currentSampleRate; + } + + int getCurrentBitDepth() + { + return currentBitDepth; + } + + int getOutputLatencyInSamples() + { + return outputLatency; + } + + int getInputLatencyInSamples() + { + return inputLatency; + } + + void start (AudioIODeviceCallback* callback) + { + if (callback != 0) + { + callback->audioDeviceAboutToStart (currentSampleRate, currentBlockSizeSamples); + + const ScopedLock sl (callbackLock); + currentCallback = callback; + } + } + + void stop() + { + AudioIODeviceCallback* const lastCallback = currentCallback; + + { + const ScopedLock sl (callbackLock); + currentCallback = 0; + } + + if (lastCallback != 0) + lastCallback->audioDeviceStopped(); + } + + bool isPlaying() + { + return isASIOOpen && (isThreadRunning() || !isUsingThread) && (currentCallback != 0); + } + + const String getLastError() + { + return error; + } + + void setUsingThread (bool b) + { + shouldUseThread = b; + } + + bool hasControlPanel() const + { + return true; + } + + bool showControlPanel() + { + log (T("ASIO - showing control panel")); + + Component modalWindow (String::empty); + modalWindow.setOpaque (true); + modalWindow.addToDesktop (0); + modalWindow.enterModalState(); + bool done = false; + + JUCE_TRY + { + close(); + insideControlPanelModalLoop = true; + + const uint32 started = Time::getMillisecondCounter(); + + if (asioObject != 0) + { + asioObject->controlPanel(); + + const int spent = (int) Time::getMillisecondCounter() - (int) started; + + log (T("spent: ") + String (spent)); + + if (spent > 300) + { + shouldUsePreferredSize = true; + done = true; + } + } + } + JUCE_CATCH_ALL + + insideControlPanelModalLoop = false; + return done; + } + + void run() + { + isThreadReady = true; + + for (;;) + { + event1.wait(); + + if (threadShouldExit()) + break; + + processBuffer(); + } + + if (bufferIndex < 0) + { + log (T("! ASIO callback never called")); + } + } + + void resetRequest() + { + needToReset = true; + } + + void resyncRequest() + { + needToReset = true; + isReSync = true; + } + + void timerCallback() + { + if (! insideControlPanelModalLoop) + { + stopTimer(); + + // used to cause a reset + log (T("! ASIO restart request!")); + + if (isOpen_) + { + AudioIODeviceCallback* const oldCallback = currentCallback; + + close(); + open (currentChansIn, currentChansOut, + currentSampleRate, currentBlockSizeSamples); + + if (oldCallback != 0) + start (oldCallback); + } + } + else + { + startTimer (100); + } + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //============================================================================== + void* windowHandle; + CLSID classId; + String error; + + long numInputs, numOutputs; + StringArray outputChannelNames, inputChannelNames; + + Array sampleRates, bufferSizes; + long inputLatency, outputLatency; + long minSize, maxSize, preferredSize, granularity; + + int volatile currentBlockSizeSamples; + int volatile currentBitDepth; + double volatile currentSampleRate; + BitArray currentChansOut, currentChansIn; + AudioIODeviceCallback* volatile currentCallback; + CriticalSection callbackLock; + + float* inBuffers[maxASIOChannels]; + float* outBuffers[maxASIOChannels]; + int inputChannelBitDepths[maxASIOChannels]; + int outputChannelBitDepths[maxASIOChannels]; + int inputChannelBytesPerSample[maxASIOChannels]; + int outputChannelBytesPerSample[maxASIOChannels]; + bool inputChannelIsFloat[maxASIOChannels]; + bool outputChannelIsFloat[maxASIOChannels]; + bool inputChannelLittleEndian[maxASIOChannels]; + bool outputChannelLittleEndian[maxASIOChannels]; + + WaitableEvent event1; + float* tempBuffer; + int volatile bufferIndex, numActiveInputChans, numActiveOutputChans; + + bool isOpen_, isStarted; + bool isUsingThread, shouldUseThread; + bool volatile isASIOOpen; + bool volatile calledback; + bool volatile littleEndian, postOutput, needToReset, isReSync, isThreadReady; + + + //============================================================================== + static void removeCurrentDriver() + { + if (asioObject != 0) + { + asioObject->Release(); + asioObject = 0; + } + } + + bool loadDriver() + { + removeCurrentDriver(); + + JUCE_TRY + { + if (CoCreateInstance (classId, 0, CLSCTX_INPROC_SERVER, + classId, (void**) &asioObject) == S_OK) + { + return true; + } + } + JUCE_CATCH_ALL + + asioObject = 0; + + return false; + } + + const String initDriver() + { + if (asioObject != 0) + { + char buffer [256]; + zeromem (buffer, sizeof (buffer)); + + if (! asioObject->init (windowHandle)) + { + asioObject->getErrorMessage (buffer); + return String (buffer, sizeof (buffer) - 1); + } + + // just in case any daft drivers expect this to be called.. + asioObject->getDriverName (buffer); + + return String::empty; + } + + return T("No Driver"); + } + + const String openDevice() + { + // use this in case the driver starts opening dialog boxes.. + Component modalWindow (String::empty); + modalWindow.setOpaque (true); + modalWindow.addToDesktop (0); + modalWindow.enterModalState(); + + isUsingThread = shouldUseThread; + + // open the device and get its info.. + log (T("opening ASIO device: ") + getName()); + + needToReset = false; + isReSync = false; + outputChannelNames.clear(); + inputChannelNames.clear(); + bufferSizes.clear(); + sampleRates.clear(); + isASIOOpen = false; + isOpen_ = false; + numInputs = 0; + numOutputs = 0; + currentCallback = 0; + + error = String::empty; + + if (getName().isEmpty()) + return error; + + long err = 0; + + if (loadDriver()) + { + String driverName; + + if ((error = initDriver()).isEmpty()) + { + numInputs = 0; + numOutputs = 0; + + if (asioObject != 0 + && (err = asioObject->getChannels (&numInputs, &numOutputs)) == 0) + { + log (String ((int) numInputs) + T(" in, ") + String ((int) numOutputs) + T(" out")); + + if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0) + { + // find a list of buffer sizes.. + log (String ((int) minSize) + T(" ") + String ((int) maxSize) + T(" ") + String ((int)preferredSize) + T(" ") + String ((int)granularity)); + + if (granularity >= 0) + { + granularity = jmax (1, (int) granularity); + + for (int i = jmax (minSize, (int) granularity); i < jmin (6400, maxSize); i += granularity) + bufferSizes.addIfNotAlreadyThere (granularity * (i / granularity)); + } + else if (granularity < 0) + { + for (int i = 0; i < 18; ++i) + { + const int s = (1 << i); + + if (s >= minSize && s <= maxSize) + bufferSizes.add (s); + } + } + + if (! bufferSizes.contains (preferredSize)) + bufferSizes.insert (0, preferredSize); + + double currentRate = 0; + asioObject->getSampleRate (¤tRate); + + if (currentRate <= 0.0 || currentRate > 192001.0) + { + log (T("setting sample rate")); + err = asioObject->setSampleRate (44100.0); + if (err != 0) + { + logError (T("setting sample rate"), err); + } + + asioObject->getSampleRate (¤tRate); + } + + currentSampleRate = currentRate; + + postOutput = (asioObject->outputReady() == 0); + if (postOutput) + { + log (T("ASIO outputReady = ok")); + } + + updateSampleRates(); + + // ..because cubase does it at this point + inputLatency = outputLatency = 0; + if (asioObject->getLatencies (&inputLatency, &outputLatency) != 0) + { + log (T("ASIO - no latencies")); + } + + log (String (T("latencies: ")) + + String ((int)inputLatency) + T(", ") + String ((int)outputLatency)); + + // create some dummy buffers now.. because cubase does.. + numActiveInputChans = 0; + numActiveOutputChans = 0; + + ASIOBufferInfo* info = bufferInfos; + int i, numChans = 0; + for (i = 0; i < jmin (2, numInputs); ++i) + { + info->isInput = 1; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = 0; + ++info; + ++numChans; + } + + const int outputBufferIndex = numChans; + + for (i = 0; i < jmin (2, numOutputs); ++i) + { + info->isInput = 0; + info->channelNum = i; + info->buffers[0] = info->buffers[1] = 0; + ++info; + ++numChans; + } + + callbacks.bufferSwitch = &bufferSwitchCallback; + callbacks.sampleRateDidChange = &sampleRateChangedCallback; + callbacks.asioMessage = &asioMessagesCallback; + callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; + + log (T("creating buffers (dummy): ") + String (numChans) + + T(", ") + String ((int) preferredSize)); + + if (preferredSize > 0) + { + err = asioObject->createBuffers (bufferInfos, numChans, preferredSize, &callbacks); + if (err != 0) + { + logError (T("dummy buffers"), err); + } + } + + long newInps = 0, newOuts = 0; + asioObject->getChannels (&newInps, &newOuts); + + if (numInputs != newInps || numOutputs != newOuts) + { + numInputs = newInps; + numOutputs = newOuts; + + log (String ((int) numInputs) + T(" in; ") + + String ((int) numOutputs) + T(" out")); + } + + updateSampleRates(); + + ASIOChannelInfo channelInfo; + channelInfo.type = 0; + + for (i = 0; i < numInputs; ++i) + { + zerostruct (channelInfo); + channelInfo.channel = i; + channelInfo.isInput = 1; + asioObject->getChannelInfo (&channelInfo); + + inputChannelNames.add (String (channelInfo.name)); + } + + for (i = 0; i < numOutputs; ++i) + { + zerostruct (channelInfo); + channelInfo.channel = i; + channelInfo.isInput = 0; + asioObject->getChannelInfo (&channelInfo); + + outputChannelNames.add (String (channelInfo.name)); + + typeToFormatParameters (channelInfo.type, + outputChannelBitDepths[i], + outputChannelBytesPerSample[i], + outputChannelIsFloat[i], + outputChannelLittleEndian[i]); + + if (i < 2) + { + // clear the channels that are used with the dummy stuff + const int bytesPerBuffer = preferredSize * (outputChannelBitDepths[i] >> 3); + zeromem (bufferInfos [outputBufferIndex + i].buffers[0], bytesPerBuffer); + zeromem (bufferInfos [outputBufferIndex + i].buffers[1], bytesPerBuffer); + } + } + + outputChannelNames.trim(); + inputChannelNames.trim(); + outputChannelNames.appendNumbersToDuplicates (false, true); + inputChannelNames.appendNumbersToDuplicates (false, true); + + // start and stop because cubase does it.. + asioObject->getLatencies (&inputLatency, &outputLatency); + + if ((err = asioObject->start()) != 0) + { + // ignore an error here, as it might start later after setting other stuff up + logError (T("ASIO start"), err); + } + + Thread::sleep (100); + asioObject->stop(); + } + else + { + error = T("Can't detect buffer sizes"); + } + } + else + { + error = T("Can't detect asio channels"); + } + } + } + else + { + error = T("No such device"); + } + + if (error.isNotEmpty()) + { + logError (error, err); + + if (asioObject != 0) + asioObject->disposeBuffers(); + + removeCurrentDriver(); + isASIOOpen = false; + } + else + { + isASIOOpen = true; + log (T("ASIO device open")); + } + + isOpen_ = false; + needToReset = false; + isReSync = false; + + return error; + } + + //============================================================================== + void callback (long index) + { + if (isStarted) + { + bufferIndex = index; + + if (isUsingThread) // if not started, just use processBuffer() to clear the buffers directly + { + event1.signal(); + + if (postOutput && (! isThreadRunning()) && asioObject != 0) + asioObject->outputReady(); + } + else + { + processBuffer(); + } + } + else + { + if (postOutput && (asioObject != 0)) + asioObject->outputReady(); + } + + calledback = true; + } + + void processBuffer() + { + const ASIOBufferInfo* const infos = bufferInfos; + const int bi = bufferIndex; + + const ScopedLock sl (callbackLock); + + if (needToReset) + { + needToReset = false; + + if (isReSync) + { + log (T("! ASIO resync")); + isReSync = false; + } + else + { + startTimer (20); + } + } + + if (bi >= 0) + { + const int samps = currentBlockSizeSamples; + + if (currentCallback != 0) + { + int n = 0; + int i; + for (i = 0; i < numInputs; ++i) + { + float* const dst = inBuffers[i]; + + if (dst != 0) + { + const char* const src = (const char*) (infos[n].buffers[bi]); + + if (inputChannelIsFloat[i]) + { + memcpy (dst, src, samps * sizeof (float)); + } + else + { + jassert (dst == tempBuffer + (samps * n)); + + switch (inputChannelBitDepths[i]) + { + case 16: + convertInt16ToFloat (src, dst, inputChannelBytesPerSample[i], + samps, inputChannelLittleEndian[i]); + break; + + case 24: + convertInt24ToFloat (src, dst, inputChannelBytesPerSample[i], + samps, inputChannelLittleEndian[i]); + break; + + case 32: + convertInt32ToFloat (src, dst, inputChannelBytesPerSample[i], + samps, inputChannelLittleEndian[i]); + break; + + case 64: + jassertfalse + break; + } + } + + ++n; + } + } + + currentCallback->audioDeviceIOCallback ((const float**) inBuffers, + numInputs, + outBuffers, + numOutputs, + samps); + + for (i = 0; i < numOutputs; ++i) + { + float* const src = outBuffers[i]; + + if (src != 0) + { + char* const dst = (char*) (infos[n].buffers[bi]); + + if (outputChannelIsFloat[i]) + { + memcpy (dst, src, samps * sizeof (float)); + } + else + { + jassert (src == tempBuffer + (samps * n)); + + switch (outputChannelBitDepths[i]) + { + case 16: + convertFloatToInt16 (src, dst, outputChannelBytesPerSample[i], + samps, outputChannelLittleEndian[i]); + break; + + case 24: + convertFloatToInt24 (src, dst, outputChannelBytesPerSample[i], + samps, outputChannelLittleEndian[i]); + break; + + case 32: + convertFloatToInt32 (src, dst, outputChannelBytesPerSample[i], + samps, outputChannelLittleEndian[i]); + break; + + case 64: + jassertfalse + break; + } + } + + ++n; + } + } + } + else + { + int n = 0; + int i; + + for (i = 0; i < numInputs; ++i) + if (inBuffers[i] != 0) + ++n; + + for (i = 0; i < numOutputs; ++i) + { + if (outBuffers[i] != 0) + { + const int bytesPerBuffer = samps * (outputChannelBitDepths[i] >> 3); + zeromem (infos[n].buffers[bi], bytesPerBuffer); + ++n; + } + } + } + } + + if (postOutput) + asioObject->outputReady(); + } + + //============================================================================== + static ASIOTime* bufferSwitchTimeInfoCallback (ASIOTime*, long index, long) + { + if (currentASIODev != 0) + currentASIODev->callback (index); + + return 0; + } + + static void bufferSwitchCallback (long index, long) + { + if (currentASIODev != 0) + currentASIODev->callback (index); + } + + static long asioMessagesCallback (long selector, long value, void*, double*) + { + switch (selector) + { + case kAsioSelectorSupported: + if (value == kAsioResetRequest + || value == kAsioEngineVersion + || value == kAsioResyncRequest + || value == kAsioLatenciesChanged + || value == kAsioSupportsInputMonitor) + return 1; + break; + + case kAsioBufferSizeChange: + break; + + case kAsioResetRequest: + if (currentASIODev != 0) + currentASIODev->resetRequest(); + + return 1; + + case kAsioResyncRequest: + if (currentASIODev != 0) + currentASIODev->resyncRequest(); + + return 1; + + case kAsioLatenciesChanged: + return 1; + + case kAsioEngineVersion: + return 2; + + case kAsioSupportsTimeInfo: + case kAsioSupportsTimeCode: + return 0; + } + + return 0; + } + + static void sampleRateChangedCallback (ASIOSampleRate) + { + } + + //============================================================================== + static void convertInt16ToFloat (const char* src, + float* dest, + const int srcStrideBytes, + int numSamples, + const bool littleEndian) throw() + { + const double g = 1.0 / 32768.0; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (short) littleEndianShort (src)); + src += srcStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (short) bigEndianShort (src)); + src += srcStrideBytes; + } + } + } + + static void convertFloatToInt16 (const float* src, + char* dest, + const int dstStrideBytes, + int numSamples, + const bool littleEndian) throw() + { + const double maxVal = (double) 0x7fff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *(uint16*) dest = swapIfBigEndian ((uint16) (short) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *(uint16*) dest = swapIfLittleEndian ((uint16) (short) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + } + + static void convertInt24ToFloat (const char* src, + float* dest, + const int srcStrideBytes, + int numSamples, + const bool littleEndian) throw() + { + const double g = 1.0 / 0x7fffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * littleEndian24Bit (src)); + src += srcStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * bigEndian24Bit (src)); + src += srcStrideBytes; + } + } + } + + static void convertFloatToInt24 (const float* src, + char* dest, + const int dstStrideBytes, + int numSamples, + const bool littleEndian) throw() + { + const double maxVal = (double) 0x7fffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + littleEndian24BitToChars ((uint32) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); + dest += dstStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + bigEndian24BitToChars ((uint32) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); + dest += dstStrideBytes; + } + } + } + + static void convertInt32ToFloat (const char* src, + float* dest, + const int srcStrideBytes, + int numSamples, + const bool littleEndian) throw() + { + const double g = 1.0 / 0x7fffffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (int) littleEndianInt (src)); + src += srcStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *dest++ = (float) (g * (int) bigEndianInt (src)); + src += srcStrideBytes; + } + } + } + + static void convertFloatToInt32 (const float* src, + char* dest, + const int dstStrideBytes, + int numSamples, + const bool littleEndian) throw() + { + const double maxVal = (double) 0x7fffffff; + + if (littleEndian) + { + while (--numSamples >= 0) + { + *(uint32*) dest = swapIfBigEndian ((uint32) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + else + { + while (--numSamples >= 0) + { + *(uint32*) dest = swapIfLittleEndian ((uint32) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); + dest += dstStrideBytes; + } + } + } + + //============================================================================== + static void typeToFormatParameters (const long type, + int& bitDepth, + int& byteStride, + bool& formatIsFloat, + bool& littleEndian) throw() + { + bitDepth = 0; + littleEndian = false; + formatIsFloat = false; + + switch (type) + { + case ASIOSTInt16MSB: + case ASIOSTInt16LSB: + case ASIOSTInt32MSB16: + case ASIOSTInt32LSB16: + bitDepth = 16; break; + + case ASIOSTFloat32MSB: + case ASIOSTFloat32LSB: + formatIsFloat = true; + bitDepth = 32; break; + + case ASIOSTInt32MSB: + case ASIOSTInt32LSB: + bitDepth = 32; break; + + case ASIOSTInt24MSB: + case ASIOSTInt24LSB: + case ASIOSTInt32MSB24: + case ASIOSTInt32LSB24: + case ASIOSTInt32MSB18: + case ASIOSTInt32MSB20: + case ASIOSTInt32LSB18: + case ASIOSTInt32LSB20: + bitDepth = 24; break; + + case ASIOSTFloat64MSB: + case ASIOSTFloat64LSB: + default: + bitDepth = 64; + break; + } + + switch (type) + { + case ASIOSTInt16MSB: + case ASIOSTInt32MSB16: + case ASIOSTFloat32MSB: + case ASIOSTFloat64MSB: + case ASIOSTInt32MSB: + case ASIOSTInt32MSB18: + case ASIOSTInt32MSB20: + case ASIOSTInt32MSB24: + case ASIOSTInt24MSB: + littleEndian = false; break; + + case ASIOSTInt16LSB: + case ASIOSTInt32LSB16: + case ASIOSTFloat32LSB: + case ASIOSTFloat64LSB: + case ASIOSTInt32LSB: + case ASIOSTInt32LSB18: + case ASIOSTInt32LSB20: + case ASIOSTInt32LSB24: + case ASIOSTInt24LSB: + littleEndian = true; break; + + default: + break; + } + + switch (type) + { + case ASIOSTInt16LSB: + case ASIOSTInt16MSB: + byteStride = 2; break; + + case ASIOSTInt24LSB: + case ASIOSTInt24MSB: + byteStride = 3; break; + + case ASIOSTInt32MSB16: + case ASIOSTInt32LSB16: + case ASIOSTInt32MSB: + case ASIOSTInt32MSB18: + case ASIOSTInt32MSB20: + case ASIOSTInt32MSB24: + case ASIOSTInt32LSB: + case ASIOSTInt32LSB18: + case ASIOSTInt32LSB20: + case ASIOSTInt32LSB24: + case ASIOSTFloat32LSB: + case ASIOSTFloat32MSB: + byteStride = 4; break; + + case ASIOSTFloat64MSB: + case ASIOSTFloat64LSB: + byteStride = 8; break; + + default: + break; + } + } +}; + +//============================================================================== +class ASIOAudioIODeviceType : public AudioIODeviceType +{ +public: + ASIOAudioIODeviceType() + : AudioIODeviceType (T("ASIO")), + classIds (2), + hasScanned (false) + { + CoInitialize (0); + } + + ~ASIOAudioIODeviceType() + { + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + deviceNames.clear(); + classIds.clear(); + + HKEY hk = 0; + int index = 0; + + if (RegOpenKeyA (HKEY_LOCAL_MACHINE, "software\\asio", &hk) == ERROR_SUCCESS) + { + for (;;) + { + char name [256]; + + if (RegEnumKeyA (hk, index++, name, 256) == ERROR_SUCCESS) + { + addDriverInfo (name, hk); + } + else + { + break; + } + } + + RegCloseKey (hk); + } + } + + const StringArray getDeviceNames (const bool /*preferInputNames*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return deviceNames; + } + + const String getDefaultDeviceName (const bool /*preferInputNames*/) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return deviceNames [0]; + } + + AudioIODevice* createDevice (const String& deviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + const int index = deviceNames.indexOf (deviceName); + + if (index >= 0) + { + jassert (currentASIODev == 0); // unfortunately you can't have more than one ASIO device + // open at the same time.. + + if (currentASIODev == 0) + return new ASIOAudioIODevice (deviceName, *(classIds [index])); + } + + return 0; + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + StringArray deviceNames; + OwnedArray classIds; + + bool hasScanned; + + //============================================================================== + static bool checkClassIsOk (const String& classId) + { + HKEY hk = 0; + bool ok = false; + + if (RegOpenKeyA (HKEY_CLASSES_ROOT, "clsid", &hk) == ERROR_SUCCESS) + { + int index = 0; + + for (;;) + { + char buf [512]; + + if (RegEnumKeyA (hk, index++, buf, 512) == ERROR_SUCCESS) + { + if (classId.equalsIgnoreCase (buf)) + { + HKEY subKey, pathKey; + + if (RegOpenKeyExA (hk, buf, 0, KEY_READ, &subKey) == ERROR_SUCCESS) + { + if (RegOpenKeyExA (subKey, "InprocServer32", 0, KEY_READ, &pathKey) == ERROR_SUCCESS) + { + char pathName [600]; + DWORD dtype = REG_SZ; + DWORD dsize = sizeof (pathName); + + if (RegQueryValueExA (pathKey, 0, 0, &dtype, + (LPBYTE) pathName, &dsize) == ERROR_SUCCESS) + { + OFSTRUCT of; + zerostruct (of); + + of.cBytes = sizeof (of); + + ok = (OpenFile (String (pathName), &of, OF_EXIST) != 0); + } + + RegCloseKey (pathKey); + } + + RegCloseKey (subKey); + } + + break; + } + } + else + { + break; + } + } + + RegCloseKey (hk); + } + + return ok; + } + + void addDriverInfo (const String& keyName, HKEY hk) + { + HKEY subKey; + + if (RegOpenKeyExA (hk, keyName, 0, KEY_READ, &subKey) == ERROR_SUCCESS) + { + char buf [256]; + DWORD dtype = REG_SZ; + DWORD dsize = sizeof (buf); + zeromem (buf, dsize); + + if (RegQueryValueExA (subKey, "clsid", 0, &dtype, (LPBYTE) buf, &dsize) == ERROR_SUCCESS) + { + if (dsize > 0 && checkClassIsOk (buf)) + { + wchar_t classIdStr [130]; + MultiByteToWideChar (CP_ACP, 0, buf, -1, classIdStr, 128); + + String deviceName; + CLSID classId; + + if (CLSIDFromString ((LPOLESTR) classIdStr, &classId) == S_OK) + { + dtype = REG_SZ; + dsize = sizeof (buf); + + if (RegQueryValueExA (subKey, "description", 0, &dtype, (LPBYTE) buf, &dsize) == ERROR_SUCCESS) + deviceName = buf; + else + deviceName = keyName; + + log (T("found ") + deviceName); + deviceNames.add (deviceName); + classIds.add (new CLSID (classId)); + } + } + + RegCloseKey (subKey); + } + } + } + + ASIOAudioIODeviceType (const ASIOAudioIODeviceType&); + const ASIOAudioIODeviceType& operator= (const ASIOAudioIODeviceType&); +}; + +AudioIODeviceType* juce_createASIOAudioIODeviceType() +{ + return new ASIOAudioIODeviceType(); +} + + +END_JUCE_NAMESPACE + +#endif diff --git a/build/win32/platform_specific_code/juce_win32_AudioCDReader.cpp b/build/win32/platform_specific_code/juce_win32_AudioCDReader.cpp new file mode 100644 index 0000000000..2055ec5826 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_AudioCDReader.cpp @@ -0,0 +1,2114 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#define WIN32_LEAN_AND_MEAN +#define STRICT + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) +#endif + +#include "win32_headers.h" +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/audio_file_formats/juce_AudioCDReader.h" +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + +//*************************************************************************** +// %%% TARGET STATUS VALUES %%% +//*************************************************************************** +#define STATUS_GOOD 0x00 // Status Good +#define STATUS_CHKCOND 0x02 // Check Condition +#define STATUS_CONDMET 0x04 // Condition Met +#define STATUS_BUSY 0x08 // Busy +#define STATUS_INTERM 0x10 // Intermediate +#define STATUS_INTCDMET 0x14 // Intermediate-condition met +#define STATUS_RESCONF 0x18 // Reservation conflict +#define STATUS_COMTERM 0x22 // Command Terminated +#define STATUS_QFULL 0x28 // Queue full + +//*************************************************************************** +// %%% SCSI MISCELLANEOUS EQUATES %%% +//*************************************************************************** +#define MAXLUN 7 // Maximum Logical Unit Id +#define MAXTARG 7 // Maximum Target Id +#define MAX_SCSI_LUNS 64 // Maximum Number of SCSI LUNs +#define MAX_NUM_HA 8 // Maximum Number of SCSI HA's + +//*************************************************************************** +// %%% Commands for all Device Types %%% +//*************************************************************************** +#define SCSI_CHANGE_DEF 0x40 // Change Definition (Optional) +#define SCSI_COMPARE 0x39 // Compare (O) +#define SCSI_COPY 0x18 // Copy (O) +#define SCSI_COP_VERIFY 0x3A // Copy and Verify (O) +#define SCSI_INQUIRY 0x12 // Inquiry (MANDATORY) +#define SCSI_LOG_SELECT 0x4C // Log Select (O) +#define SCSI_LOG_SENSE 0x4D // Log Sense (O) +#define SCSI_MODE_SEL6 0x15 // Mode Select 6-byte (Device Specific) +#define SCSI_MODE_SEL10 0x55 // Mode Select 10-byte (Device Specific) +#define SCSI_MODE_SEN6 0x1A // Mode Sense 6-byte (Device Specific) +#define SCSI_MODE_SEN10 0x5A // Mode Sense 10-byte (Device Specific) +#define SCSI_READ_BUFF 0x3C // Read Buffer (O) +#define SCSI_REQ_SENSE 0x03 // Request Sense (MANDATORY) +#define SCSI_SEND_DIAG 0x1D // Send Diagnostic (O) +#define SCSI_TST_U_RDY 0x00 // Test Unit Ready (MANDATORY) +#define SCSI_WRITE_BUFF 0x3B // Write Buffer (O) + +//*************************************************************************** +// %%% Commands Unique to Direct Access Devices %%% +//*************************************************************************** +#define SCSI_COMPARE 0x39 // Compare (O) +#define SCSI_FORMAT 0x04 // Format Unit (MANDATORY) +#define SCSI_LCK_UN_CAC 0x36 // Lock Unlock Cache (O) +#define SCSI_PREFETCH 0x34 // Prefetch (O) +#define SCSI_MED_REMOVL 0x1E // Prevent/Allow medium Removal (O) +#define SCSI_READ6 0x08 // Read 6-byte (MANDATORY) +#define SCSI_READ10 0x28 // Read 10-byte (MANDATORY) +#define SCSI_RD_CAPAC 0x25 // Read Capacity (MANDATORY) +#define SCSI_RD_DEFECT 0x37 // Read Defect Data (O) +#define SCSI_READ_LONG 0x3E // Read Long (O) +#define SCSI_REASS_BLK 0x07 // Reassign Blocks (O) +#define SCSI_RCV_DIAG 0x1C // Receive Diagnostic Results (O) +#define SCSI_RELEASE 0x17 // Release Unit (MANDATORY) +#define SCSI_REZERO 0x01 // Rezero Unit (O) +#define SCSI_SRCH_DAT_E 0x31 // Search Data Equal (O) +#define SCSI_SRCH_DAT_H 0x30 // Search Data High (O) +#define SCSI_SRCH_DAT_L 0x32 // Search Data Low (O) +#define SCSI_SEEK6 0x0B // Seek 6-Byte (O) +#define SCSI_SEEK10 0x2B // Seek 10-Byte (O) +#define SCSI_SEND_DIAG 0x1D // Send Diagnostics (MANDATORY) +#define SCSI_SET_LIMIT 0x33 // Set Limits (O) +#define SCSI_START_STP 0x1B // Start/Stop Unit (O) +#define SCSI_SYNC_CACHE 0x35 // Synchronize Cache (O) +#define SCSI_VERIFY 0x2F // Verify (O) +#define SCSI_WRITE6 0x0A // Write 6-Byte (MANDATORY) +#define SCSI_WRITE10 0x2A // Write 10-Byte (MANDATORY) +#define SCSI_WRT_VERIFY 0x2E // Write and Verify (O) +#define SCSI_WRITE_LONG 0x3F // Write Long (O) +#define SCSI_WRITE_SAME 0x41 // Write Same (O) + +//*************************************************************************** +// %%% Commands Unique to Sequential Access Devices %%% +//*************************************************************************** +#define SCSI_ERASE 0x19 // Erase (MANDATORY) +#define SCSI_LOAD_UN 0x1b // Load/Unload (O) +#define SCSI_LOCATE 0x2B // Locate (O) +#define SCSI_RD_BLK_LIM 0x05 // Read Block Limits (MANDATORY) +#define SCSI_READ_POS 0x34 // Read Position (O) +#define SCSI_READ_REV 0x0F // Read Reverse (O) +#define SCSI_REC_BF_DAT 0x14 // Recover Buffer Data (O) +#define SCSI_RESERVE 0x16 // Reserve Unit (MANDATORY) +#define SCSI_REWIND 0x01 // Rewind (MANDATORY) +#define SCSI_SPACE 0x11 // Space (MANDATORY) +#define SCSI_VERIFY_T 0x13 // Verify (Tape) (O) +#define SCSI_WRT_FILE 0x10 // Write Filemarks (MANDATORY) + +//*************************************************************************** +// %%% Commands Unique to Printer Devices %%% +//*************************************************************************** +#define SCSI_PRINT 0x0A // Print (MANDATORY) +#define SCSI_SLEW_PNT 0x0B // Slew and Print (O) +#define SCSI_STOP_PNT 0x1B // Stop Print (O) +#define SCSI_SYNC_BUFF 0x10 // Synchronize Buffer (O) + +//*************************************************************************** +// %%% Commands Unique to Processor Devices %%% +//*************************************************************************** +#define SCSI_RECEIVE 0x08 // Receive (O) +#define SCSI_SEND 0x0A // Send (O) + +//*************************************************************************** +// %%% Commands Unique to Write-Once Devices %%% +//*************************************************************************** +#define SCSI_MEDIUM_SCN 0x38 // Medium Scan (O) +#define SCSI_SRCHDATE10 0x31 // Search Data Equal 10-Byte (O) +#define SCSI_SRCHDATE12 0xB1 // Search Data Equal 12-Byte (O) +#define SCSI_SRCHDATH10 0x30 // Search Data High 10-Byte (O) +#define SCSI_SRCHDATH12 0xB0 // Search Data High 12-Byte (O) +#define SCSI_SRCHDATL10 0x32 // Search Data Low 10-Byte (O) +#define SCSI_SRCHDATL12 0xB2 // Search Data Low 12-Byte (O) +#define SCSI_SET_LIM_10 0x33 // Set Limits 10-Byte (O) +#define SCSI_SET_LIM_12 0xB3 // Set Limits 10-Byte (O) +#define SCSI_VERIFY10 0x2F // Verify 10-Byte (O) +#define SCSI_VERIFY12 0xAF // Verify 12-Byte (O) +#define SCSI_WRITE12 0xAA // Write 12-Byte (O) +#define SCSI_WRT_VER10 0x2E // Write and Verify 10-Byte (O) +#define SCSI_WRT_VER12 0xAE // Write and Verify 12-Byte (O) + +//*************************************************************************** +// %%% Commands Unique to CD-ROM Devices %%% +//*************************************************************************** +#define SCSI_PLAYAUD_10 0x45 // Play Audio 10-Byte (O) +#define SCSI_PLAYAUD_12 0xA5 // Play Audio 12-Byte 12-Byte (O) +#define SCSI_PLAYAUDMSF 0x47 // Play Audio MSF (O) +#define SCSI_PLAYA_TKIN 0x48 // Play Audio Track/Index (O) +#define SCSI_PLYTKREL10 0x49 // Play Track Relative 10-Byte (O) +#define SCSI_PLYTKREL12 0xA9 // Play Track Relative 12-Byte (O) +#define SCSI_READCDCAP 0x25 // Read CD-ROM Capacity (MANDATORY) +#define SCSI_READHEADER 0x44 // Read Header (O) +#define SCSI_SUBCHANNEL 0x42 // Read Subchannel (O) +#define SCSI_READ_TOC 0x43 // Read TOC (O) + +//*************************************************************************** +// %%% Commands Unique to Scanner Devices %%% +//*************************************************************************** +#define SCSI_GETDBSTAT 0x34 // Get Data Buffer Status (O) +#define SCSI_GETWINDOW 0x25 // Get Window (O) +#define SCSI_OBJECTPOS 0x31 // Object Postion (O) +#define SCSI_SCAN 0x1B // Scan (O) +#define SCSI_SETWINDOW 0x24 // Set Window (MANDATORY) + +//*************************************************************************** +// %%% Commands Unique to Optical Memory Devices %%% +//*************************************************************************** +#define SCSI_UpdateBlk 0x3D // Update Block (O) + +//*************************************************************************** +// %%% Commands Unique to Medium Changer Devices %%% +//*************************************************************************** +#define SCSI_EXCHMEDIUM 0xA6 // Exchange Medium (O) +#define SCSI_INITELSTAT 0x07 // Initialize Element Status (O) +#define SCSI_POSTOELEM 0x2B // Position to Element (O) +#define SCSI_REQ_VE_ADD 0xB5 // Request Volume Element Address (O) +#define SCSI_SENDVOLTAG 0xB6 // Send Volume Tag (O) + +//*************************************************************************** +// %%% Commands Unique to Communication Devices %%% +//*************************************************************************** +#define SCSI_GET_MSG_6 0x08 // Get Message 6-Byte (MANDATORY) +#define SCSI_GET_MSG_10 0x28 // Get Message 10-Byte (O) +#define SCSI_GET_MSG_12 0xA8 // Get Message 12-Byte (O) +#define SCSI_SND_MSG_6 0x0A // Send Message 6-Byte (MANDATORY) +#define SCSI_SND_MSG_10 0x2A // Send Message 10-Byte (O) +#define SCSI_SND_MSG_12 0xAA // Send Message 12-Byte (O) + + +//*************************************************************************** +// %%% Request Sense Data Format %%% +//*************************************************************************** +typedef struct { + BYTE ErrorCode; // Error Code (70H or 71H) + BYTE SegmentNum; // Number of current segment descriptor + BYTE SenseKey; // Sense Key(See bit definitions too) + BYTE InfoByte0; // Information MSB + BYTE InfoByte1; // Information MID + BYTE InfoByte2; // Information MID + BYTE InfoByte3; // Information LSB + BYTE AddSenLen; // Additional Sense Length + BYTE ComSpecInf0; // Command Specific Information MSB + BYTE ComSpecInf1; // Command Specific Information MID + BYTE ComSpecInf2; // Command Specific Information MID + BYTE ComSpecInf3; // Command Specific Information LSB + BYTE AddSenseCode; // Additional Sense Code + BYTE AddSenQual; // Additional Sense Code Qualifier + BYTE FieldRepUCode; // Field Replaceable Unit Code + BYTE SenKeySpec15; // Sense Key Specific 15th byte + BYTE SenKeySpec16; // Sense Key Specific 16th byte + BYTE SenKeySpec17; // Sense Key Specific 17th byte + BYTE AddSenseBytes; // Additional Sense Bytes +} SENSE_DATA_FMT; + +//*************************************************************************** +// %%% REQUEST SENSE ERROR CODE %%% +//*************************************************************************** +#define SERROR_CURRENT 0x70 // Current Errors +#define SERROR_DEFERED 0x71 // Deferred Errors + +//*************************************************************************** +// %%% REQUEST SENSE BIT DEFINITIONS %%% +//*************************************************************************** +#define SENSE_VALID 0x80 // Byte 0 Bit 7 +#define SENSE_FILEMRK 0x80 // Byte 2 Bit 7 +#define SENSE_EOM 0x40 // Byte 2 Bit 6 +#define SENSE_ILI 0x20 // Byte 2 Bit 5 + +//*************************************************************************** +// %%% REQUEST SENSE SENSE KEY DEFINITIONS %%% +//*************************************************************************** +#define KEY_NOSENSE 0x00 // No Sense +#define KEY_RECERROR 0x01 // Recovered Error +#define KEY_NOTREADY 0x02 // Not Ready +#define KEY_MEDIUMERR 0x03 // Medium Error +#define KEY_HARDERROR 0x04 // Hardware Error +#define KEY_ILLGLREQ 0x05 // Illegal Request +#define KEY_UNITATT 0x06 // Unit Attention +#define KEY_DATAPROT 0x07 // Data Protect +#define KEY_BLANKCHK 0x08 // Blank Check +#define KEY_VENDSPEC 0x09 // Vendor Specific +#define KEY_COPYABORT 0x0A // Copy Abort +#define KEY_EQUAL 0x0C // Equal (Search) +#define KEY_VOLOVRFLW 0x0D // Volume Overflow +#define KEY_MISCOMP 0x0E // Miscompare (Search) +#define KEY_RESERVED 0x0F // Reserved + +//*************************************************************************** +// %%% PERIPHERAL DEVICE TYPE DEFINITIONS %%% +//*************************************************************************** +#define DTYPE_DASD 0x00 // Disk Device +#define DTYPE_SEQD 0x01 // Tape Device +#define DTYPE_PRNT 0x02 // Printer +#define DTYPE_PROC 0x03 // Processor +#define DTYPE_WORM 0x04 // Write-once read-multiple +#define DTYPE_CROM 0x05 // CD-ROM device +#define DTYPE_SCAN 0x06 // Scanner device +#define DTYPE_OPTI 0x07 // Optical memory device +#define DTYPE_JUKE 0x08 // Medium Changer device +#define DTYPE_COMM 0x09 // Communications device +#define DTYPE_RESL 0x0A // Reserved (low) +#define DTYPE_RESH 0x1E // Reserved (high) +#define DTYPE_UNKNOWN 0x1F // Unknown or no device type + +//*************************************************************************** +// %%% ANSI APPROVED VERSION DEFINITIONS %%% +//*************************************************************************** +#define ANSI_MAYBE 0x0 // Device may or may not be ANSI approved stand +#define ANSI_SCSI1 0x1 // Device complies to ANSI X3.131-1986 (SCSI-1) +#define ANSI_SCSI2 0x2 // Device complies to SCSI-2 +#define ANSI_RESLO 0x3 // Reserved (low) +#define ANSI_RESHI 0x7 // Reserved (high) + + +typedef struct +{ + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + ULONG DataBufferOffset; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +} SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH; + +typedef struct +{ + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +} SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; + +typedef struct +{ + SCSI_PASS_THROUGH_DIRECT spt; + ULONG Filler; + UCHAR ucSenseBuf[32]; +} SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, *PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; + +typedef struct +{ + ULONG Length; + UCHAR PortNumber; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; +} SCSI_ADDRESS, *PSCSI_ADDRESS; + + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +#define FILE_ANY_ACCESS 0 +#ifndef FILE_READ_ACCESS +#define FILE_READ_ACCESS (0x0001) +#endif +#ifndef FILE_WRITE_ACCESS +#define FILE_WRITE_ACCESS (0x0002) +#endif + +#define IOCTL_SCSI_BASE 0x00000004 + +#define SCSI_IOCTL_DATA_OUT 0 +#define SCSI_IOCTL_DATA_IN 1 +#define SCSI_IOCTL_DATA_UNSPECIFIED 2 + +#define CTL_CODE2( DevType, Function, Method, Access ) ( \ + ((DevType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +#define IOCTL_SCSI_PASS_THROUGH CTL_CODE2( IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS ) +#define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE2( IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE2( IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS ) +#define IOCTL_SCSI_GET_ADDRESS CTL_CODE2( IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS ) + + +#define SENSE_LEN 14 +#define SRB_DIR_SCSI 0x00 +#define SRB_POSTING 0x01 +#define SRB_ENABLE_RESIDUAL_COUNT 0x04 +#define SRB_DIR_IN 0x08 +#define SRB_DIR_OUT 0x10 +#define SRB_EVENT_NOTIFY 0x40 +#define RESIDUAL_COUNT_SUPPORTED 0x02 +#define MAX_SRB_TIMEOUT 1080001u +#define DEFAULT_SRB_TIMEOUT 1080001u + +#define SC_HA_INQUIRY 0x00 +#define SC_GET_DEV_TYPE 0x01 +#define SC_EXEC_SCSI_CMD 0x02 +#define SC_ABORT_SRB 0x03 +#define SC_RESET_DEV 0x04 +#define SC_SET_HA_PARMS 0x05 +#define SC_GET_DISK_INFO 0x06 +#define SC_RESCAN_SCSI_BUS 0x07 +#define SC_GETSET_TIMEOUTS 0x08 + +#define SS_PENDING 0x00 +#define SS_COMP 0x01 +#define SS_ABORTED 0x02 +#define SS_ABORT_FAIL 0x03 +#define SS_ERR 0x04 +#define SS_INVALID_CMD 0x80 +#define SS_INVALID_HA 0x81 +#define SS_NO_DEVICE 0x82 +#define SS_INVALID_SRB 0xE0 +#define SS_OLD_MANAGER 0xE1 +#define SS_BUFFER_ALIGN 0xE1 +#define SS_ILLEGAL_MODE 0xE2 +#define SS_NO_ASPI 0xE3 +#define SS_FAILED_INIT 0xE4 +#define SS_ASPI_IS_BUSY 0xE5 +#define SS_BUFFER_TO_BIG 0xE6 +#define SS_BUFFER_TOO_BIG 0xE6 +#define SS_MISMATCHED_COMPONENTS 0xE7 +#define SS_NO_ADAPTERS 0xE8 +#define SS_INSUFFICIENT_RESOURCES 0xE9 +#define SS_ASPI_IS_SHUTDOWN 0xEA +#define SS_BAD_INSTALL 0xEB + +#define HASTAT_OK 0x00 +#define HASTAT_SEL_TO 0x11 +#define HASTAT_DO_DU 0x12 +#define HASTAT_BUS_FREE 0x13 +#define HASTAT_PHASE_ERR 0x14 +#define HASTAT_TIMEOUT 0x09 +#define HASTAT_COMMAND_TIMEOUT 0x0B +#define HASTAT_MESSAGE_REJECT 0x0D +#define HASTAT_BUS_RESET 0x0E +#define HASTAT_PARITY_ERROR 0x0F +#define HASTAT_REQUEST_SENSE_FAILED 0x10 + +#define PACKED +#pragma pack(1) + +typedef struct +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaID; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; + BYTE HA_Count; + BYTE HA_SCSI_ID; + BYTE HA_ManagerId[16]; + BYTE HA_Identifier[16]; + BYTE HA_Unique[16]; + WORD HA_Rsvd1; + BYTE pad[20]; +} PACKED SRB_HAInquiry, *PSRB_HAInquiry, FAR *LPSRB_HAInquiry; + + +typedef struct +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaID; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; + BYTE SRB_Target; + BYTE SRB_Lun; + BYTE SRB_DeviceType; + BYTE SRB_Rsvd1; + BYTE pad[68]; +} PACKED SRB_GDEVBlock, *PSRB_GDEVBlock, FAR *LPSRB_GDEVBlock; + + +typedef struct +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaID; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; + BYTE SRB_Target; + BYTE SRB_Lun; + WORD SRB_Rsvd1; + DWORD SRB_BufLen; + BYTE FAR *SRB_BufPointer; + BYTE SRB_SenseLen; + BYTE SRB_CDBLen; + BYTE SRB_HaStat; + BYTE SRB_TargStat; + VOID FAR *SRB_PostProc; + BYTE SRB_Rsvd2[20]; + BYTE CDBByte[16]; + BYTE SenseArea[SENSE_LEN+2]; +} PACKED SRB_ExecSCSICmd, *PSRB_ExecSCSICmd, FAR *LPSRB_ExecSCSICmd; + + +typedef struct +{ + BYTE SRB_Cmd; + BYTE SRB_Status; + BYTE SRB_HaId; + BYTE SRB_Flags; + DWORD SRB_Hdr_Rsvd; +} PACKED SRB, *PSRB, FAR *LPSRB; + +#pragma pack() + + +//============================================================================== +struct CDDeviceInfo +{ + char vendor[9]; + char productId[17]; + char rev[5]; + char vendorSpec[21]; + + BYTE ha; + BYTE tgt; + BYTE lun; + char scsiDriveLetter; // will be 0 if not using scsi +}; + + +//============================================================================== +class CDReadBuffer +{ +public: + int startFrame; + int numFrames; + int dataStartOffset; + int dataLength; + BYTE* buffer; + int bufferSize; + int index; + bool wantsIndex; + + //============================================================================== + CDReadBuffer (const int numberOfFrames) + : startFrame (0), + numFrames (0), + dataStartOffset (0), + dataLength (0), + index (0), + wantsIndex (false) + { + bufferSize = 2352 * numberOfFrames; + buffer = (BYTE*) malloc (bufferSize); + } + + ~CDReadBuffer() + { + free (buffer); + } + + bool isZero() const + { + BYTE* p = buffer + dataStartOffset; + + for (int i = dataLength; --i >= 0;) + if (*p++ != 0) + return false; + + return true; + } +}; + +class CDDeviceHandle; + +class CDController +{ +public: + CDController(); + virtual ~CDController(); + + virtual bool read (CDReadBuffer* t) = 0; + virtual void shutDown(); + + bool readAudio (CDReadBuffer* t, CDReadBuffer* overlapBuffer = 0); + int getLastIndex(); + +public: + bool initialised; + + CDDeviceHandle* deviceInfo; + int framesToCheck, framesOverlap; + + void prepare (SRB_ExecSCSICmd& s); + void perform (SRB_ExecSCSICmd& s); + void setPaused (bool paused); +}; + + +//============================================================================== +#pragma pack(1) + +struct TOCTRACK +{ + BYTE rsvd; + BYTE ADR; + BYTE trackNumber; + BYTE rsvd2; + BYTE addr[4]; +}; + +struct TOC +{ + WORD tocLen; + BYTE firstTrack; + BYTE lastTrack; + TOCTRACK tracks[100]; +}; + +#pragma pack() + +enum +{ + READTYPE_ANY = 0, + READTYPE_ATAPI1 = 1, + READTYPE_ATAPI2 = 2, + READTYPE_READ6 = 3, + READTYPE_READ10 = 4, + READTYPE_READ_D8 = 5, + READTYPE_READ_D4 = 6, + READTYPE_READ_D4_1 = 7, + READTYPE_READ10_2 = 8 +}; + + +//============================================================================== +class CDDeviceHandle +{ +public: + CDDeviceHandle (const CDDeviceInfo* const device) + : scsiHandle (0), + readType (READTYPE_ANY), + controller (0) + { + memcpy (&info, device, sizeof (info)); + } + + ~CDDeviceHandle() + { + if (controller != 0) + { + controller->shutDown(); + delete controller; + } + + if (scsiHandle != 0) + CloseHandle (scsiHandle); + } + + bool readTOC (TOC* lpToc, bool useMSF); + bool readAudio (CDReadBuffer* buffer, CDReadBuffer* overlapBuffer = 0); + void openDrawer (bool shouldBeOpen); + + CDDeviceInfo info; + HANDLE scsiHandle; + BYTE readType; + +private: + CDController* controller; + + bool testController (const int readType, + CDController* const newController, + CDReadBuffer* const bufferToUse); +}; + + +//============================================================================== +DWORD (*fGetASPI32SupportInfo)(void); +DWORD (*fSendASPI32Command)(LPSRB); + +//============================================================================== +static HINSTANCE winAspiLib = 0; +static bool usingScsi = false; +static bool initialised = false; + + +static bool InitialiseCDRipper() +{ + if (! initialised) + { + initialised = true; + + OSVERSIONINFO info; + info.dwOSVersionInfoSize = sizeof (info); + GetVersionEx (&info); + + usingScsi = (info.dwPlatformId == VER_PLATFORM_WIN32_NT) && (info.dwMajorVersion > 4); + + if (! usingScsi) + { + fGetASPI32SupportInfo = 0; + fSendASPI32Command = 0; + winAspiLib = LoadLibrary (_T("WNASPI32.DLL")); + + if (winAspiLib != 0) + { + fGetASPI32SupportInfo = (DWORD(*)(void)) GetProcAddress (winAspiLib, "GetASPI32SupportInfo"); + fSendASPI32Command = (DWORD(*)(LPSRB)) GetProcAddress (winAspiLib, "SendASPI32Command"); + + if (fGetASPI32SupportInfo == 0 || fSendASPI32Command == 0) + return false; + } + else + { + usingScsi = true; + } + } + } + + return true; +} + +static void DeinitialiseCDRipper() +{ + if (winAspiLib != 0) + { + fGetASPI32SupportInfo = 0; + fSendASPI32Command = 0; + FreeLibrary (winAspiLib); + winAspiLib = 0; + } + + initialised = false; +} + +//============================================================================== +static HANDLE CreateSCSIDeviceHandle (char driveLetter) +{ + TCHAR devicePath[8]; + devicePath[0] = '\\'; + devicePath[1] = '\\'; + devicePath[2] = '.'; + devicePath[3] = '\\'; + devicePath[4] = driveLetter; + devicePath[5] = ':'; + devicePath[6] = 0; + + OSVERSIONINFO info; + info.dwOSVersionInfoSize = sizeof (info); + GetVersionEx (&info); + + DWORD flags = GENERIC_READ; + + if ((info.dwPlatformId == VER_PLATFORM_WIN32_NT) && (info.dwMajorVersion > 4)) + flags = GENERIC_READ | GENERIC_WRITE; + + HANDLE h = CreateFile (devicePath, flags, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + if (h == INVALID_HANDLE_VALUE) + { + flags ^= GENERIC_WRITE; + h = CreateFile (devicePath, flags, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + } + + return h; +} + +static DWORD performScsiPassThroughCommand (const LPSRB_ExecSCSICmd srb, + const char driveLetter, + HANDLE& deviceHandle, + const bool retryOnFailure = true) +{ + SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER s; + zerostruct (s); + + s.spt.Length = sizeof (SCSI_PASS_THROUGH); + s.spt.CdbLength = srb->SRB_CDBLen; + + s.spt.DataIn = (BYTE) ((srb->SRB_Flags & SRB_DIR_IN) + ? SCSI_IOCTL_DATA_IN + : ((srb->SRB_Flags & SRB_DIR_OUT) + ? SCSI_IOCTL_DATA_OUT + : SCSI_IOCTL_DATA_UNSPECIFIED)); + + s.spt.DataTransferLength = srb->SRB_BufLen; + s.spt.TimeOutValue = 5; + s.spt.DataBuffer = srb->SRB_BufPointer; + s.spt.SenseInfoOffset = offsetof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); + + memcpy (s.spt.Cdb, srb->CDBByte, srb->SRB_CDBLen); + + srb->SRB_Status = SS_ERR; + srb->SRB_TargStat = 0x0004; + + DWORD bytesReturned = 0; + + if (DeviceIoControl (deviceHandle, IOCTL_SCSI_PASS_THROUGH_DIRECT, + &s, sizeof (s), + &s, sizeof (s), + &bytesReturned, 0) != 0) + { + srb->SRB_Status = SS_COMP; + } + else if (retryOnFailure) + { + const DWORD error = GetLastError(); + + if ((error == ERROR_MEDIA_CHANGED) || (error == ERROR_INVALID_HANDLE)) + { + if (error != ERROR_INVALID_HANDLE) + CloseHandle (deviceHandle); + + deviceHandle = CreateSCSIDeviceHandle (driveLetter); + + return performScsiPassThroughCommand (srb, driveLetter, deviceHandle, false); + } + } + + return srb->SRB_Status; +} + + +//============================================================================== +// Controller types.. + +class ControllerType1 : public CDController +{ +public: + ControllerType1() {} + ~ControllerType1() {} + + bool read (CDReadBuffer* rb) + { + if (rb->numFrames * 2352 > rb->bufferSize) + return false; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb->bufferSize; + s.SRB_BufPointer = rb->buffer; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0xBE; + s.CDBByte[3] = (BYTE)((rb->startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE)((rb->startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE)(rb->startFrame & 0xFF); + s.CDBByte[8] = (BYTE)(rb->numFrames & 0xFF); + s.CDBByte[9] = (BYTE)((deviceInfo->readType == READTYPE_ATAPI1) ? 0x10 : 0xF0); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb->dataLength = rb->numFrames * 2352; + rb->dataStartOffset = 0; + return true; + } +}; + + +//============================================================================== +class ControllerType2 : public CDController +{ +public: + ControllerType2() {} + ~ControllerType2() {} + + void shutDown() + { + if (initialised) + { + BYTE bufPointer[] = { 0, 0, 0, 8, 83, 0, 0, 0, 0, 0, 8, 0 }; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT; + s.SRB_BufLen = 0x0C; + s.SRB_BufPointer = bufPointer; + s.SRB_CDBLen = 6; + s.CDBByte[0] = 0x15; + s.CDBByte[4] = 0x0C; + perform (s); + } + } + + bool init() + { + SRB_ExecSCSICmd s; + s.SRB_Status = SS_ERR; + + if (deviceInfo->readType == READTYPE_READ10_2) + { + BYTE bufPointer1[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 35, 6, 0, 0, 0, 0, 0, 128 }; + BYTE bufPointer2[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 1, 6, 32, 7, 0, 0, 0, 0 }; + + for (int i = 0; i < 2; ++i) + { + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0x14; + s.SRB_BufPointer = (i == 0) ? bufPointer1 : bufPointer2; + s.SRB_CDBLen = 6; + s.CDBByte[0] = 0x15; + s.CDBByte[1] = 0x10; + s.CDBByte[4] = 0x14; + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + } + } + else + { + BYTE bufPointer[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48 }; + + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0x0C; + s.SRB_BufPointer = bufPointer; + s.SRB_CDBLen = 6; + s.CDBByte[0] = 0x15; + s.CDBByte[4] = 0x0C; + perform (s); + } + + return s.SRB_Status == SS_COMP; + } + + bool read (CDReadBuffer* rb) + { + if (rb->numFrames * 2352 > rb->bufferSize) + return false; + + if (!initialised) + { + initialised = init(); + + if (!initialised) + return false; + } + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb->bufferSize; + s.SRB_BufPointer = rb->buffer; + s.SRB_CDBLen = 10; + s.CDBByte[0] = 0x28; + s.CDBByte[1] = (BYTE)(deviceInfo->info.lun << 5); + s.CDBByte[3] = (BYTE)((rb->startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE)((rb->startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE)(rb->startFrame & 0xFF); + s.CDBByte[8] = (BYTE)(rb->numFrames & 0xFF); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb->dataLength = rb->numFrames * 2352; + rb->dataStartOffset = 0; + + return true; + } +}; + + +//============================================================================== +class ControllerType3 : public CDController +{ +public: + ControllerType3() {} + ~ControllerType3() {} + + bool read (CDReadBuffer* rb) + { + if (rb->numFrames * 2352 > rb->bufferSize) + return false; + + if (!initialised) + { + setPaused (false); + initialised = true; + } + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb->numFrames * 2352; + s.SRB_BufPointer = rb->buffer; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0xD8; + s.CDBByte[3] = (BYTE)((rb->startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE)((rb->startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE)(rb->startFrame & 0xFF); + s.CDBByte[9] = (BYTE)(rb->numFrames & 0xFF); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb->dataLength = rb->numFrames * 2352; + rb->dataStartOffset = 0; + + return true; + } +}; + + +//============================================================================== +class ControllerType4 : public CDController +{ +public: + ControllerType4() {} + ~ControllerType4() {} + + bool selectD4Mode() + { + BYTE bufPointer[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 48 }; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_CDBLen = 6; + s.SRB_BufLen = 12; + s.SRB_BufPointer = bufPointer; + s.CDBByte[0] = 0x15; + s.CDBByte[1] = 0x10; + s.CDBByte[4] = 0x08; + perform (s); + + return s.SRB_Status == SS_COMP; + } + + bool read (CDReadBuffer* rb) + { + if (rb->numFrames * 2352 > rb->bufferSize) + return false; + + if (!initialised) + { + setPaused (true); + + if (deviceInfo->readType == READTYPE_READ_D4_1) + selectD4Mode(); + + initialised = true; + } + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = rb->bufferSize; + s.SRB_BufPointer = rb->buffer; + s.SRB_CDBLen = 10; + s.CDBByte[0] = 0xD4; + s.CDBByte[3] = (BYTE)((rb->startFrame >> 16) & 0xFF); + s.CDBByte[4] = (BYTE)((rb->startFrame >> 8) & 0xFF); + s.CDBByte[5] = (BYTE)(rb->startFrame & 0xFF); + s.CDBByte[8] = (BYTE)(rb->numFrames & 0xFF); + perform (s); + + if (s.SRB_Status != SS_COMP) + return false; + + rb->dataLength = rb->numFrames * 2352; + rb->dataStartOffset = 0; + + return true; + } +}; + + +//============================================================================== +CDController::CDController() : initialised (false) +{ +} + +CDController::~CDController() +{ +} + +void CDController::prepare (SRB_ExecSCSICmd& s) +{ + zerostruct (s); + + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = deviceInfo->info.ha; + s.SRB_Target = deviceInfo->info.tgt; + s.SRB_Lun = deviceInfo->info.lun; + s.SRB_SenseLen = SENSE_LEN; +} + +void CDController::perform (SRB_ExecSCSICmd& s) +{ + HANDLE event = CreateEvent (0, TRUE, FALSE, 0); + s.SRB_PostProc = (void*)event; + + ResetEvent (event); + + DWORD status = (usingScsi) ? performScsiPassThroughCommand ((LPSRB_ExecSCSICmd)&s, + deviceInfo->info.scsiDriveLetter, + deviceInfo->scsiHandle) + : fSendASPI32Command ((LPSRB)&s); + + if (status == SS_PENDING) + WaitForSingleObject (event, 4000); + + CloseHandle (event); +} + +void CDController::setPaused (bool paused) +{ + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_EVENT_NOTIFY; + s.SRB_CDBLen = 10; + s.CDBByte[0] = 0x4B; + s.CDBByte[8] = (BYTE) (paused ? 0 : 1); + perform (s); +} + +void CDController::shutDown() +{ +} + +bool CDController::readAudio (CDReadBuffer* rb, CDReadBuffer* overlapBuffer) +{ + if (overlapBuffer != 0) + { + const bool canDoJitter = (overlapBuffer->bufferSize >= 2352 * framesToCheck); + const bool doJitter = canDoJitter && ! overlapBuffer->isZero(); + + if (doJitter + && overlapBuffer->startFrame > 0 + && overlapBuffer->numFrames > 0 + && overlapBuffer->dataLength > 0) + { + const int numFrames = rb->numFrames; + + if (overlapBuffer->startFrame == (rb->startFrame - framesToCheck)) + { + rb->startFrame -= framesOverlap; + + if (framesToCheck < framesOverlap + && numFrames + framesOverlap <= rb->bufferSize / 2352) + rb->numFrames += framesOverlap; + } + else + { + overlapBuffer->dataLength = 0; + overlapBuffer->startFrame = 0; + overlapBuffer->numFrames = 0; + } + } + + if (! read (rb)) + return false; + + if (doJitter) + { + const int checkLen = framesToCheck * 2352; + const int maxToCheck = rb->dataLength - checkLen; + + if (overlapBuffer->dataLength == 0 || overlapBuffer->isZero()) + return true; + + BYTE* const p = overlapBuffer->buffer + overlapBuffer->dataStartOffset; + bool found = false; + + for (int i = 0; i < maxToCheck; ++i) + { + if (!memcmp (p, rb->buffer + i, checkLen)) + { + i += checkLen; + rb->dataStartOffset = i; + rb->dataLength -= i; + rb->startFrame = overlapBuffer->startFrame + framesToCheck; + found = true; + break; + } + } + + rb->numFrames = rb->dataLength / 2352; + rb->dataLength = 2352 * rb->numFrames; + + if (!found) + return false; + } + + if (canDoJitter) + { + memcpy (overlapBuffer->buffer, + rb->buffer + rb->dataStartOffset + 2352 * (rb->numFrames - framesToCheck), + 2352 * framesToCheck); + + overlapBuffer->startFrame = rb->startFrame + rb->numFrames - framesToCheck; + overlapBuffer->numFrames = framesToCheck; + overlapBuffer->dataLength = 2352 * framesToCheck; + overlapBuffer->dataStartOffset = 0; + } + else + { + overlapBuffer->startFrame = 0; + overlapBuffer->numFrames = 0; + overlapBuffer->dataLength = 0; + } + + return true; + } + else + { + return read (rb); + } +} + +int CDController::getLastIndex() +{ + char qdata[100]; + + SRB_ExecSCSICmd s; + prepare (s); + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = sizeof (qdata); + s.SRB_BufPointer = (BYTE*)qdata; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0x42; + s.CDBByte[1] = (BYTE)(deviceInfo->info.lun << 5); + s.CDBByte[2] = 64; + s.CDBByte[3] = 1; // get current position + s.CDBByte[7] = 0; + s.CDBByte[8] = (BYTE)sizeof (qdata); + perform (s); + + if (s.SRB_Status == SS_COMP) + return qdata[7]; + + return 0; +} + +//============================================================================== +bool CDDeviceHandle::readTOC (TOC* lpToc, bool useMSF) +{ + HANDLE event = CreateEvent (0, TRUE, FALSE, 0); + + SRB_ExecSCSICmd s; + zerostruct (s); + + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = info.ha; + s.SRB_Target = info.tgt; + s.SRB_Lun = info.lun; + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0x324; + s.SRB_BufPointer = (BYTE*)lpToc; + s.SRB_SenseLen = 0x0E; + s.SRB_CDBLen = 0x0A; + s.SRB_PostProc = (void*)event; + s.CDBByte[0] = 0x43; + s.CDBByte[1] = (BYTE)(useMSF ? 0x02 : 0x00); + s.CDBByte[7] = 0x03; + s.CDBByte[8] = 0x24; + + ResetEvent (event); + DWORD status = (usingScsi) ? performScsiPassThroughCommand ((LPSRB_ExecSCSICmd)&s, info.scsiDriveLetter, scsiHandle) + : fSendASPI32Command ((LPSRB)&s); + + if (status == SS_PENDING) + WaitForSingleObject (event, 4000); + + CloseHandle (event); + return (s.SRB_Status == SS_COMP); +} + +bool CDDeviceHandle::readAudio (CDReadBuffer* const buffer, + CDReadBuffer* const overlapBuffer) +{ + if (controller == 0) + { + testController (READTYPE_ATAPI2, new ControllerType1(), buffer) + || testController (READTYPE_ATAPI1, new ControllerType1(), buffer) + || testController (READTYPE_READ10_2, new ControllerType2(), buffer) + || testController (READTYPE_READ10, new ControllerType2(), buffer) + || testController (READTYPE_READ_D8, new ControllerType3(), buffer) + || testController (READTYPE_READ_D4, new ControllerType4(), buffer) + || testController (READTYPE_READ_D4_1, new ControllerType4(), buffer); + } + + buffer->index = 0; + + if ((controller != 0) + && controller->readAudio (buffer, overlapBuffer)) + { + if (buffer->wantsIndex) + buffer->index = controller->getLastIndex(); + + return true; + } + + return false; +} + +void CDDeviceHandle::openDrawer (bool shouldBeOpen) +{ + if (shouldBeOpen) + { + if (controller != 0) + { + controller->shutDown(); + delete controller; + controller = 0; + } + + if (scsiHandle != 0) + { + CloseHandle (scsiHandle); + scsiHandle = 0; + } + } + + SRB_ExecSCSICmd s; + zerostruct (s); + + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = info.ha; + s.SRB_Target = info.tgt; + s.SRB_Lun = info.lun; + s.SRB_SenseLen = SENSE_LEN; + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = 0; + s.SRB_BufPointer = 0; + s.SRB_CDBLen = 12; + s.CDBByte[0] = 0x1b; + s.CDBByte[1] = (BYTE)(info.lun << 5); + s.CDBByte[4] = (BYTE)((shouldBeOpen) ? 2 : 3); + + HANDLE event = CreateEvent (0, TRUE, FALSE, 0); + s.SRB_PostProc = (void*)event; + + ResetEvent (event); + + DWORD status = (usingScsi) ? performScsiPassThroughCommand ((LPSRB_ExecSCSICmd)&s, info.scsiDriveLetter, scsiHandle) + : fSendASPI32Command ((LPSRB)&s); + + if (status == SS_PENDING) + WaitForSingleObject (event, 4000); + + CloseHandle (event); +} + +bool CDDeviceHandle::testController (const int type, + CDController* const newController, + CDReadBuffer* const rb) +{ + controller = newController; + readType = (BYTE)type; + + controller->deviceInfo = this; + controller->framesToCheck = 1; + controller->framesOverlap = 3; + + bool passed = false; + + memset (rb->buffer, 0xcd, rb->bufferSize); + + if (controller->read (rb)) + { + passed = true; + int* p = (int*) (rb->buffer + rb->dataStartOffset); + int wrong = 0; + + for (int i = rb->dataLength / 4; --i >= 0;) + { + if (*p++ == (int) 0xcdcdcdcd) + { + if (++wrong == 4) + { + passed = false; + break; + } + } + else + { + wrong = 0; + } + } + } + + if (! passed) + { + controller->shutDown(); + delete controller; + controller = 0; + } + + return passed; +} + + +//============================================================================== +static void GetAspiDeviceInfo (CDDeviceInfo* dev, BYTE ha, BYTE tgt, BYTE lun) +{ + HANDLE event = CreateEvent (0, TRUE, FALSE, 0); + + const int bufSize = 128; + BYTE buffer[bufSize]; + zeromem (buffer, bufSize); + + SRB_ExecSCSICmd s; + zerostruct (s); + + s.SRB_Cmd = SC_EXEC_SCSI_CMD; + s.SRB_HaID = ha; + s.SRB_Target = tgt; + s.SRB_Lun = lun; + s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + s.SRB_BufLen = bufSize; + s.SRB_BufPointer = buffer; + s.SRB_SenseLen = SENSE_LEN; + s.SRB_CDBLen = 6; + s.SRB_PostProc = (void*)event; + s.CDBByte[0] = SCSI_INQUIRY; + s.CDBByte[4] = 100; + + ResetEvent (event); + + if (fSendASPI32Command ((LPSRB)&s) == SS_PENDING) + WaitForSingleObject (event, 4000); + + CloseHandle (event); + + if (s.SRB_Status == SS_COMP) + { + memcpy (dev->vendor, &buffer[8], 8); + memcpy (dev->productId, &buffer[16], 16); + memcpy (dev->rev, &buffer[32], 4); + memcpy (dev->vendorSpec, &buffer[36], 20); + } +} + +static int FindCDDevices (CDDeviceInfo* const list, + int maxItems) +{ + int count = 0; + + if (usingScsi) + { + for (char driveLetter = 'b'; driveLetter <= 'z'; ++driveLetter) + { + TCHAR drivePath[8]; + drivePath[0] = driveLetter; + drivePath[1] = ':'; + drivePath[2] = '\\'; + drivePath[3] = 0; + + if (GetDriveType (drivePath) == DRIVE_CDROM) + { + HANDLE h = CreateSCSIDeviceHandle (driveLetter); + + if (h != INVALID_HANDLE_VALUE) + { + BYTE buffer[100], passThroughStruct[1024]; + zeromem (buffer, sizeof (buffer)); + zeromem (passThroughStruct, sizeof (passThroughStruct)); + + PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER p = (PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER)passThroughStruct; + + p->spt.Length = sizeof (SCSI_PASS_THROUGH); + p->spt.CdbLength = 6; + p->spt.SenseInfoLength = 24; + p->spt.DataIn = SCSI_IOCTL_DATA_IN; + p->spt.DataTransferLength = 100; + p->spt.TimeOutValue = 2; + p->spt.DataBuffer = buffer; + p->spt.SenseInfoOffset = offsetof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); + p->spt.Cdb[0] = 0x12; + p->spt.Cdb[4] = 100; + + DWORD bytesReturned = 0; + + if (DeviceIoControl (h, IOCTL_SCSI_PASS_THROUGH_DIRECT, + p, sizeof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER), + p, sizeof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER), + &bytesReturned, 0) != 0) + { + zeromem (&list[count], sizeof (CDDeviceInfo)); + + list[count].scsiDriveLetter = driveLetter; + + memcpy (list[count].vendor, &buffer[8], 8); + memcpy (list[count].productId, &buffer[16], 16); + memcpy (list[count].rev, &buffer[32], 4); + memcpy (list[count].vendorSpec, &buffer[36], 20); + + zeromem (passThroughStruct, sizeof (passThroughStruct)); + PSCSI_ADDRESS scsiAddr = (PSCSI_ADDRESS)passThroughStruct; + + scsiAddr->Length = sizeof (SCSI_ADDRESS); + + if (DeviceIoControl (h, IOCTL_SCSI_GET_ADDRESS, + 0, 0, scsiAddr, sizeof (SCSI_ADDRESS), + &bytesReturned, 0) != 0) + { + list[count].ha = scsiAddr->PortNumber; + list[count].tgt = scsiAddr->TargetId; + list[count].lun = scsiAddr->Lun; + ++count; + } + } + + CloseHandle (h); + } + } + } + } + else + { + const DWORD d = fGetASPI32SupportInfo(); + BYTE status = HIBYTE (LOWORD (d)); + + if (status != SS_COMP || status == SS_NO_ADAPTERS) + return 0; + + const int numAdapters = LOBYTE (LOWORD (d)); + + for (BYTE ha = 0; ha < numAdapters; ++ha) + { + SRB_HAInquiry s; + zerostruct (s); + + s.SRB_Cmd = SC_HA_INQUIRY; + s.SRB_HaID = ha; + fSendASPI32Command ((LPSRB)&s); + + if (s.SRB_Status == SS_COMP) + { + maxItems = (int)s.HA_Unique[3]; + + if (maxItems == 0) + maxItems = 8; + + for (BYTE tgt = 0; tgt < maxItems; ++tgt) + { + for (BYTE lun = 0; lun < 8; ++lun) + { + SRB_GDEVBlock s; + zerostruct (s); + + s.SRB_Cmd = SC_GET_DEV_TYPE; + s.SRB_HaID = ha; + s.SRB_Target = tgt; + s.SRB_Lun = lun; + fSendASPI32Command ((LPSRB)&s); + + if (s.SRB_Status == SS_COMP + && s.SRB_DeviceType == DTYPE_CROM) + { + zeromem (&list[count], sizeof (CDDeviceInfo)); + + list[count].ha = ha; + list[count].tgt = tgt; + list[count].lun = lun; + + GetAspiDeviceInfo (&(list[count]), ha, tgt, lun); + + ++count; + } + } + } + } + } + } + + return count; +} + + +//============================================================================== +static int ripperUsers = 0; +static bool initialisedOk = false; + +class DeinitialiseTimer : private Timer, + private DeletedAtShutdown +{ + DeinitialiseTimer (const DeinitialiseTimer&); + const DeinitialiseTimer& operator= (const DeinitialiseTimer&); + +public: + DeinitialiseTimer() + { + startTimer (4000); + } + + ~DeinitialiseTimer() + { + if (--ripperUsers == 0) + DeinitialiseCDRipper(); + } + + void timerCallback() + { + delete this; + } + + juce_UseDebuggingNewOperator +}; + +static void incUserCount() +{ + if (ripperUsers++ == 0) + initialisedOk = InitialiseCDRipper(); +} + +static void decUserCount() +{ + new DeinitialiseTimer(); +} + +//============================================================================== +struct CDDeviceWrapper +{ + CDDeviceHandle* cdH; + CDReadBuffer* overlapBuffer; + bool jitter; +}; + +//============================================================================== +static int getAddressOf (const TOCTRACK* const t) +{ + return (((DWORD)t->addr[0]) << 24) + (((DWORD)t->addr[1]) << 16) + + (((DWORD)t->addr[2]) << 8) + ((DWORD)t->addr[3]); +} + +static int getMSFAddressOf (const TOCTRACK* const t) +{ + return 60 * t->addr[1] + t->addr[2]; +} + +static const int samplesPerFrame = 44100 / 75; +static const int bytesPerFrame = samplesPerFrame * 4; + + +//============================================================================== +const StringArray AudioCDReader::getAvailableCDNames() +{ + StringArray results; + incUserCount(); + + if (initialisedOk) + { + CDDeviceInfo list[8]; + const int num = FindCDDevices (list, 8); + + decUserCount(); + + for (int i = 0; i < num; ++i) + { + String s; + + if (list[i].scsiDriveLetter > 0) + s << String::charToString (list[i].scsiDriveLetter).toUpperCase() << T(": "); + + s << String (list[i].vendor).trim() + << T(" ") << String (list[i].productId).trim() + << T(" ") << String (list[i].rev).trim(); + + results.add (s); + } + } + + return results; +} + +static CDDeviceHandle* openHandle (const CDDeviceInfo* const device) +{ + SRB_GDEVBlock s; + zerostruct (s); + + s.SRB_Cmd = SC_GET_DEV_TYPE; + s.SRB_HaID = device->ha; + s.SRB_Target = device->tgt; + s.SRB_Lun = device->lun; + + if (usingScsi) + { + HANDLE h = CreateSCSIDeviceHandle (device->scsiDriveLetter); + + if (h != INVALID_HANDLE_VALUE) + { + CDDeviceHandle* cdh = new CDDeviceHandle (device); + cdh->scsiHandle = h; + return cdh; + } + } + else + { + if (fSendASPI32Command ((LPSRB)&s) == SS_COMP + && s.SRB_DeviceType == DTYPE_CROM) + { + return new CDDeviceHandle (device); + } + } + + return 0; +} + +AudioCDReader* AudioCDReader::createReaderForCD (const int deviceIndex) +{ + incUserCount(); + + if (initialisedOk) + { + CDDeviceInfo list[8]; + const int num = FindCDDevices (list, 8); + + if (deviceIndex >= 0 && deviceIndex < num) + { + CDDeviceHandle* const handle = openHandle (&(list[deviceIndex])); + + if (handle != 0) + { + CDDeviceWrapper* const d = new CDDeviceWrapper(); + d->cdH = handle; + d->overlapBuffer = new CDReadBuffer(3); + + return new AudioCDReader (d); + } + } + } + + decUserCount(); + return 0; +} + +AudioCDReader::AudioCDReader (void* handle_) + : AudioFormatReader (0, T("CD Audio")), + handle (handle_), + indexingEnabled (false), + lastIndex (0), + firstFrameInBuffer (0), + samplesInBuffer (0) +{ + jassert (handle_ != 0); + + refreshTrackLengths(); + + sampleRate = 44100.0; + bitsPerSample = 16; + lengthInSamples = getPositionOfTrackStart (numTracks); + numChannels = 2; + usesFloatingPointData = false; + + buffer.setSize (4 * bytesPerFrame, true); +} + +AudioCDReader::~AudioCDReader() +{ + CDDeviceWrapper* const device = (CDDeviceWrapper*)handle; + + delete device->cdH; + delete device->overlapBuffer; + delete device; + + decUserCount(); +} + +bool AudioCDReader::read (int** destSamples, + int64 startSampleInFile, + int numSamples) +{ + CDDeviceWrapper* const device = (CDDeviceWrapper*)handle; + + bool ok = true; + int offset = 0; + + if (startSampleInFile < 0) + { + int* l = destSamples[0]; + int* r = destSamples[1]; + + numSamples += (int) startSampleInFile; + offset -= (int) startSampleInFile; + + while (++startSampleInFile <= 0) + { + *l++ = 0; + + if (r != 0) + *r++ = 0; + } + } + + while (numSamples > 0) + { + const int bufferStartSample = firstFrameInBuffer * samplesPerFrame; + const int bufferEndSample = bufferStartSample + samplesInBuffer; + + if (startSampleInFile >= bufferStartSample + && startSampleInFile < bufferEndSample) + { + const int toDo = (int) jmin ((int64) numSamples, bufferEndSample - startSampleInFile); + + int* const l = destSamples[0] + offset; + int* const r = destSamples[1] + offset; + const short* src = (const short*) buffer.getData(); + src += 2 * (startSampleInFile - bufferStartSample); + + for (int i = 0; i < toDo; ++i) + { + l[i] = src [i << 1] << 16; + + if (r != 0) + r[i] = src [(i << 1) + 1] << 16; + } + + offset += toDo; + startSampleInFile += toDo; + numSamples -= toDo; + } + else + { + const int framesInBuffer = buffer.getSize() / bytesPerFrame; + const int frameNeeded = (int) (startSampleInFile / samplesPerFrame); + + if (firstFrameInBuffer + framesInBuffer != frameNeeded) + { + device->overlapBuffer->dataLength = 0; + device->overlapBuffer->startFrame = 0; + device->overlapBuffer->numFrames = 0; + device->jitter = false; + } + + firstFrameInBuffer = frameNeeded; + lastIndex = 0; + + CDReadBuffer readBuffer (framesInBuffer + 4); + readBuffer.wantsIndex = indexingEnabled; + + int i; + for (i = 5; --i >= 0;) + { + readBuffer.startFrame = frameNeeded; + readBuffer.numFrames = framesInBuffer; + + if (device->cdH->readAudio (&readBuffer, (device->jitter) ? device->overlapBuffer : 0)) + break; + else + device->overlapBuffer->dataLength = 0; + } + + if (i >= 0) + { + memcpy ((char*) buffer.getData(), + readBuffer.buffer + readBuffer.dataStartOffset, + readBuffer.dataLength); + + samplesInBuffer = readBuffer.dataLength >> 2; + lastIndex = readBuffer.index; + } + else + { + int* l = destSamples[0] + offset; + int* r = destSamples[1] + offset; + + while (--numSamples >= 0) + { + *l++ = 0; + + if (r != 0) + *r++ = 0; + } + + // sometimes the read fails for just the very last couple of blocks, so + // we'll ignore and errors in the last half-second of the disk.. + ok = startSampleInFile > (trackStarts [numTracks] - 20000); + break; + } + } + } + + return ok; +} + +bool AudioCDReader::isCDStillPresent() const +{ + TOC toc; + zerostruct (toc); + + return ((CDDeviceWrapper*)handle)->cdH->readTOC (&toc, false); +} + +int AudioCDReader::getNumTracks() const +{ + return numTracks; +} + +int AudioCDReader::getPositionOfTrackStart (int trackNum) const +{ + return (trackNum >= 0 && trackNum <= numTracks) ? trackStarts [trackNum] * samplesPerFrame + : 0; +} + +void AudioCDReader::refreshTrackLengths() +{ + zeromem (trackStarts, sizeof (trackStarts)); + zeromem (audioTracks, sizeof (audioTracks)); + + TOC toc; + zerostruct (toc); + + if (((CDDeviceWrapper*)handle)->cdH->readTOC (&toc, false)) + { + numTracks = 1 + toc.lastTrack - toc.firstTrack; + + for (int i = 0; i <= numTracks; ++i) + { + trackStarts[i] = getAddressOf (&toc.tracks[i]); + audioTracks[i] = ((toc.tracks[i].ADR & 4) == 0); + } + } + else + { + numTracks = 0; + } +} + +bool AudioCDReader::isTrackAudio (int trackNum) const +{ + return (trackNum >= 0 && trackNum <= numTracks) ? audioTracks [trackNum] + : false; +} + +void AudioCDReader::enableIndexScanning (bool b) +{ + indexingEnabled = b; +} + +int AudioCDReader::getLastIndex() const +{ + return lastIndex; +} + +const int framesPerIndexRead = 4; + +int AudioCDReader::getIndexAt (int samplePos) +{ + CDDeviceWrapper* const device = (CDDeviceWrapper*) handle; + + const int frameNeeded = samplePos / samplesPerFrame; + + device->overlapBuffer->dataLength = 0; + device->overlapBuffer->startFrame = 0; + device->overlapBuffer->numFrames = 0; + device->jitter = false; + + firstFrameInBuffer = 0; + lastIndex = 0; + + CDReadBuffer readBuffer (4 + framesPerIndexRead); + readBuffer.wantsIndex = true; + + int i; + for (i = 5; --i >= 0;) + { + readBuffer.startFrame = frameNeeded; + readBuffer.numFrames = framesPerIndexRead; + + if (device->cdH->readAudio (&readBuffer, (false) ? device->overlapBuffer : 0)) + break; + } + + if (i >= 0) + return readBuffer.index; + + return -1; +} + +const Array AudioCDReader::findIndexesInTrack (const int trackNumber) +{ + Array indexes; + + const int trackStart = getPositionOfTrackStart (trackNumber); + const int trackEnd = getPositionOfTrackStart (trackNumber + 1); + + bool needToScan = true; + + if (trackEnd - trackStart > 20 * 44100) + { + // check the end of the track for indexes before scanning the whole thing + needToScan = false; + int pos = jmax (trackStart, trackEnd - 44100 * 5); + bool seenAnIndex = false; + + while (pos <= trackEnd - samplesPerFrame) + { + const int index = getIndexAt (pos); + + if (index == 0) + { + // lead-out, so skip back a bit if we've not found any indexes yet.. + if (seenAnIndex) + break; + + pos -= 44100 * 5; + + if (pos < trackStart) + break; + } + else + { + if (index > 0) + seenAnIndex = true; + + if (index > 1) + { + needToScan = true; + break; + } + + pos += samplesPerFrame * framesPerIndexRead; + } + } + } + + if (needToScan) + { + CDDeviceWrapper* const device = (CDDeviceWrapper*) handle; + + int pos = trackStart; + int last = -1; + + while (pos < trackEnd - samplesPerFrame * 10) + { + const int frameNeeded = pos / samplesPerFrame; + + device->overlapBuffer->dataLength = 0; + device->overlapBuffer->startFrame = 0; + device->overlapBuffer->numFrames = 0; + device->jitter = false; + + firstFrameInBuffer = 0; + + CDReadBuffer readBuffer (4); + readBuffer.wantsIndex = true; + + int i; + for (i = 5; --i >= 0;) + { + readBuffer.startFrame = frameNeeded; + readBuffer.numFrames = framesPerIndexRead; + + if (device->cdH->readAudio (&readBuffer, (false) ? device->overlapBuffer : 0)) + break; + } + + if (i < 0) + break; + + if (readBuffer.index > last && readBuffer.index > 1) + { + last = readBuffer.index; + indexes.add (pos); + } + + pos += samplesPerFrame * framesPerIndexRead; + } + + indexes.removeValue (trackStart); + } + + return indexes; +} + +int AudioCDReader::getCDDBId() +{ + refreshTrackLengths(); + + if (numTracks > 0) + { + TOC toc; + zerostruct (toc); + + if (((CDDeviceWrapper*) handle)->cdH->readTOC (&toc, true)) + { + int n = 0; + + for (int i = numTracks; --i >= 0;) + { + int j = getMSFAddressOf (&toc.tracks[i]); + + while (j > 0) + { + n += (j % 10); + j /= 10; + } + } + + if (n != 0) + { + const int t = getMSFAddressOf (&toc.tracks[numTracks]) + - getMSFAddressOf (&toc.tracks[0]); + + return ((n % 0xff) << 24) | (t << 8) | numTracks; + } + } + } + + return 0; +} + +void AudioCDReader::ejectDisk() +{ + ((CDDeviceWrapper*) handle)->cdH->openDrawer (true); +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_DirectSound.cpp b/build/win32/platform_specific_code/juce_win32_DirectSound.cpp new file mode 100644 index 0000000000..43cb9d82ae --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_DirectSound.cpp @@ -0,0 +1,1754 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +//============================================================================== +extern "C" +{ + +// Declare just the minimum number of interfaces for the DSound objects that we need.. +typedef struct typeDSBUFFERDESC +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; + GUID guid3DAlgorithm; +} DSBUFFERDESC; + +struct IDirectSoundBuffer; + +#undef INTERFACE +#define INTERFACE IDirectSound +DECLARE_INTERFACE_(IDirectSound, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(CreateSoundBuffer) (THIS_ DSBUFFERDESC*, IDirectSoundBuffer**, LPUNKNOWN) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(DuplicateSoundBuffer) (THIS_ IDirectSoundBuffer*, IDirectSoundBuffer**) PURE; + STDMETHOD(SetCooperativeLevel) (THIS_ HWND, DWORD) PURE; + STDMETHOD(Compact) (THIS) PURE; + STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD) PURE; + STDMETHOD(SetSpeakerConfig) (THIS_ DWORD) PURE; + STDMETHOD(Initialize) (THIS_ const GUID*) PURE; +}; + +#undef INTERFACE +#define INTERFACE IDirectSoundBuffer +DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE; + STDMETHOD(GetVolume) (THIS_ LPLONG) PURE; + STDMETHOD(GetPan) (THIS_ LPLONG) PURE; + STDMETHOD(GetFrequency) (THIS_ LPDWORD) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE; + STDMETHOD(Initialize) (THIS_ IDirectSound*, DSBUFFERDESC*) PURE; + STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID*, LPDWORD, LPVOID*, LPDWORD, DWORD) PURE; + STDMETHOD(Play) (THIS_ DWORD, DWORD, DWORD) PURE; + STDMETHOD(SetCurrentPosition) (THIS_ DWORD) PURE; + STDMETHOD(SetFormat) (THIS_ const WAVEFORMATEX*) PURE; + STDMETHOD(SetVolume) (THIS_ LONG) PURE; + STDMETHOD(SetPan) (THIS_ LONG) PURE; + STDMETHOD(SetFrequency) (THIS_ DWORD) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; + STDMETHOD(Restore) (THIS) PURE; +}; + +//============================================================================== +typedef struct typeDSCBUFFERDESC +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +} DSCBUFFERDESC; + +struct IDirectSoundCaptureBuffer; + +#undef INTERFACE +#define INTERFACE IDirectSoundCapture +DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(CreateCaptureBuffer) (THIS_ DSCBUFFERDESC*, IDirectSoundCaptureBuffer**, LPUNKNOWN) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(Initialize) (THIS_ const GUID*) PURE; +}; + +#undef INTERFACE +#define INTERFACE IDirectSoundCaptureBuffer +DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD(GetCaps) (THIS_ void*) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE; + STDMETHOD(Initialize) (THIS_ IDirectSoundCapture*, DSCBUFFERDESC*) PURE; + STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID*, LPDWORD, LPVOID*, LPDWORD, DWORD) PURE; + STDMETHOD(Start) (THIS_ DWORD) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; +}; + +}; + +#define USE_UNICODE_FUNCTIONS 1 + +//============================================================================== +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_AudioIODeviceType.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/basics/juce_Singleton.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/containers/juce_OwnedArray.h" +#include "../../../src/juce_core/text/juce_LocalisedStrings.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" + +static const String getDSErrorMessage (HRESULT hr) +{ + const tchar* result = 0; + + switch (hr) + { + case MAKE_HRESULT(1, 0x878, 10): + result = T("Device already allocated"); + break; + case MAKE_HRESULT(1, 0x878, 30): + result = T("Control unavailable"); + break; + case E_INVALIDARG: + result = T("Invalid parameter"); + break; + case MAKE_HRESULT(1, 0x878, 50): + result = T("Invalid call"); + break; + case E_FAIL: + result = T("Generic error"); + break; + case MAKE_HRESULT(1, 0x878, 70): + result = T("Priority level error"); + break; + case E_OUTOFMEMORY: + result = T("Out of memory"); + break; + case MAKE_HRESULT(1, 0x878, 100): + result = T("Bad format"); + break; + case E_NOTIMPL: + result = T("Unsupported function"); + break; + case MAKE_HRESULT(1, 0x878, 120): + result = T("No driver"); + break; + case MAKE_HRESULT(1, 0x878, 130): + result = T("Already initialised"); + break; + case CLASS_E_NOAGGREGATION: + result = T("No aggregation"); + break; + case MAKE_HRESULT(1, 0x878, 150): + result = T("Buffer lost"); + break; + case MAKE_HRESULT(1, 0x878, 160): + result = T("Another app has priority"); + break; + case MAKE_HRESULT(1, 0x878, 170): + result = T("Uninitialised"); + break; + case E_NOINTERFACE: + result = T("No interface"); + break; + case S_OK: + result = T("No error"); + break; + + default: + return T("Unknown error: ") + String ((int) hr); + } + + return result; +} + +//============================================================================== +#define DS_DEBUGGING 1 + +#ifdef DS_DEBUGGING + #define CATCH JUCE_CATCH_EXCEPTION + #define log(a) Logger::writeToLog(a); + #define logError(a) logDSError(a, __LINE__); + + static void logDSError (HRESULT hr, int lineNum) + { + if (hr != S_OK) + { + String error (T("DS error at line ")); + error << lineNum << T(" - ") << getDSErrorMessage (hr); + log (error); + } + } +#else + #define CATCH JUCE_CATCH_ALL + #define log(a) + #define logError(a) +#endif + + +//============================================================================== +#define DSOUND_FUNCTION(functionName, params) \ + typedef HRESULT (WINAPI *type##functionName) params; \ + static type##functionName ds##functionName = 0; + +#define DSOUND_FUNCTION_LOAD(functionName) \ + ds##functionName = (type##functionName) GetProcAddress (h, #functionName); \ + jassert (ds##functionName != 0); + +typedef BOOL (CALLBACK *LPDSENUMCALLBACKW) (LPGUID, LPCWSTR, LPCWSTR, LPVOID); +typedef BOOL (CALLBACK *LPDSENUMCALLBACKA) (LPGUID, LPCSTR, LPCSTR, LPVOID); + +DSOUND_FUNCTION (DirectSoundCreate, (const GUID*, IDirectSound**, LPUNKNOWN)) +DSOUND_FUNCTION (DirectSoundCaptureCreate, (const GUID*, IDirectSoundCapture**, LPUNKNOWN)) +DSOUND_FUNCTION (DirectSoundEnumerateW, (LPDSENUMCALLBACKW, LPVOID)) +DSOUND_FUNCTION (DirectSoundEnumerateA, (LPDSENUMCALLBACKA, LPVOID)) +DSOUND_FUNCTION (DirectSoundCaptureEnumerateW, (LPDSENUMCALLBACKW, LPVOID)) +DSOUND_FUNCTION (DirectSoundCaptureEnumerateA, (LPDSENUMCALLBACKA, LPVOID)) + +static void initialiseDSoundFunctions() +{ + if (dsDirectSoundCreate == 0) + { + HMODULE h = LoadLibraryA ("dsound.dll"); + + DSOUND_FUNCTION_LOAD (DirectSoundCreate) + DSOUND_FUNCTION_LOAD (DirectSoundCaptureCreate) + DSOUND_FUNCTION_LOAD (DirectSoundEnumerateW) + DSOUND_FUNCTION_LOAD (DirectSoundCaptureEnumerateW) + DSOUND_FUNCTION_LOAD (DirectSoundEnumerateA) + DSOUND_FUNCTION_LOAD (DirectSoundCaptureEnumerateA) + } +} + +//============================================================================== +class DSoundInternalOutChannel +{ + String name; + LPGUID guid; + int sampleRate, bufferSizeSamples; + float* leftBuffer; + float* rightBuffer; + + IDirectSound* pDirectSound; + IDirectSoundBuffer* pOutputBuffer; + DWORD writeOffset; + int totalBytesPerBuffer; + int bytesPerBuffer; + unsigned int lastPlayCursor; + +public: + int bitDepth; + bool doneFlag; + + DSoundInternalOutChannel (const String& name_, + LPGUID guid_, + int rate, + int bufferSize, + float* left, + float* right) + : name (name_), + guid (guid_), + sampleRate (rate), + bufferSizeSamples (bufferSize), + leftBuffer (left), + rightBuffer (right), + pDirectSound (0), + pOutputBuffer (0), + bitDepth (16) + { + } + + ~DSoundInternalOutChannel() + { + close(); + } + + void close() + { + HRESULT hr; + + if (pOutputBuffer != 0) + { + JUCE_TRY + { + log (T("closing dsound out: ") + name); + hr = pOutputBuffer->Stop(); + logError (hr); + } + CATCH + + JUCE_TRY + { + hr = pOutputBuffer->Release(); + logError (hr); + } + CATCH + + pOutputBuffer = 0; + } + + if (pDirectSound != 0) + { + JUCE_TRY + { + hr = pDirectSound->Release(); + logError (hr); + } + CATCH + + pDirectSound = 0; + } + } + + const String open() + { + log (T("opening dsound out device: ") + name + + T(" rate=") + String (sampleRate) + + T(" bits=") + String (bitDepth) + + T(" buf=") + String (bufferSizeSamples)); + + pDirectSound = 0; + pOutputBuffer = 0; + writeOffset = 0; + + String error; + HRESULT hr = E_NOINTERFACE; + + if (dsDirectSoundCreate != 0) + hr = dsDirectSoundCreate (guid, &pDirectSound, 0); + + if (hr == S_OK) + { + bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; + totalBytesPerBuffer = (3 * bytesPerBuffer) & ~15; + const int numChannels = 2; + + hr = pDirectSound->SetCooperativeLevel (GetDesktopWindow(), 3 /* DSSCL_EXCLUSIVE */); + logError (hr); + + if (hr == S_OK) + { + IDirectSoundBuffer* pPrimaryBuffer; + + DSBUFFERDESC primaryDesc; + zerostruct (primaryDesc); + + primaryDesc.dwSize = sizeof (DSBUFFERDESC); + primaryDesc.dwFlags = 1 /* DSBCAPS_PRIMARYBUFFER */; + primaryDesc.dwBufferBytes = 0; + primaryDesc.lpwfxFormat = 0; + + log (T("opening dsound out step 2")); + hr = pDirectSound->CreateSoundBuffer (&primaryDesc, &pPrimaryBuffer, 0); + logError (hr); + + if (hr == S_OK) + { + WAVEFORMATEX wfFormat; + wfFormat.wFormatTag = WAVE_FORMAT_PCM; + wfFormat.nChannels = (unsigned short) numChannels; + wfFormat.nSamplesPerSec = sampleRate; + wfFormat.wBitsPerSample = (unsigned short) bitDepth; + wfFormat.nBlockAlign = (unsigned short) (wfFormat.nChannels * wfFormat.wBitsPerSample / 8); + wfFormat.nAvgBytesPerSec = wfFormat.nSamplesPerSec * wfFormat.nBlockAlign; + wfFormat.cbSize = 0; + + hr = pPrimaryBuffer->SetFormat (&wfFormat); + logError (hr); + + if (hr == S_OK) + { + DSBUFFERDESC secondaryDesc; + zerostruct (secondaryDesc); + + secondaryDesc.dwSize = sizeof (DSBUFFERDESC); + secondaryDesc.dwFlags = 0x8000 /* DSBCAPS_GLOBALFOCUS */ + | 0x10000 /* DSBCAPS_GETCURRENTPOSITION2 */; + secondaryDesc.dwBufferBytes = totalBytesPerBuffer; + secondaryDesc.lpwfxFormat = &wfFormat; + + hr = pDirectSound->CreateSoundBuffer (&secondaryDesc, &pOutputBuffer, 0); + logError (hr); + + if (hr == S_OK) + { + log (T("opening dsound out step 3")); + + DWORD dwDataLen; + unsigned char* pDSBuffData; + + hr = pOutputBuffer->Lock (0, totalBytesPerBuffer, + (LPVOID*) &pDSBuffData, &dwDataLen, 0, 0, 0); + logError (hr); + + if (hr == S_OK) + { + zeromem (pDSBuffData, dwDataLen); + + hr = pOutputBuffer->Unlock (pDSBuffData, dwDataLen, 0, 0); + + if (hr == S_OK) + { + hr = pOutputBuffer->SetCurrentPosition (0); + + if (hr == S_OK) + { + hr = pOutputBuffer->Play (0, 0, 1 /* DSBPLAY_LOOPING */); + + if (hr == S_OK) + return String::empty; + } + } + } + } + } + } + } + } + + error = getDSErrorMessage (hr); + close(); + return error; + } + + void synchronisePosition() + { + if (pOutputBuffer != 0) + { + DWORD playCursor; + pOutputBuffer->GetCurrentPosition (&playCursor, &writeOffset); + } + } + + bool service() + { + if (pOutputBuffer == 0) + return true; + + DWORD playCursor, writeCursor; + HRESULT hr = pOutputBuffer->GetCurrentPosition (&playCursor, &writeCursor); + + if (hr != S_OK) + { + logError (hr); + jassertfalse + return true; + } + + int playWriteGap = writeCursor - playCursor; + if (playWriteGap < 0) + playWriteGap += totalBytesPerBuffer; + + int bytesEmpty = playCursor - writeOffset; + + if (bytesEmpty < 0) + bytesEmpty += totalBytesPerBuffer; + + if (bytesEmpty > (totalBytesPerBuffer - playWriteGap)) + { + writeOffset = writeCursor; + bytesEmpty = totalBytesPerBuffer - playWriteGap; + } + + if (bytesEmpty >= bytesPerBuffer) + { + LPBYTE lpbuf1 = 0; + LPBYTE lpbuf2 = 0; + DWORD dwSize1 = 0; + DWORD dwSize2 = 0; + + HRESULT hr = pOutputBuffer->Lock (writeOffset, + bytesPerBuffer, + (void**) &lpbuf1, &dwSize1, + (void**) &lpbuf2, &dwSize2, 0); + + if (hr == S_OK) + { + if (bitDepth == 16) + { + const float gainL = 32767.0f; + const float gainR = 32767.0f; + + int* dest = (int*)lpbuf1; + const float* left = leftBuffer; + const float* right = rightBuffer; + int samples1 = dwSize1 >> 2; + int samples2 = dwSize2 >> 2; + + if (left == 0) + { + while (--samples1 >= 0) + { + int r = roundFloatToInt (gainR * *right++); + + if (r < -32768) + r = -32768; + else if (r > 32767) + r = 32767; + + *dest++ = (r << 16); + } + + dest = (int*)lpbuf2; + + while (--samples2 >= 0) + { + int r = roundFloatToInt (gainR * *right++); + + if (r < -32768) + r = -32768; + else if (r > 32767) + r = 32767; + + *dest++ = (r << 16); + } + } + else if (right == 0) + { + while (--samples1 >= 0) + { + int l = roundFloatToInt (gainL * *left++); + + if (l < -32768) + l = -32768; + else if (l > 32767) + l = 32767; + + l &= 0xffff; + + *dest++ = l; + } + + dest = (int*)lpbuf2; + + while (--samples2 >= 0) + { + int l = roundFloatToInt (gainL * *left++); + + if (l < -32768) + l = -32768; + else if (l > 32767) + l = 32767; + + l &= 0xffff; + + *dest++ = l; + } + } + else + { + while (--samples1 >= 0) + { + int l = roundFloatToInt (gainL * *left++); + + if (l < -32768) + l = -32768; + else if (l > 32767) + l = 32767; + + l &= 0xffff; + + int r = roundFloatToInt (gainR * *right++); + + if (r < -32768) + r = -32768; + else if (r > 32767) + r = 32767; + + *dest++ = (r << 16) | l; + } + + dest = (int*)lpbuf2; + + while (--samples2 >= 0) + { + int l = roundFloatToInt (gainL * *left++); + + if (l < -32768) + l = -32768; + else if (l > 32767) + l = 32767; + + l &= 0xffff; + + int r = roundFloatToInt (gainR * *right++); + + if (r < -32768) + r = -32768; + else if (r > 32767) + r = 32767; + + *dest++ = (r << 16) | l; + } + } + } + else + { + jassertfalse + } + + writeOffset = (writeOffset + dwSize1 + dwSize2) % totalBytesPerBuffer; + + pOutputBuffer->Unlock (lpbuf1, dwSize1, lpbuf2, dwSize2); + } + else + { + jassertfalse + logError (hr); + } + + bytesEmpty -= bytesPerBuffer; + + return true; + } + else + { + return false; + } + } +}; + +//============================================================================== +struct DSoundInternalInChannel +{ + String name; + LPGUID guid; + int sampleRate, bufferSizeSamples; + float* leftBuffer; + float* rightBuffer; + + IDirectSound* pDirectSound; + IDirectSoundCapture* pDirectSoundCapture; + IDirectSoundCaptureBuffer* pInputBuffer; + +public: + unsigned int readOffset; + int bytesPerBuffer, totalBytesPerBuffer; + int bitDepth; + bool doneFlag; + + DSoundInternalInChannel (const String& name_, + LPGUID guid_, + int rate, + int bufferSize, + float* left, + float* right) + : name (name_), + guid (guid_), + sampleRate (rate), + bufferSizeSamples (bufferSize), + leftBuffer (left), + rightBuffer (right), + pDirectSound (0), + pDirectSoundCapture (0), + pInputBuffer (0), + bitDepth (16) + { + } + + ~DSoundInternalInChannel() + { + close(); + } + + void close() + { + HRESULT hr; + + if (pInputBuffer != 0) + { + JUCE_TRY + { + log (T("closing dsound in: ") + name); + hr = pInputBuffer->Stop(); + logError (hr); + } + CATCH + + JUCE_TRY + { + hr = pInputBuffer->Release(); + logError (hr); + } + CATCH + + pInputBuffer = 0; + } + + if (pDirectSoundCapture != 0) + { + JUCE_TRY + { + hr = pDirectSoundCapture->Release(); + logError (hr); + } + CATCH + + pDirectSoundCapture = 0; + } + + if (pDirectSound != 0) + { + JUCE_TRY + { + hr = pDirectSound->Release(); + logError (hr); + } + CATCH + + pDirectSound = 0; + } + } + + const String open() + { + log (T("opening dsound in device: ") + name + + T(" rate=") + String (sampleRate) + T(" bits=") + String (bitDepth) + T(" buf=") + String (bufferSizeSamples)); + + pDirectSound = 0; + pDirectSoundCapture = 0; + pInputBuffer = 0; + readOffset = 0; + totalBytesPerBuffer = 0; + + String error; + HRESULT hr = E_NOINTERFACE; + + if (dsDirectSoundCaptureCreate != 0) + hr = dsDirectSoundCaptureCreate (guid, &pDirectSoundCapture, 0); + + logError (hr); + + if (hr == S_OK) + { + const int numChannels = 2; + bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; + totalBytesPerBuffer = (3 * bytesPerBuffer) & ~15; + + WAVEFORMATEX wfFormat; + wfFormat.wFormatTag = WAVE_FORMAT_PCM; + wfFormat.nChannels = (unsigned short)numChannels; + wfFormat.nSamplesPerSec = sampleRate; + wfFormat.wBitsPerSample = (unsigned short)bitDepth; + wfFormat.nBlockAlign = (unsigned short)(wfFormat.nChannels * (wfFormat.wBitsPerSample / 8)); + wfFormat.nAvgBytesPerSec = wfFormat.nSamplesPerSec * wfFormat.nBlockAlign; + wfFormat.cbSize = 0; + + DSCBUFFERDESC captureDesc; + zerostruct (captureDesc); + + captureDesc.dwSize = sizeof (DSCBUFFERDESC); + captureDesc.dwFlags = 0; + captureDesc.dwBufferBytes = totalBytesPerBuffer; + captureDesc.lpwfxFormat = &wfFormat; + + log (T("opening dsound in step 2")); + hr = pDirectSoundCapture->CreateCaptureBuffer (&captureDesc, &pInputBuffer, 0); + + logError (hr); + + if (hr == S_OK) + { + hr = pInputBuffer->Start (1 /* DSCBSTART_LOOPING */); + logError (hr); + + if (hr == S_OK) + return String::empty; + } + } + + error = getDSErrorMessage (hr); + close(); + + return error; + } + + void synchronisePosition() + { + if (pInputBuffer != 0) + { + DWORD capturePos; + pInputBuffer->GetCurrentPosition (&capturePos, (DWORD*)&readOffset); + } + } + + bool service() + { + if (pInputBuffer == 0) + return true; + + DWORD capturePos, readPos; + HRESULT hr = pInputBuffer->GetCurrentPosition (&capturePos, &readPos); + logError (hr); + + if (hr != S_OK) + return true; + + int bytesFilled = readPos - readOffset; + if (bytesFilled < 0) + bytesFilled += totalBytesPerBuffer; + + if (bytesFilled >= bytesPerBuffer) + { + LPBYTE lpbuf1 = 0; + LPBYTE lpbuf2 = 0; + DWORD dwsize1 = 0; + DWORD dwsize2 = 0; + + HRESULT hr = pInputBuffer->Lock (readOffset, + bytesPerBuffer, + (void**) &lpbuf1, &dwsize1, + (void**) &lpbuf2, &dwsize2, 0); + + if (hr == S_OK) + { + if (bitDepth == 16) + { + const float g = 1.0f / 32768.0f; + + float* destL = leftBuffer; + float* destR = rightBuffer; + int samples1 = dwsize1 >> 2; + int samples2 = dwsize2 >> 2; + + const short* src = (const short*)lpbuf1; + + if (destL == 0) + { + while (--samples1 >= 0) + { + ++src; + *destR++ = *src++ * g; + } + + src = (const short*)lpbuf2; + + while (--samples2 >= 0) + { + ++src; + *destR++ = *src++ * g; + } + } + else if (destR == 0) + { + while (--samples1 >= 0) + { + *destL++ = *src++ * g; + ++src; + } + + src = (const short*)lpbuf2; + + while (--samples2 >= 0) + { + *destL++ = *src++ * g; + ++src; + } + } + else + { + while (--samples1 >= 0) + { + *destL++ = *src++ * g; + *destR++ = *src++ * g; + } + + src = (const short*)lpbuf2; + + while (--samples2 >= 0) + { + *destL++ = *src++ * g; + *destR++ = *src++ * g; + } + } + } + else + { + jassertfalse + } + + readOffset = (readOffset + dwsize1 + dwsize2) % totalBytesPerBuffer; + + pInputBuffer->Unlock (lpbuf1, dwsize1, lpbuf2, dwsize2); + } + else + { + logError (hr); + jassertfalse + } + + bytesFilled -= bytesPerBuffer; + + return true; + } + else + { + return false; + } + } +}; + +//============================================================================== +static int findBestMatchForName (const String& name, const StringArray& names) +{ + int i = names.indexOf (name); + + if (i >= 0) + return i; + + StringArray tokens1; + tokens1.addTokens (name, T(" :-"), 0); + + int bestResult = -1; + int bestNumMatches = 1; + + for (i = 0; i < names.size(); ++i) + { + StringArray tokens2; + tokens2.addTokens (names[i], T(" :-"), 0); + + int matches = 0; + + for (int j = tokens1.size(); --j >= 0;) + if (tokens2.contains (tokens1 [j])) + ++matches; + + if (matches > bestNumMatches) + bestResult = i; + } + + return bestResult; +} + +class DSoundAudioIODevice : public AudioIODevice, + public Thread +{ +public: + DSoundAudioIODevice (const String& deviceName, + const int index, + const int inputIndex_) + : AudioIODevice (deviceName, T("DirectSound")), + Thread (T("Juce DSound")), + isOpen_ (false), + isStarted (false), + deviceIndex (index), + inputIndex (inputIndex_), + inChans (4), + outChans (4), + numInputBuffers (0), + numOutputBuffers (0), + totalSamplesOut (0), + sampleRate (0.0), + inputBuffers (0), + outputBuffers (0), + callback (0) + { + } + + ~DSoundAudioIODevice() + { + close(); + } + + const StringArray getOutputChannelNames() + { + return outChannels; + } + + const StringArray getInputChannelNames() + { + return inChannels; + } + + int getNumSampleRates() + { + return 4; + } + + double getSampleRate (int index) + { + const double samps[] = { 44100.0, 48000.0, 88200.0, 96000.0 }; + + return samps [jlimit (0, 3, index)]; + } + + int getNumBufferSizesAvailable() + { + return 50; + } + + int getBufferSizeSamples (int index) + { + int n = 64; + for (int i = 0; i < index; ++i) + n += (n < 512) ? 32 + : ((n < 1024) ? 64 + : ((n < 2048) ? 128 : 256)); + + return n; + } + + int getDefaultBufferSize() + { + return 2560; + } + + const String open (const BitArray& inputChannels, + const BitArray& outputChannels, + double sampleRate, + int bufferSizeSamples) + { + BitArray ins, outs; + + if (deviceIndex >= 0) + { + if (outputChannels[0]) + outs.setBit (2 * deviceIndex); + + if (outputChannels[1]) + outs.setBit (2 * deviceIndex + 1); + + if (inputIndex >= 0) + { + if (inputChannels[0]) + ins.setBit (2 * inputIndex); + + if (inputChannels[1]) + ins.setBit (2 * inputIndex + 1); + } + } + else + { + ins = inputChannels; + outs = outputChannels; + } + + lastError = openDevice (ins, outs, sampleRate, bufferSizeSamples); + isOpen_ = lastError.isEmpty(); + + return lastError; + } + + void close() + { + stop(); + + if (isOpen_) + { + closeDevice(); + isOpen_ = false; + } + } + + bool isOpen() + { + return isOpen_ && isThreadRunning(); + } + + int getCurrentBufferSizeSamples() + { + return bufferSizeSamples; + } + + double getCurrentSampleRate() + { + return sampleRate; + } + + int getCurrentBitDepth() + { + int i, bits = 256; + + for (i = inChans.size(); --i >= 0;) + if (inChans[i] != 0) + bits = jmin (bits, inChans[i]->bitDepth); + + for (i = outChans.size(); --i >= 0;) + if (outChans[i] != 0) + bits = jmin (bits, outChans[i]->bitDepth); + + if (bits > 32) + bits = 16; + + return bits; + } + + int getOutputLatencyInSamples() + { + return (int) (getCurrentBufferSizeSamples() * 1.5); + } + + int getInputLatencyInSamples() + { + return getOutputLatencyInSamples(); + } + + void start (AudioIODeviceCallback* call) + { + if (isOpen_ && call != 0 && ! isStarted) + { + if (! isThreadRunning()) + { + // something gone wrong and the thread's stopped.. + isOpen_ = false; + return; + } + + call->audioDeviceAboutToStart (sampleRate, bufferSizeSamples); + + const ScopedLock sl (startStopLock); + callback = call; + isStarted = true; + } + } + + void stop() + { + if (isStarted) + { + AudioIODeviceCallback* const callbackLocal = callback; + + { + const ScopedLock sl (startStopLock); + isStarted = false; + } + + if (callbackLocal != 0) + callbackLocal->audioDeviceStopped(); + } + } + + bool isPlaying() + { + return isStarted && isOpen_ && isThreadRunning(); + } + + const String getLastError() + { + return lastError; + } + + //============================================================================== + juce_UseDebuggingNewOperator + + StringArray inChannels, outChannels; + +private: + bool isOpen_; + bool isStarted; + String lastError; + + int deviceIndex, inputIndex; + OwnedArray inChans; + OwnedArray outChans; + WaitableEvent startEvent; + + int numInputBuffers, numOutputBuffers, bufferSizeSamples; + int volatile totalSamplesOut; + int64 volatile lastBlockTime; + double sampleRate; + float** inputBuffers; + float** outputBuffers; + + AudioIODeviceCallback* callback; + CriticalSection startStopLock; + + DSoundAudioIODevice (const DSoundAudioIODevice&); + const DSoundAudioIODevice& operator= (const DSoundAudioIODevice&); + + const String openDevice (const BitArray& inputChannels, + const BitArray& outputChannels, + double sampleRate_, + int bufferSizeSamples_); + + void closeDevice() + { + isStarted = false; + stopThread (5000); + + inChans.clear(); + outChans.clear(); + + int i; + for (i = 0; i < numInputBuffers; ++i) + if (inputBuffers[i] != 0) + juce_free (inputBuffers[i]); + + delete[] inputBuffers; + inputBuffers = 0; + numInputBuffers = 0; + + for (i = 0; i < numOutputBuffers; ++i) + if (outputBuffers[i] != 0) + juce_free (outputBuffers[i]); + + delete[] outputBuffers; + outputBuffers = 0; + numOutputBuffers = 0; + } + + void resync() + { + int i; + for (i = outChans.size(); --i >= 0;) + { + DSoundInternalOutChannel* const out = outChans.getUnchecked(i); + if (out != 0) + out->close(); + } + + for (i = inChans.size(); --i >= 0;) + { + DSoundInternalInChannel* const in = inChans.getUnchecked(i); + if (in != 0) + in->close(); + } + + if (threadShouldExit()) + return; + + for (i = outChans.size(); --i >= 0;) + { + DSoundInternalOutChannel* const out = outChans.getUnchecked(i); + if (out != 0) + out->open(); + } + + for (i = inChans.size(); --i >= 0;) + { + DSoundInternalInChannel* const in = inChans.getUnchecked(i); + if (in != 0) + in->open(); + } + + if (threadShouldExit()) + return; + + sleep (5); + + for (i = 0; i < numOutputBuffers; ++i) + if (outChans[i] != 0) + outChans[i]->synchronisePosition(); + + for (i = 0; i < numInputBuffers; ++i) + if (inChans[i] != 0) + inChans[i]->synchronisePosition(); + } + +public: + void run() + { + while (! threadShouldExit()) + { + if (wait (100)) + break; + } + + const int latencyMs = (int) (bufferSizeSamples * 1000.0 / sampleRate); + const int maxTimeMS = jmax (5, 3 * latencyMs); + + while (! threadShouldExit()) + { + int numToDo = 0; + uint32 startTime = Time::getMillisecondCounter(); + + int i; + for (i = inChans.size(); --i >= 0;) + { + DSoundInternalInChannel* const in = inChans.getUnchecked(i); + + if (in != 0) + { + in->doneFlag = false; + ++numToDo; + } + } + + for (i = outChans.size(); --i >= 0;) + { + DSoundInternalOutChannel* const out = outChans.getUnchecked(i); + + if (out != 0) + { + out->doneFlag = false; + ++numToDo; + } + } + + if (numToDo > 0) + { + const int maxCount = 3; + int count = maxCount; + + for (;;) + { + for (i = inChans.size(); --i >= 0;) + { + DSoundInternalInChannel* const in = inChans.getUnchecked(i); + + if (in != 0 && !in->doneFlag) + { + if (in->service()) + { + in->doneFlag = true; + --numToDo; + } + } + } + + for (i = outChans.size(); --i >= 0;) + { + DSoundInternalOutChannel* const out = outChans.getUnchecked(i); + + if (out != 0 && !out->doneFlag) + { + if (out->service()) + { + out->doneFlag = true; + --numToDo; + } + } + } + + if (numToDo <= 0) + break; + + if (Time::getMillisecondCounter() > startTime + maxTimeMS) + { + resync(); + break; + } + + if (--count <= 0) + { + Sleep (1); + count = maxCount; + } + + if (threadShouldExit()) + return; + } + } + else + { + sleep (1); + } + + const ScopedLock sl (startStopLock); + + if (isStarted) + { + JUCE_TRY + { + callback->audioDeviceIOCallback ((const float**) inputBuffers, + numInputBuffers, + outputBuffers, + numOutputBuffers, + bufferSizeSamples); + } + JUCE_CATCH_EXCEPTION + + totalSamplesOut += bufferSizeSamples; + } + else + { + for (i = 0; i < numOutputBuffers; ++i) + if (outputBuffers[i] != 0) + zeromem (outputBuffers[i], bufferSizeSamples * sizeof (float)); + + totalSamplesOut = 0; + sleep (1); + } + } + } +}; + +//============================================================================== +class DSoundAudioIODeviceType : public AudioIODeviceType +{ +public: + DSoundAudioIODeviceType() + : AudioIODeviceType (T("DirectSound")), + hasScanned (false) + { + initialiseDSoundFunctions(); + } + + ~DSoundAudioIODeviceType() + { + } + + //============================================================================== + void scanForDevices() + { + hasScanned = true; + + outputDeviceNames.clear(); + outputGuids.clear(); + inputDeviceNames.clear(); + inputGuids.clear(); + + if (dsDirectSoundEnumerateW != 0) + { + dsDirectSoundEnumerateW (outputEnumProcW, this); + dsDirectSoundCaptureEnumerateW (inputEnumProcW, this); + } + else if (dsDirectSoundEnumerateA != 0) + { + dsDirectSoundEnumerateA (outputEnumProcA, this); + dsDirectSoundCaptureEnumerateA (inputEnumProcA, this); + } + } + + const StringArray getDeviceNames (const bool preferInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return preferInputNames ? inputDeviceNames + : outputDeviceNames; + } + + const String getDefaultDeviceName (const bool preferInputNames) const + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + return getDeviceNames (preferInputNames) [0]; + } + + AudioIODevice* createDevice (const String& deviceName) + { + jassert (hasScanned); // need to call scanForDevices() before doing this + + if (deviceName.isEmpty() || deviceName.equalsIgnoreCase (T("DirectSound"))) + { + DSoundAudioIODevice* device = new DSoundAudioIODevice (deviceName, -1, -1); + + int i; + for (i = 0; i < outputDeviceNames.size(); ++i) + { + device->outChannels.add (outputDeviceNames[i] + TRANS(" (left)")); + device->outChannels.add (outputDeviceNames[i] + TRANS(" (right)")); + } + + for (i = 0; i < inputDeviceNames.size(); ++i) + { + device->inChannels.add (inputDeviceNames[i] + TRANS(" (left)")); + device->inChannels.add (inputDeviceNames[i] + TRANS(" (right)")); + } + + return device; + } + else if (outputDeviceNames.contains (deviceName) + || inputDeviceNames.contains (deviceName)) + { + int outputIndex = outputDeviceNames.indexOf (deviceName); + int inputIndex = findBestMatchForName (deviceName, inputDeviceNames); + + if (outputIndex < 0) + { + // using an input device name instead.. + inputIndex = inputDeviceNames.indexOf (deviceName); + outputIndex = jmax (0, findBestMatchForName (deviceName, outputDeviceNames)); + } + + DSoundAudioIODevice* device = new DSoundAudioIODevice (deviceName, outputIndex, inputIndex); + + device->outChannels.add (TRANS("Left")); + device->outChannels.add (TRANS("Right")); + + if (inputIndex >= 0) + { + device->inChannels.add (TRANS("Left")); + device->inChannels.add (TRANS("Right")); + } + + return device; + } + + return 0; + } + + //============================================================================== + juce_UseDebuggingNewOperator + + StringArray outputDeviceNames; + OwnedArray outputGuids; + + StringArray inputDeviceNames; + OwnedArray inputGuids; + +private: + bool hasScanned; + + //============================================================================== + BOOL outputEnumProc (LPGUID lpGUID, String desc) + { + desc = desc.trim(); + + if (desc.isNotEmpty()) + { + const String origDesc (desc); + + int n = 2; + while (outputDeviceNames.contains (desc)) + desc = origDesc + T(" (") + String (n++) + T(")"); + + outputDeviceNames.add (desc); + + if (lpGUID != 0) + outputGuids.add (new GUID (*lpGUID)); + else + outputGuids.add (0); + } + + return TRUE; + } + + static BOOL CALLBACK outputEnumProcW (LPGUID lpGUID, LPCWSTR description, LPCWSTR, LPVOID object) + { + return ((DSoundAudioIODeviceType*) object) + ->outputEnumProc (lpGUID, String (description)); + } + + static BOOL CALLBACK outputEnumProcA (LPGUID lpGUID, LPCTSTR description, LPCTSTR, LPVOID object) + { + return ((DSoundAudioIODeviceType*) object) + ->outputEnumProc (lpGUID, String (description)); + } + + //============================================================================== + BOOL CALLBACK inputEnumProc (LPGUID lpGUID, String desc) + { + desc = desc.trim(); + + if (desc.isNotEmpty()) + { + const String origDesc (desc); + + int n = 2; + while (inputDeviceNames.contains (desc)) + desc = origDesc + T(" (") + String (n++) + T(")"); + + inputDeviceNames.add (desc); + + if (lpGUID != 0) + inputGuids.add (new GUID (*lpGUID)); + else + inputGuids.add (0); + } + + return TRUE; + } + + static BOOL CALLBACK inputEnumProcW (LPGUID lpGUID, LPCWSTR description, LPCWSTR, LPVOID object) + { + return ((DSoundAudioIODeviceType*) object) + ->inputEnumProc (lpGUID, String (description)); + } + + static BOOL CALLBACK inputEnumProcA (LPGUID lpGUID, LPCTSTR description, LPCTSTR, LPVOID object) + { + return ((DSoundAudioIODeviceType*) object) + ->inputEnumProc (lpGUID, String (description)); + } + + //============================================================================== + DSoundAudioIODeviceType (const DSoundAudioIODeviceType&); + const DSoundAudioIODeviceType& operator= (const DSoundAudioIODeviceType&); +}; + +//============================================================================== +AudioIODeviceType* juce_createDefaultAudioIODeviceType() +{ + return new DSoundAudioIODeviceType(); +} + +//============================================================================== +const String DSoundAudioIODevice::openDevice (const BitArray& inputChannels, + const BitArray& outputChannels, + double sampleRate_, + int bufferSizeSamples_) +{ + closeDevice(); + totalSamplesOut = 0; + + sampleRate = sampleRate_; + + if (bufferSizeSamples_ <= 0) + bufferSizeSamples_ = 960; // use as a default size if none is set. + + bufferSizeSamples = bufferSizeSamples_ & ~7; + + DSoundAudioIODeviceType dlh; + dlh.scanForDevices(); + + numInputBuffers = 2 * dlh.inputDeviceNames.size(); + inputBuffers = new float* [numInputBuffers + 2]; + + numOutputBuffers = 2 * dlh.outputDeviceNames.size(); + outputBuffers = new float* [numOutputBuffers + 2]; + + int i; + for (i = 0; i < numInputBuffers + 2; ++i) + { + inputBuffers[i] = (inputChannels[i] && i < numInputBuffers) + ? (float*) juce_calloc ((bufferSizeSamples + 16) * sizeof (float)) + : 0; + } + + for (i = 0; i < numOutputBuffers + 2; ++i) + { + outputBuffers[i] = (outputChannels[i] && i < numOutputBuffers) + ? (float*) juce_calloc ((bufferSizeSamples + 16) * sizeof (float)) + : 0; + } + + for (i = 0; i < numInputBuffers; ++i) + { + if (inputChannels[i] || inputChannels[i + 1]) + { + inChans.add (new DSoundInternalInChannel (dlh.inputDeviceNames [i / 2], + dlh.inputGuids [i / 2], + (int) sampleRate, bufferSizeSamples, + inputBuffers[i], inputBuffers[i + 1])); + } + else + { + inChans.add (0); + } + + ++i; + } + + for (i = 0; i < numOutputBuffers; ++i) + { + if (outputChannels[i] || outputChannels[i + 1]) + { + outChans.add (new DSoundInternalOutChannel (dlh.outputDeviceNames[i / 2], + dlh.outputGuids [i / 2], + (int) sampleRate, bufferSizeSamples, + outputBuffers[i], outputBuffers[i + 1])); + } + else + { + outChans.add (0); + } + + ++i; + } + + String error; + + for (i = 0; i < numOutputBuffers; ++i) + { + if (outChans[i] != 0) + { + error = outChans[i]->open(); + + if (error.isNotEmpty()) + { + error = T("Error opening ") + dlh.outputDeviceNames[i] + + T(": \"") + error + T("\""); + break; + } + } + } + + if (error.isEmpty()) + { + for (i = 0; i < numInputBuffers; ++i) + { + if (inChans[i] != 0) + { + error = inChans[i]->open(); + + if (error.isNotEmpty()) + { + error = T("Error opening ") + dlh.inputDeviceNames[i] + + T(": \"") + error + T("\""); + break; + } + } + } + } + + if (error.isNotEmpty()) + { + log (error); + return error; + } + + totalSamplesOut = 0; + + startThread (9); + sleep (10); + + for (i = 0; i < numOutputBuffers; ++i) + if (outChans[i] != 0) + outChans[i]->synchronisePosition(); + + for (i = 0; i < numInputBuffers; ++i) + if (inChans[i] != 0) + inChans[i]->synchronisePosition(); + + notify(); + + return String::empty; +} + + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.cpp b/build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.cpp new file mode 100644 index 0000000000..dffcb7a132 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.cpp @@ -0,0 +1,57 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/text/juce_String.h" +#include "juce_win32_DynamicLibraryLoader.h" + + +//============================================================================== +DynamicLibraryLoader::DynamicLibraryLoader (const String& name) +{ + libHandle = LoadLibrary (name); +} + +DynamicLibraryLoader::~DynamicLibraryLoader() +{ + FreeLibrary ((HMODULE) libHandle); +} + +void* DynamicLibraryLoader::findProcAddress (const String& functionName) +{ + return (void*) GetProcAddress ((HMODULE) libHandle, functionName); +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.h b/build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.h new file mode 100644 index 0000000000..5cddf1a78e --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_DynamicLibraryLoader.h @@ -0,0 +1,68 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_WIN32_DYNAMICLIBRARYLOADER_JUCEHEADER__ +#define __JUCE_WIN32_DYNAMICLIBRARYLOADER_JUCEHEADER__ + +#ifndef DOXYGEN + +//============================================================================== +// use with DynamicLibraryLoader to simplify importing functions +// +// functionName: function to import +// localFunctionName: name you want to use to actually call it (must be different) +// returnType: the return type +// object: the DynamicLibraryLoader to use +// params: list of params (bracketed) +// +#define DynamicLibraryImport(functionName, localFunctionName, returnType, object, params) \ + typedef returnType (WINAPI *type##localFunctionName) params; \ + type##localFunctionName localFunctionName \ + = (type##localFunctionName)object.findProcAddress (#functionName); + + +//============================================================================== +// loads and unloads a DLL automatically +class JUCE_API DynamicLibraryLoader +{ +public: + DynamicLibraryLoader (const String& name); + ~DynamicLibraryLoader(); + + void* findProcAddress (const String& functionName); + +private: + void* libHandle; +}; + + +#endif +#endif // __JUCE_WIN32_DYNAMICLIBRARYLOADER_JUCEHEADER__ diff --git a/build/win32/platform_specific_code/juce_win32_FileChooser.cpp b/build/win32/platform_specific_code/juce_win32_FileChooser.cpp new file mode 100644 index 0000000000..1dbc0eb060 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_FileChooser.cpp @@ -0,0 +1,492 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) +#endif + +#include "win32_headers.h" +#include + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.h" +#include "../../../src/juce_appframework/gui/components/juce_Desktop.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + +//============================================================================== +UNICODE_FUNCTION (SHBrowseForFolderW, LPITEMIDLIST, (LPBROWSEINFOW)) +UNICODE_FUNCTION (SHGetPathFromIDListW, BOOL, (LPCITEMIDLIST, LPWSTR)) +UNICODE_FUNCTION (GetSaveFileNameW, BOOL, (LPOPENFILENAMEW)) +UNICODE_FUNCTION (GetOpenFileNameW, BOOL, (LPOPENFILENAMEW)) + +static void juce_initialiseUnicodeFileBrowserFunctions() +{ + static bool initialised = false; + + if (! initialised) + { + initialised = true; + + HMODULE h = LoadLibraryA ("shell32.dll"); + UNICODE_FUNCTION_LOAD (SHBrowseForFolderW) + UNICODE_FUNCTION_LOAD (SHGetPathFromIDListW) + + h = LoadLibraryA ("comdlg32.dll"); + UNICODE_FUNCTION_LOAD (GetSaveFileNameW) + UNICODE_FUNCTION_LOAD (GetOpenFileNameW) + } +} + + +//============================================================================== +static const void* defaultDirPath = 0; +static String returnedString; // need this to get non-existent pathnames from the directory chooser +static Component* currentExtraFileWin = 0; + +static bool areThereAnyAlwaysOnTopWindows() +{ + for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) + { + Component* c = Desktop::getInstance().getComponent (i); + + if (c != 0 && c->isAlwaysOnTop() && c->isShowing()) + return true; + } + + return false; +} + +static int CALLBACK browseCallbackProc (HWND hWnd, UINT msg, LPARAM lParam, LPARAM /*lpData*/) +{ + if (msg == BFFM_INITIALIZED) + { + SendMessage (hWnd, (wSHBrowseForFolderW != 0) ? BFFM_SETSELECTIONW + : BFFM_SETSELECTIONA, + TRUE, (LPARAM) defaultDirPath); + } + else if (msg == BFFM_VALIDATEFAILEDW) + { + returnedString = (LPCWSTR) lParam; + } + else if (msg == BFFM_VALIDATEFAILEDA) + { + returnedString = (const char*) lParam; + } + + return 0; +} + +void juce_setWindowStyleBit (HWND h, int styleType, int feature, bool bitIsSet); + +static UINT_PTR CALLBACK openCallback (HWND hdlg, UINT uiMsg, WPARAM /*wParam*/, LPARAM lParam) +{ + if (currentExtraFileWin != 0) + { + if (uiMsg == WM_INITDIALOG) + { + HWND dialogH = GetParent (hdlg); + jassert (dialogH != 0); + if (dialogH == 0) + dialogH = hdlg; + + RECT r, cr; + GetWindowRect (dialogH, &r); + GetClientRect (dialogH, &cr); + + SetWindowPos (dialogH, 0, + r.left, r.top, + currentExtraFileWin->getWidth() + jmax (150, r.right - r.left), + jmax (150, r.bottom - r.top), + SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); + + currentExtraFileWin->setBounds (cr.right, cr.top, currentExtraFileWin->getWidth(), cr.bottom - cr.top); + currentExtraFileWin->getChildComponent(0)->setBounds (0, 0, currentExtraFileWin->getWidth(), currentExtraFileWin->getHeight()); + + SetParent ((HWND) currentExtraFileWin->getWindowHandle(), (HWND) dialogH); + juce_setWindowStyleBit ((HWND)currentExtraFileWin->getWindowHandle(), GWL_STYLE, WS_CHILD, (dialogH != 0)); + juce_setWindowStyleBit ((HWND)currentExtraFileWin->getWindowHandle(), GWL_STYLE, WS_POPUP, (dialogH == 0)); + } + else if (uiMsg == WM_NOTIFY) + { + LPOFNOTIFY ofn = (LPOFNOTIFY) lParam; + + if (ofn->hdr.code == CDN_SELCHANGE) + { + FilePreviewComponent* comp = (FilePreviewComponent*) currentExtraFileWin->getChildComponent(0); + + if (comp != 0) + { + TCHAR path [MAX_PATH * 2]; + path[0] = 0; + CommDlg_OpenSave_GetFilePath (GetParent (hdlg), (LPARAM) &path, MAX_PATH); + + String fn; + + if (wGetOpenFileNameW != 0) + fn = (const WCHAR*) path; + else + fn = path; + + comp->selectedFileChanged (File (fn)); + } + } + } + } + + return 0; +} + +class FPComponentHolder : public Component +{ +public: + FPComponentHolder() + { + setVisible (true); + setOpaque (true); + } + + ~FPComponentHolder() + { + } + + void paint (Graphics& g) + { + g.fillAll (Colours::lightgrey); + } + +private: + FPComponentHolder (const FPComponentHolder&); + const FPComponentHolder& operator= (const FPComponentHolder&); +}; + +//============================================================================== +void FileChooser::showPlatformDialog (OwnedArray& results, + const String& title, + const File& currentFileOrDirectory, + const String& filter, + bool selectsDirectory, + bool isSaveDialogue, + bool warnAboutOverwritingExistingFiles, + bool selectMultipleFiles, + FilePreviewComponent* extraInfoComponent) +{ + juce_initialiseUnicodeFileBrowserFunctions(); + + const int numCharsAvailable = 32768; + MemoryBlock filenameSpace ((numCharsAvailable + 1) * sizeof (WCHAR), true); + WCHAR* const fname = (WCHAR*) filenameSpace.getData(); + int fnameIdx = 0; + + JUCE_TRY + { + // use a modal window as the parent for this dialog box + // to block input from other app windows + const Rectangle mainMon (Desktop::getInstance().getMainMonitorArea()); + + Component w (String::empty); + w.setBounds (mainMon.getX() + mainMon.getWidth() / 4, + mainMon.getY() + mainMon.getHeight() / 4, + 0, 0); + w.setOpaque (true); + w.setAlwaysOnTop (areThereAnyAlwaysOnTopWindows()); + w.addToDesktop (0); + + if (extraInfoComponent == 0) + w.enterModalState(); + + String initialDir; + + if (currentFileOrDirectory.isDirectory()) + { + initialDir = currentFileOrDirectory.getFullPathName(); + } + else + { + if (wSHBrowseForFolderW != 0) + currentFileOrDirectory.getFileName().copyToBuffer (fname, numCharsAvailable); + else + currentFileOrDirectory.getFileName().copyToBuffer ((char*) fname, numCharsAvailable); + + initialDir = currentFileOrDirectory.getParentDirectory().getFullPathName(); + } + + if (currentExtraFileWin->isValidComponent()) + { + jassertfalse + return; + } + + if (selectsDirectory) + { + LPITEMIDLIST list = 0; + filenameSpace.fillWith (0); + + if (wSHBrowseForFolderW != 0) + { + BROWSEINFOW bi; + zerostruct (bi); + + bi.hwndOwner = (HWND) w.getWindowHandle(); + bi.pszDisplayName = fname; + bi.lpszTitle = title; + bi.lpfn = browseCallbackProc; +#ifdef BIF_USENEWUI + bi.ulFlags = BIF_USENEWUI | BIF_VALIDATE; +#else + bi.ulFlags = 0x50; +#endif + defaultDirPath = (const WCHAR*) initialDir; + + list = wSHBrowseForFolderW (&bi); + + if (! wSHGetPathFromIDListW (list, fname)) + { + fname[0] = 0; + returnedString = String::empty; + } + } + else + { + BROWSEINFO bi; + zerostruct (bi); + + bi.hwndOwner = (HWND) w.getWindowHandle(); + bi.pszDisplayName = (TCHAR*) fname; + bi.lpszTitle = title; + bi.lpfn = browseCallbackProc; +#ifdef BIF_USENEWUI + bi.ulFlags = BIF_USENEWUI | BIF_VALIDATE; +#else + bi.ulFlags = 0x50; +#endif + defaultDirPath = (const char*) initialDir; + + list = SHBrowseForFolder (&bi); + + if (! SHGetPathFromIDList (list, (char*) fname)) + { + fname[0] = 0; + returnedString = String::empty; + } + } + + LPMALLOC al; + if (list != 0 && SUCCEEDED (SHGetMalloc (&al))) + al->Free (list); + + defaultDirPath = 0; + + if (returnedString.isNotEmpty()) + { + String stringFName; + + if (wSHBrowseForFolderW != 0) + stringFName = fname; + else + stringFName = (char*) fname; + + results.add (new File (File (stringFName).getSiblingFile (returnedString))); + returnedString = String::empty; + + return; + } + } + else + { + DWORD flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR | OFN_HIDEREADONLY; + + if (warnAboutOverwritingExistingFiles) + flags |= OFN_OVERWRITEPROMPT; + + if (selectMultipleFiles) + flags |= OFN_ALLOWMULTISELECT; + + if (extraInfoComponent != 0) + { + flags |= OFN_ENABLEHOOK; + + currentExtraFileWin = new FPComponentHolder(); + currentExtraFileWin->addAndMakeVisible (extraInfoComponent); + currentExtraFileWin->setSize (jlimit (20, 800, extraInfoComponent->getWidth()), + extraInfoComponent->getHeight()); + currentExtraFileWin->addToDesktop (0); + + currentExtraFileWin->enterModalState(); + } + + if (wGetSaveFileNameW != 0) + { + WCHAR filters [1024]; + zeromem (filters, sizeof (filters)); + filter.copyToBuffer (filters, 1024); + filter.copyToBuffer (filters + filter.length() + 1, + 1022 - filter.length()); + + OPENFILENAMEW of; + zerostruct (of); + +#ifdef OPENFILENAME_SIZE_VERSION_400W + of.lStructSize = OPENFILENAME_SIZE_VERSION_400W; +#else + of.lStructSize = sizeof (of); +#endif + of.hwndOwner = (HWND) w.getWindowHandle(); + of.lpstrFilter = filters; + of.nFilterIndex = 1; + of.lpstrFile = fname; + of.nMaxFile = numCharsAvailable; + of.lpstrInitialDir = initialDir; + of.lpstrTitle = title; + of.Flags = flags; + + if (extraInfoComponent != 0) + of.lpfnHook = &openCallback; + + if (isSaveDialogue) + { + if (! wGetSaveFileNameW (&of)) + fname[0] = 0; + else + fnameIdx = of.nFileOffset; + } + else + { + if (! wGetOpenFileNameW (&of)) + fname[0] = 0; + else + fnameIdx = of.nFileOffset; + } + } + else + { + TCHAR filters [1024]; + zeromem (filters, sizeof (filters)); + filter.copyToBuffer (filters, 1024); + filter.copyToBuffer (filters + filter.length() + 1, + 1022 - filter.length()); + + OPENFILENAME of; + zerostruct (of); + +#ifdef OPENFILENAME_SIZE_VERSION_400 + of.lStructSize = OPENFILENAME_SIZE_VERSION_400; +#else + of.lStructSize = sizeof (of); +#endif + of.hwndOwner = (HWND) w.getWindowHandle(); + of.lpstrFilter = filters; + of.nFilterIndex = 1; + of.lpstrFile = (TCHAR*) fname; + of.nMaxFile = numCharsAvailable; + of.lpstrInitialDir = initialDir; + of.lpstrTitle = title; + of.Flags = flags; + + if (extraInfoComponent != 0) + of.lpfnHook = &openCallback; + + if (isSaveDialogue) + { + if (! GetSaveFileName (&of)) + fname[0] = 0; + else + fnameIdx = of.nFileOffset; + } + else + { + if (! GetOpenFileName (&of)) + fname[0] = 0; + else + fnameIdx = of.nFileOffset; + } + } + } + } +#if JUCE_CATCH_UNHANDLED_EXCEPTIONS + catch (...) + { + fname[0] = 0; + } +#endif + + deleteAndZero (currentExtraFileWin); + + if (wGetSaveFileNameW != 0) + { + const WCHAR* const files = fname; + + if (selectMultipleFiles && fnameIdx > 0 && files [fnameIdx - 1] == 0) + { + const WCHAR* filename = files + fnameIdx; + + while (*filename != 0) + { + const String filepath (String (files) + T("\\") + String (filename)); + results.add (new File (filepath)); + filename += CharacterFunctions::length (filename) + 1; + } + } + else if (files[0] != 0) + { + results.add (new File (files)); + } + } + else + { + const char* const files = (const char*) fname; + + if (selectMultipleFiles && fnameIdx > 0 && files [fnameIdx - 1] == 0) + { + const char* filename = files + fnameIdx; + + while (*filename != 0) + { + const String filepath (String (files) + T("\\") + String (filename)); + results.add (new File (filepath)); + filename += CharacterFunctions::length (filename) + 1; + } + } + else if (files[0] != 0) + { + results.add (new File (files)); + } + } +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Files.cpp b/build/win32/platform_specific_code/juce_win32_Files.cpp new file mode 100644 index 0000000000..6cd2e89d07 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Files.cpp @@ -0,0 +1,960 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) +#endif + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +#include + +#ifndef _WIN32_IE + #define _WIN32_IE 0x0400 +#endif +#include + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/io/files/juce_File.h" +#include "../../../src/juce_core/io/network/juce_URL.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/io/files/juce_NamedPipe.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + +//============================================================================== +const tchar File::separator = T('\\'); +const tchar* File::separatorString = T("\\"); + +//============================================================================== +UNICODE_FUNCTION (GetFileAttributesW, DWORD, (LPCWSTR)) +UNICODE_FUNCTION (SetFileAttributesW, BOOL, (LPCWSTR, DWORD)) +UNICODE_FUNCTION (RemoveDirectoryW, BOOL, (LPCWSTR)) +UNICODE_FUNCTION (DeleteFileW, BOOL, (LPCWSTR)) +UNICODE_FUNCTION (MoveFileW, BOOL, (LPCWSTR, LPCWSTR)) +UNICODE_FUNCTION (CopyFileW, BOOL, (LPCWSTR, LPCWSTR, BOOL)) +UNICODE_FUNCTION (CreateDirectoryW, BOOL, (LPCWSTR, LPSECURITY_ATTRIBUTES)) +UNICODE_FUNCTION (CreateFileW, HANDLE, (LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE)) +UNICODE_FUNCTION (CreateNamedPipeW, HANDLE, (LPCWSTR, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPSECURITY_ATTRIBUTES)) +UNICODE_FUNCTION (GetTempPathW, DWORD, (DWORD, LPCWSTR)) +UNICODE_FUNCTION (SHGetSpecialFolderPathW, BOOL, (HWND, LPCWSTR, int, BOOL)) +UNICODE_FUNCTION (GetModuleFileNameW, DWORD, (HMODULE, LPCWSTR, DWORD)) +UNICODE_FUNCTION (GetCurrentDirectoryW, DWORD, (DWORD, LPCWSTR)) +UNICODE_FUNCTION (SetCurrentDirectoryW, BOOL, (LPCWSTR)) +UNICODE_FUNCTION (FindFirstFileW, HANDLE, (LPCWSTR, LPWIN32_FIND_DATAW)) +UNICODE_FUNCTION (FindNextFileW, BOOL, (HANDLE, LPWIN32_FIND_DATAW)) + +void juce_initialiseUnicodeFileFunctions() +{ + if ((SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0) + { + HMODULE h = GetModuleHandleA ("kernel32.dll"); + + UNICODE_FUNCTION_LOAD (GetFileAttributesW) + UNICODE_FUNCTION_LOAD (SetFileAttributesW) + UNICODE_FUNCTION_LOAD (RemoveDirectoryW) + UNICODE_FUNCTION_LOAD (DeleteFileW) + UNICODE_FUNCTION_LOAD (MoveFileW) + UNICODE_FUNCTION_LOAD (CopyFileW) + UNICODE_FUNCTION_LOAD (CreateDirectoryW) + UNICODE_FUNCTION_LOAD (CreateFileW) + UNICODE_FUNCTION_LOAD (CreateNamedPipeW) + UNICODE_FUNCTION_LOAD (GetTempPathW) + UNICODE_FUNCTION_LOAD (GetModuleFileNameW) + UNICODE_FUNCTION_LOAD (GetCurrentDirectoryW) + UNICODE_FUNCTION_LOAD (SetCurrentDirectoryW) + UNICODE_FUNCTION_LOAD (FindFirstFileW) + UNICODE_FUNCTION_LOAD (FindNextFileW) + + h = LoadLibraryA ("shell32.dll"); + UNICODE_FUNCTION_LOAD (SHGetSpecialFolderPathW) + } +} + + +//============================================================================== +bool juce_fileExists (const String& fileName, + const bool dontCountDirectories) +{ + if (fileName.isEmpty()) + return false; + + const DWORD attr = (wGetFileAttributesW != 0) ? wGetFileAttributesW (fileName) + : GetFileAttributes (fileName); + + return (dontCountDirectories) ? ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0) + : (attr != 0xffffffff); +} + +bool juce_isDirectory (const String& fileName) +{ + const DWORD attr = (wGetFileAttributesW != 0) ? wGetFileAttributesW (fileName) + : GetFileAttributes (fileName); + + return (attr != 0xffffffff) + && ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0); +} + +bool juce_canWriteToFile (const String& fileName) +{ + const DWORD attr = (wGetFileAttributesW != 0) ? wGetFileAttributesW (fileName) + : GetFileAttributes (fileName); + + return ((attr & FILE_ATTRIBUTE_READONLY) == 0); +} + +bool juce_setFileReadOnly (const String& fileName, + bool isReadOnly) +{ + DWORD attr = (wGetFileAttributesW != 0) ? wGetFileAttributesW (fileName) + : GetFileAttributes (fileName); + + if (attr == 0xffffffff) + return false; + + if (isReadOnly != juce_canWriteToFile (fileName)) + return true; + + if (isReadOnly) + attr |= FILE_ATTRIBUTE_READONLY; + else + attr &= ~FILE_ATTRIBUTE_READONLY; + + if (wSetFileAttributesW != 0) + return wSetFileAttributesW (fileName, attr) != FALSE; + + return SetFileAttributes (fileName, attr) != FALSE; +} + +//============================================================================== +bool juce_deleteFile (const String& fileName) +{ + if (juce_isDirectory (fileName)) + return (wRemoveDirectoryW != 0) ? wRemoveDirectoryW (fileName) != 0 + : RemoveDirectory (fileName) != 0; + else + return (wDeleteFileW != 0) ? wDeleteFileW (fileName) != 0 + : DeleteFile (fileName) != 0; +} + +bool juce_moveFile (const String& source, const String& dest) +{ + return (wMoveFileW != 0) ? wMoveFileW (source, dest) != 0 + : MoveFile (source, dest) != 0; +} + +bool juce_copyFile (const String& source, const String& dest) +{ + return (wCopyFileW != 0) ? wCopyFileW (source, dest, false) != 0 + : CopyFile (source, dest, false) != 0; +} + +void juce_createDirectory (const String& fileName) +{ + if (! juce_fileExists (fileName, true)) + { + if (wCreateDirectoryW != 0) + wCreateDirectoryW (fileName, 0); + else + CreateDirectory (fileName, 0); + } +} + +//============================================================================== +// return 0 if not possible +void* juce_fileOpen (const String& fileName, bool forWriting) +{ + HANDLE h; + + if (forWriting) + { + if (wCreateFileW != 0) + h = wCreateFileW (fileName, GENERIC_WRITE, FILE_SHARE_READ, 0, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + else + h = CreateFile (fileName, GENERIC_WRITE, FILE_SHARE_READ, 0, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + + if (h != INVALID_HANDLE_VALUE) + SetFilePointer (h, 0, 0, FILE_END); + else + h = 0; + } + else + { + if (wCreateFileW != 0) + h = wCreateFileW (fileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0); + else + h = CreateFile (fileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0); + + if (h == INVALID_HANDLE_VALUE) + h = 0; + } + + return (void*) h; +} + +void juce_fileClose (void* handle) +{ + CloseHandle (handle); +} + +//============================================================================== +int juce_fileRead (void* handle, void* buffer, int size) +{ + DWORD num = 0; + ReadFile ((HANDLE) handle, buffer, size, &num, 0); + return num; +} + +int juce_fileWrite (void* handle, const void* buffer, int size) +{ + DWORD num; + + WriteFile ((HANDLE) handle, + buffer, size, + &num, 0); + + return num; +} + +int64 juce_fileSetPosition (void* handle, int64 pos) +{ + LARGE_INTEGER li; + li.QuadPart = pos; + li.LowPart = SetFilePointer ((HANDLE) handle, + li.LowPart, + &li.HighPart, + FILE_BEGIN); // (returns -1 if it fails) + + return li.QuadPart; +} + +int64 juce_fileGetPosition (void* handle) +{ + LARGE_INTEGER li; + li.QuadPart = 0; + li.LowPart = SetFilePointer ((HANDLE) handle, + 0, &li.HighPart, + FILE_CURRENT); // (returns -1 if it fails) + + return jmax ((int64) 0, li.QuadPart); +} + +void juce_fileFlush (void* handle) +{ + FlushFileBuffers ((HANDLE) handle); +} + +int64 juce_getFileSize (const String& fileName) +{ + void* const handle = juce_fileOpen (fileName, false); + + if (handle != 0) + { + LARGE_INTEGER li; + li.LowPart = GetFileSize (handle, (LPDWORD) &li.HighPart); + juce_fileClose (handle); + + if (li.LowPart != INVALID_FILE_SIZE || GetLastError() != NO_ERROR) + return li.QuadPart; + } + + return 0; +} + +//============================================================================== +static int64 fileTimeToTime (const FILETIME* const ft) throw() +{ + // tell me if this fails! + static_jassert (sizeof (ULARGE_INTEGER) == sizeof (FILETIME)); + +#ifdef JUCE_GCC + return (((const ULARGE_INTEGER*) ft)->QuadPart - 116444736000000000LL) / 10000; +#else + return (((const ULARGE_INTEGER*) ft)->QuadPart - 116444736000000000) / 10000; +#endif +} + +static void timeToFileTime (const int64 time, FILETIME* const ft) throw() +{ +#ifdef JUCE_GCC + ((ULARGE_INTEGER*) ft)->QuadPart = time * 10000 + 116444736000000000LL; +#else + ((ULARGE_INTEGER*) ft)->QuadPart = time * 10000 + 116444736000000000; +#endif +} + +void juce_getFileTimes (const String& fileName, + int64& modificationTime, + int64& accessTime, + int64& creationTime) +{ + creationTime = accessTime = modificationTime = 0; + void* const h = juce_fileOpen (fileName, false); + + if (h != 0) + { + FILETIME m, a, c; + + if (GetFileTime ((HANDLE) h, &c, &a, &m)) + { + creationTime = fileTimeToTime (&c); + accessTime = fileTimeToTime (&a); + modificationTime = fileTimeToTime (&m); + } + + juce_fileClose (h); + } +} + +bool juce_setFileTimes (const String& fileName, + int64 modificationTime, + int64 accessTime, + int64 creationTime) +{ + FILETIME m, a, c; + + if (modificationTime > 0) + timeToFileTime (modificationTime, &m); + + if (accessTime > 0) + timeToFileTime (accessTime, &a); + + if (creationTime > 0) + timeToFileTime (creationTime, &c); + + void* const h = juce_fileOpen (fileName, true); + bool ok = false; + + if (h != 0) + { + ok = SetFileTime ((HANDLE) h, + (creationTime > 0) ? &c : 0, + (accessTime > 0) ? &a : 0, + (modificationTime > 0) ? &m : 0) != 0; + juce_fileClose (h); + } + + return ok; +} + +//============================================================================== +// return '\0' separated list of strings +const StringArray juce_getFileSystemRoots() +{ + TCHAR buffer [2048]; + buffer[0] = 0; + buffer[1] = 0; + GetLogicalDriveStrings (2048, buffer); + + TCHAR* n = buffer; + StringArray roots; + + while (*n != 0) + { + roots.add (String (n)); + + while (*n++ != 0) + { + } + } + + roots.sort (true); + return roots; +} + +//============================================================================== +const String juce_getVolumeLabel (const String& filenameOnVolume, + int& volumeSerialNumber) +{ + TCHAR n [4]; + n[0] = *(const TCHAR*) filenameOnVolume; + n[1] = L':'; + n[2] = L'\\'; + n[3] = 0; + + TCHAR dest [64]; + DWORD serialNum; + + if (! GetVolumeInformation (n, dest, 64, (DWORD*) &serialNum, 0, 0, 0, 0)) + { + dest[0] = 0; + serialNum = 0; + } + + volumeSerialNumber = serialNum; + return String (dest); +} + +int64 File::getBytesFreeOnVolume() const throw() +{ + String fn (getFullPathName()); + if (fn[1] == T(':')) + fn = fn.substring (0, 2) + T("\\"); + + ULARGE_INTEGER spc; + ULARGE_INTEGER tot; + ULARGE_INTEGER totFree; + + if (GetDiskFreeSpaceEx (fn, &spc, &tot, &totFree)) + return (int64)(spc.QuadPart); + + return 0; +} + +//============================================================================== +static unsigned int getWindowsDriveType (const String& fileName) +{ + TCHAR n[4]; + n[0] = *(const TCHAR*) fileName; + n[1] = L':'; + n[2] = L'\\'; + n[3] = 0; + + return GetDriveType (n); +} + +bool File::isOnCDRomDrive() const throw() +{ + return getWindowsDriveType (getFullPathName()) == DRIVE_CDROM; +} + +bool File::isOnHardDisk() const throw() +{ + if (fullPath.isEmpty()) + return false; + + const unsigned int n = getWindowsDriveType (getFullPathName()); + + if (fullPath.toLowerCase()[0] <= 'b' + && fullPath[1] == T(':')) + { + return n != DRIVE_REMOVABLE; + } + else + { + return n != DRIVE_CDROM && n != DRIVE_REMOTE; + } +} + +bool File::isOnRemovableDrive() const throw() +{ + if (fullPath.isEmpty()) + return false; + + const unsigned int n = getWindowsDriveType (getFullPathName()); + + return n == DRIVE_CDROM + || n == DRIVE_REMOTE + || n == DRIVE_REMOVABLE + || n == DRIVE_RAMDISK; +} + +//============================================================================== +#define MAX_PATH_CHARS (MAX_PATH + 256) + +static const File juce_getSpecialFolderPath (int type) +{ + if (wSHGetSpecialFolderPathW != 0) + { + WCHAR path [MAX_PATH_CHARS]; + + if (wSHGetSpecialFolderPathW (0, path, type, 0)) + return File (String (path)); + } + else + { + TCHAR path [MAX_PATH_CHARS]; + + if (SHGetSpecialFolderPath (0, path, type, 0)) + return File (String (path)); + } + + return File::nonexistent; +} + +const File File::getSpecialLocation (const SpecialLocationType type) +{ + switch (type) + { + case userHomeDirectory: + case userDocumentsDirectory: + return juce_getSpecialFolderPath (CSIDL_PERSONAL); + + case userDesktopDirectory: + return juce_getSpecialFolderPath (CSIDL_DESKTOP); + + case userApplicationDataDirectory: + return juce_getSpecialFolderPath (CSIDL_APPDATA); + + case commonApplicationDataDirectory: + return juce_getSpecialFolderPath (CSIDL_COMMON_APPDATA); + + case globalApplicationsDirectory: + return juce_getSpecialFolderPath (CSIDL_PROGRAM_FILES); + + case tempDirectory: + if (wGetTempPathW != 0) + { + WCHAR dest [2048]; + dest[0] = 0; + wGetTempPathW (2048, dest); + return File (String (dest)); + } + else + { + TCHAR dest [2048]; + dest[0] = 0; + GetTempPath (2048, dest); + return File (String (dest)); + } + + case currentExecutableFile: + case currentApplicationFile: + { + HINSTANCE moduleHandle = (HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle(); + + if (wGetModuleFileNameW != 0) + { + WCHAR dest [MAX_PATH_CHARS]; + dest[0] = 0; + wGetModuleFileNameW (moduleHandle, dest, MAX_PATH_CHARS); + return File (String (dest)); + } + else + { + TCHAR dest [MAX_PATH_CHARS]; + dest[0] = 0; + GetModuleFileName (moduleHandle, dest, MAX_PATH_CHARS); + return File (String (dest)); + } + } + break; + + default: + jassertfalse // unknown type? + break; + } + + return File::nonexistent; +} + + +void juce_setCurrentExecutableFileName (const String&) +{ + // n/a on windows +} + +//============================================================================== +const File File::getCurrentWorkingDirectory() throw() +{ + if (wGetCurrentDirectoryW != 0) + { + WCHAR dest [MAX_PATH_CHARS]; + dest[0] = 0; + wGetCurrentDirectoryW (MAX_PATH_CHARS, dest); + return File (String (dest)); + } + else + { + TCHAR dest [MAX_PATH_CHARS]; + dest[0] = 0; + GetCurrentDirectory (MAX_PATH_CHARS, dest); + return File (String (dest)); + } +} + +bool File::setAsCurrentWorkingDirectory() const throw() +{ + return (wSetCurrentDirectoryW != 0) ? wSetCurrentDirectoryW (getFullPathName()) != FALSE + : SetCurrentDirectory (getFullPathName()) != FALSE; +} + +//============================================================================== +template +static void getFindFileInfo (FindDataType& findData, + String& filename, bool* const isDir, bool* const isHidden, + int64* const fileSize, Time* const modTime, Time* const creationTime, + bool* const isReadOnly) +{ + filename = findData.cFileName; + + if (isDir != 0) + *isDir = ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); + + if (isHidden != 0) + *isHidden = ((findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0); + + if (fileSize != 0) + *fileSize = findData.nFileSizeLow + (((int64) findData.nFileSizeHigh) << 32); + + if (modTime != 0) + *modTime = fileTimeToTime (&findData.ftLastWriteTime); + + if (creationTime != 0) + *creationTime = fileTimeToTime (&findData.ftCreationTime); + + if (isReadOnly != 0) + *isReadOnly = ((findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0); + +} + +void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResult, + bool* isDir, bool* isHidden, int64* fileSize, + Time* modTime, Time* creationTime, bool* isReadOnly) +{ + String wc (directory); + + if (! wc.endsWithChar (File::separator)) + wc += File::separator; + + wc += wildCard; + + if (wFindFirstFileW != 0) + { + WIN32_FIND_DATAW findData; + HANDLE h = wFindFirstFileW (wc, &findData); + + if (h != INVALID_HANDLE_VALUE) + { + getFindFileInfo (findData, firstResult, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); + return h; + } + } + else + { + WIN32_FIND_DATA findData; + HANDLE h = FindFirstFile (wc, &findData); + + if (h != INVALID_HANDLE_VALUE) + { + getFindFileInfo (findData, firstResult, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); + return h; + } + } + + firstResult = String::empty; + return 0; +} + +bool juce_findFileNext (void* handle, String& resultFile, + bool* isDir, bool* isHidden, int64* fileSize, + Time* modTime, Time* creationTime, bool* isReadOnly) +{ + if (wFindNextFileW != 0) + { + WIN32_FIND_DATAW findData; + + if (handle != 0 && wFindNextFileW ((HANDLE) handle, &findData) != 0) + { + getFindFileInfo (findData, resultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); + return true; + } + } + else + { + WIN32_FIND_DATA findData; + + if (handle != 0 && FindNextFile ((HANDLE) handle, &findData) != 0) + { + getFindFileInfo (findData, resultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); + return true; + } + } + + resultFile = String::empty; + return false; +} + +void juce_findFileClose (void* handle) +{ + FindClose (handle); +} + +//============================================================================== +bool juce_launchFile (const String& fileName, + const String& parameters) +{ + HINSTANCE hInstance = 0; + + JUCE_TRY + { + hInstance = ShellExecute (0, 0, fileName, parameters, 0, SW_SHOWDEFAULT); + } + JUCE_CATCH_ALL + + return hInstance > (HINSTANCE) 32; +} + +//============================================================================== +struct NamedPipeInternal +{ + HANDLE pipeH; + HANDLE cancelEvent; + bool connected, createdPipe; + + NamedPipeInternal() + : pipeH (0), + cancelEvent (0), + connected (false), + createdPipe (false) + { + cancelEvent = CreateEvent (0, FALSE, FALSE, 0); + } + + ~NamedPipeInternal() + { + disconnect(); + + if (pipeH != 0) + CloseHandle (pipeH); + + CloseHandle (cancelEvent); + } + + bool connect (const int timeOutMs) + { + if (! createdPipe) + return true; + + if (! connected) + { + OVERLAPPED over; + zerostruct (over); + + over.hEvent = CreateEvent (0, TRUE, FALSE, 0); + + if (ConnectNamedPipe (pipeH, &over)) + { + connected = false; // yes, you read that right. In overlapped mode it should always return 0. + } + else + { + const int err = GetLastError(); + + if (err == ERROR_IO_PENDING || err == ERROR_PIPE_LISTENING) + { + HANDLE handles[] = { over.hEvent, cancelEvent }; + + if (WaitForMultipleObjects (2, handles, FALSE, + timeOutMs >= 0 ? timeOutMs : INFINITE) == WAIT_OBJECT_0) + connected = true; + } + else if (err == ERROR_PIPE_CONNECTED) + { + connected = true; + } + } + + CloseHandle (over.hEvent); + } + + return connected; + } + + void disconnect() + { + if (connected) + { + DisconnectNamedPipe (pipeH); + connected = false; + } + } +}; + +void NamedPipe::close() +{ + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + delete intern; + internal = 0; +} + +bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) +{ + close(); + + NamedPipeInternal* const intern = new NamedPipeInternal(); + + String file (T("\\\\.\\pipe\\")); + file += pipeName; + + intern->createdPipe = createPipe; + + if (createPipe) + { + if (wCreateNamedPipeW != 0) + intern->pipeH = wCreateNamedPipeW (file, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, + 1, 64, 64, 0, NULL); + else + intern->pipeH = CreateNamedPipe (file, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, + 1, 64, 64, 0, NULL); + } + else + { + if (wCreateFileW != 0) + intern->pipeH = wCreateFileW (file, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, 0); + else + intern->pipeH = CreateFile (file, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, 0); + } + + if (intern->pipeH != INVALID_HANDLE_VALUE) + { + internal = intern; + return true; + } + + delete intern; + return false; +} + +int NamedPipe::read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds) +{ + int bytesRead = -1; + bool waitAgain = true; + + while (waitAgain && internal != 0) + { + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + waitAgain = false; + + if (! intern->connect (timeOutMilliseconds)) + break; + + if (maxBytesToRead <= 0) + return 0; + + OVERLAPPED over; + zerostruct (over); + over.hEvent = CreateEvent (0, TRUE, FALSE, 0); + + unsigned long numRead; + + if (ReadFile (intern->pipeH, destBuffer, maxBytesToRead, &numRead, &over)) + { + bytesRead = (int) numRead; + } + else if (GetLastError() == ERROR_IO_PENDING) + { + HANDLE handles[] = { over.hEvent, intern->cancelEvent }; + + if (WaitForMultipleObjects (2, handles, FALSE, + timeOutMilliseconds >= 0 ? timeOutMilliseconds + : INFINITE) == WAIT_OBJECT_0) + { + if (GetOverlappedResult (intern->pipeH, &over, &numRead, FALSE)) + { + bytesRead = (int) numRead; + } + else if (GetLastError() == ERROR_BROKEN_PIPE && intern->createdPipe) + { + intern->disconnect(); + waitAgain = true; + } + } + } + else + { + waitAgain = internal != 0; + Sleep (5); + } + + CloseHandle (over.hEvent); + } + + return bytesRead; +} + +int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) +{ + int bytesWritten = -1; + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + + if (intern != 0 && intern->connect (timeOutMilliseconds)) + { + if (numBytesToWrite <= 0) + return 0; + + OVERLAPPED over; + zerostruct (over); + + over.hEvent = CreateEvent (0, TRUE, FALSE, 0); + + unsigned long numWritten; + + if (WriteFile (intern->pipeH, sourceBuffer, numBytesToWrite, &numWritten, &over)) + { + bytesWritten = (int) numWritten; + } + else if (GetLastError() == ERROR_IO_PENDING) + { + HANDLE handles[] = { over.hEvent, intern->cancelEvent }; + + if (WaitForMultipleObjects (2, handles, FALSE, timeOutMilliseconds >= 0 ? timeOutMilliseconds + : INFINITE) == WAIT_OBJECT_0) + { + if (GetOverlappedResult (intern->pipeH, &over, &numWritten, FALSE)) + { + bytesWritten = (int) numWritten; + } + else if (GetLastError() == ERROR_BROKEN_PIPE && intern->createdPipe) + { + intern->disconnect(); + } + } + } + + CloseHandle (over.hEvent); + } + + return bytesWritten; +} + +void NamedPipe::cancelPendingReads() +{ + NamedPipeInternal* const intern = (NamedPipeInternal*) internal; + + if (intern != 0) + SetEvent (intern->cancelEvent); +} + + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Fonts.cpp b/build/win32/platform_specific_code/juce_win32_Fonts.cpp new file mode 100644 index 0000000000..6461ebcb3c --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Fonts.cpp @@ -0,0 +1,662 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/gui/graphics/fonts/juce_Font.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_appframework/gui/graphics/imaging/juce_Image.h" + + +//============================================================================== +UNICODE_FUNCTION (GetGlyphOutlineW, DWORD, (HDC, UINT, UINT, LPGLYPHMETRICS, DWORD, LPVOID, CONST MAT2*)) +UNICODE_FUNCTION (GetTextMetricsW, BOOL, (HDC, LPTEXTMETRICW)) +UNICODE_FUNCTION (GetKerningPairsW, DWORD, (HDC, DWORD, LPKERNINGPAIR)) +UNICODE_FUNCTION (EnumFontFamiliesExW, int, (HDC, LPLOGFONTW, FONTENUMPROCW, LPARAM, DWORD)) +UNICODE_FUNCTION (CreateFontIndirectW, HFONT, (CONST LOGFONTW *)); + +static void juce_initialiseUnicodeFileFontFunctions() +{ + static bool initialised = false; + + if (! initialised) + { + initialised = true; + + if ((SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0) + { + HMODULE h = LoadLibraryA ("gdi32.dll"); + UNICODE_FUNCTION_LOAD (GetGlyphOutlineW) + UNICODE_FUNCTION_LOAD (GetTextMetricsW) + UNICODE_FUNCTION_LOAD (GetKerningPairsW) + UNICODE_FUNCTION_LOAD (EnumFontFamiliesExW) + UNICODE_FUNCTION_LOAD (CreateFontIndirectW) + } + } +} + + +//============================================================================== +static int CALLBACK fontEnum2 (ENUMLOGFONTEX* lpelfe, + NEWTEXTMETRICEX*, + int type, + LPARAM lParam) +{ + if (lpelfe != 0 && type == TRUETYPE_FONTTYPE) + { + const String fontName (lpelfe->elfLogFont.lfFaceName); + + ((StringArray*) lParam)->addIfNotAlreadyThere (fontName.removeCharacters (T("@"))); + } + + return 1; +} + +static int CALLBACK wfontEnum2 (ENUMLOGFONTEXW* lpelfe, + NEWTEXTMETRICEXW*, + int type, + LPARAM lParam) +{ + if (lpelfe != 0 && type == TRUETYPE_FONTTYPE) + { + const String fontName (lpelfe->elfLogFont.lfFaceName); + + ((StringArray*) lParam)->addIfNotAlreadyThere (fontName.removeCharacters (T("@"))); + } + + return 1; +} + +static int CALLBACK fontEnum1 (ENUMLOGFONTEX* lpelfe, + NEWTEXTMETRICEX*, + int type, + LPARAM lParam) +{ + if (lpelfe != 0 + && ((type & (DEVICE_FONTTYPE | RASTER_FONTTYPE)) == 0)) + { + LOGFONT lf; + zerostruct (lf); + + lf.lfWeight = FW_DONTCARE; + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfPitchAndFamily = FF_DONTCARE; + + const String fontName (lpelfe->elfLogFont.lfFaceName); + fontName.copyToBuffer (lf.lfFaceName, LF_FACESIZE - 1); + + HDC dc = CreateCompatibleDC (0); + EnumFontFamiliesEx (dc, &lf, + (FONTENUMPROC) &fontEnum2, + lParam, 0); + DeleteDC (dc); + } + + return 1; +} + +static int CALLBACK wfontEnum1 (ENUMLOGFONTEXW* lpelfe, + NEWTEXTMETRICEXW*, + int type, + LPARAM lParam) +{ + if (lpelfe != 0 + && ((type & (DEVICE_FONTTYPE | RASTER_FONTTYPE)) == 0)) + { + LOGFONTW lf; + zerostruct (lf); + + lf.lfWeight = FW_DONTCARE; + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfPitchAndFamily = FF_DONTCARE; + + const String fontName (lpelfe->elfLogFont.lfFaceName); + fontName.copyToBuffer (lf.lfFaceName, LF_FACESIZE - 1); + + HDC dc = CreateCompatibleDC (0); + wEnumFontFamiliesExW (dc, &lf, + (FONTENUMPROCW) &wfontEnum2, + lParam, 0); + DeleteDC (dc); + } + + return 1; +} + +const StringArray Font::findAllTypefaceNames() +{ + StringArray results; + HDC dc = CreateCompatibleDC (0); + + if (wEnumFontFamiliesExW != 0) + { + LOGFONTW lf; + zerostruct (lf); + + lf.lfWeight = FW_DONTCARE; + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfPitchAndFamily = FF_DONTCARE; + lf.lfFaceName[0] = 0; + + wEnumFontFamiliesExW (dc, &lf, + (FONTENUMPROCW) &wfontEnum1, + (LPARAM) &results, 0); + } + else + { + LOGFONT lf; + zerostruct (lf); + + lf.lfWeight = FW_DONTCARE; + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfPitchAndFamily = FF_DONTCARE; + lf.lfFaceName[0] = 0; + + EnumFontFamiliesEx (dc, &lf, + (FONTENUMPROC) &fontEnum1, + (LPARAM) &results, 0); + } + + DeleteDC (dc); + + results.sort (true); + return results; +} + +void Font::getDefaultFontNames (String& defaultSans, + String& defaultSerif, + String& defaultFixed) +{ + defaultSans = T("Verdana"); + defaultSerif = T("Times"); + defaultFixed = T("Lucida Console"); +} + +//============================================================================== +class FontDCHolder : private DeletedAtShutdown +{ + HDC dc; + String fontName; + KERNINGPAIR* kps; + int numKPs; + bool bold, italic; + int size; + + FontDCHolder (const FontDCHolder&); + const FontDCHolder& operator= (const FontDCHolder&); + +public: + HFONT fontH; + + //============================================================================== + FontDCHolder() throw() + : dc (0), + kps (0), + numKPs (0), + bold (false), + italic (false), + size (0) + { + juce_initialiseUnicodeFileFontFunctions(); + } + + ~FontDCHolder() throw() + { + if (dc != 0) + { + DeleteDC (dc); + DeleteObject (fontH); + + if (kps) + juce_free (kps); + } + } + + static FontDCHolder* getInstance() throw() + { + static FontDCHolder* instance = 0; + + if (instance == 0) + instance = new FontDCHolder(); + + return instance; + } + + //============================================================================== + HDC loadFont (const String& fontName_, + const bool bold_, + const bool italic_, + const int size_) throw() + { + if (fontName != fontName_ || bold != bold_ || italic != italic_ || size != size_) + { + fontName = fontName_; + bold = bold_; + italic = italic_; + size = size_; + + if (dc != 0) + { + DeleteDC (dc); + DeleteObject (fontH); + + if (kps != 0) + { + juce_free (kps); + kps = 0; + } + } + + fontH = 0; + + dc = CreateCompatibleDC (0); + SetMapperFlags (dc, 0); + SetMapMode (dc, MM_TEXT); + + LOGFONT lf; + LOGFONTW lfw; + HFONT standardSizedFont = 0; + + if (wCreateFontIndirectW != 0) + { + zerostruct (lfw); + + lfw.lfCharSet = DEFAULT_CHARSET; + lfw.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lfw.lfOutPrecision = OUT_OUTLINE_PRECIS; + lfw.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; + lfw.lfQuality = PROOF_QUALITY; + lfw.lfItalic = (BYTE) (italic ? TRUE : FALSE); + lfw.lfWeight = bold ? FW_BOLD : FW_NORMAL; + fontName.copyToBuffer (lfw.lfFaceName, LF_FACESIZE - 1); + + lfw.lfHeight = size > 0 ? size : -256; + standardSizedFont = wCreateFontIndirectW (&lfw); + } + else + { + zerostruct (lf); + + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfOutPrecision = OUT_OUTLINE_PRECIS; + lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; + lf.lfQuality = PROOF_QUALITY; + lf.lfItalic = (BYTE) (italic ? TRUE : FALSE); + lf.lfWeight = bold ? FW_BOLD : FW_NORMAL; + fontName.copyToBuffer (lf.lfFaceName, LF_FACESIZE - 1); + + lf.lfHeight = size > 0 ? size : -256; + standardSizedFont = CreateFontIndirect (&lf); + } + + if (standardSizedFont != 0) + { + if (SelectObject (dc, standardSizedFont) != 0) + { + fontH = standardSizedFont; + + if (size == 0) + { + OUTLINETEXTMETRIC otm; + if (GetOutlineTextMetrics (dc, sizeof (otm), &otm) != 0) + { + if (wCreateFontIndirectW != 0) + { + lfw.lfHeight = -(int) otm.otmEMSquare; + fontH = wCreateFontIndirectW (&lfw); + } + else + { + lf.lfHeight = -(int) otm.otmEMSquare; + fontH = CreateFontIndirect (&lf); + } + + SelectObject (dc, fontH); + DeleteObject (standardSizedFont); + } + } + } + else + { + jassertfalse + } + } + else + { + jassertfalse + } + } + + return dc; + } + + //============================================================================== + KERNINGPAIR* getKerningPairs (int& numKPs_) throw() + { + if (kps == 0) + { + if (wGetKerningPairsW != 0) + { + numKPs = wGetKerningPairsW (dc, 0, 0); + kps = (KERNINGPAIR*) juce_calloc (sizeof (KERNINGPAIR) * numKPs); + wGetKerningPairsW (dc, numKPs, kps); + } + else + { + numKPs = GetKerningPairs (dc, 0, 0); + kps = (KERNINGPAIR*) juce_calloc (sizeof (KERNINGPAIR) * numKPs); + GetKerningPairs (dc, numKPs, kps); + } + } + + numKPs_ = numKPs; + return kps; + } +}; + + +//============================================================================== +static MAT2 identityMatrix; + +static void addGlyphToTypeface (HDC dc, + juce_wchar character, + Typeface& dest, + bool addKerning) +{ + Path destShape; + GLYPHMETRICS gm; + + float height; + BOOL ok = false; + + if (wGetTextMetricsW != 0) + { + TEXTMETRICW tm; + ok = wGetTextMetricsW (dc, &tm); + + height = (float) tm.tmHeight; + } + else + { + TEXTMETRIC tm; + ok = GetTextMetrics (dc, &tm); + + height = (float) tm.tmHeight; + } + + if (! ok) + { + dest.addGlyph (character, destShape, 0); + return; + } + + const float scaleX = 1.0f / height; + const float scaleY = -1.0f / height; + + int bufSize; + + if (wGetGlyphOutlineW != 0) + bufSize = wGetGlyphOutlineW (dc, character, GGO_NATIVE, + &gm, 0, 0, &identityMatrix); + else + bufSize = GetGlyphOutline (dc, character, GGO_NATIVE, + &gm, 0, 0, &identityMatrix); + + if (bufSize > 0) + { + char* const data = (char*) juce_malloc (bufSize); + + if (wGetGlyphOutlineW != 0) + wGetGlyphOutlineW (dc, character, GGO_NATIVE, &gm, + bufSize, data, &identityMatrix); + else + GetGlyphOutline (dc, character, GGO_NATIVE, &gm, + bufSize, data, &identityMatrix); + + const TTPOLYGONHEADER* pheader = (TTPOLYGONHEADER*) data; + + while ((char*) pheader < data + bufSize) + { + #define remapX(v) (scaleX * (v).x.value) + #define remapY(v) (scaleY * (v).y.value) + + float x = remapX (pheader->pfxStart); + float y = remapY (pheader->pfxStart); + + destShape.startNewSubPath (x, y); + + const TTPOLYCURVE* curve = (const TTPOLYCURVE*) ((const char*) pheader + sizeof (TTPOLYGONHEADER)); + const char* const curveEnd = ((const char*) pheader) + pheader->cb; + + while ((const char*) curve < curveEnd) + { + if (curve->wType == TT_PRIM_LINE) + { + for (int i = 0; i < curve->cpfx; ++i) + { + x = remapX (curve->apfx [i]); + y = remapY (curve->apfx [i]); + + destShape.lineTo (x, y); + } + } + else if (curve->wType == TT_PRIM_QSPLINE) + { + for (int i = 0; i < curve->cpfx - 1; ++i) + { + const float x2 = remapX (curve->apfx [i]); + const float y2 = remapY (curve->apfx [i]); + float x3, y3; + + if (i < curve->cpfx - 2) + { + x3 = 0.5f * (x2 + remapX (curve->apfx [i + 1])); + y3 = 0.5f * (y2 + remapY (curve->apfx [i + 1])); + } + else + { + x3 = remapX (curve->apfx [i + 1]); + y3 = remapY (curve->apfx [i + 1]); + } + + destShape.quadraticTo (x2, y2, x3, y3); + + x = x3; + y = y3; + } + } + + curve = (const TTPOLYCURVE*) &(curve->apfx [curve->cpfx]); + } + + pheader = (const TTPOLYGONHEADER*) curve; + + destShape.closeSubPath(); + } + + juce_free (data); + } + + dest.addGlyph (character, destShape, gm.gmCellIncX / height); + + if (addKerning) + { + int numKPs; + const KERNINGPAIR* const kps = FontDCHolder::getInstance()->getKerningPairs (numKPs); + + for (int i = 0; i < numKPs; ++i) + { + if (kps[i].wFirst == character) + { + dest.addKerningPair (kps[i].wFirst, + kps[i].wSecond, + kps[i].iKernAmount / height); + } + } + } +} + +//============================================================================== +void Typeface::findAndAddSystemGlyph (juce_wchar character) +{ + HDC dc = FontDCHolder::getInstance()->loadFont (getName(), isBold(), isItalic(), 0); + addGlyphToTypeface (dc, character, *this, true); +} + +/*Image* Typeface::renderGlyphToImage (juce_wchar character, float& topLeftX, float& topLeftY) +{ + HDC dc = FontDCHolder::getInstance()->loadFont (getName(), isBold(), isItalic(), hintingSize); + + int bufSize; + GLYPHMETRICS gm; + + const UINT format = GGO_GRAY2_BITMAP; + const int shift = 6; + + if (wGetGlyphOutlineW != 0) + bufSize = wGetGlyphOutlineW (dc, character, format, &gm, 0, 0, &identityMatrix); + else + bufSize = GetGlyphOutline (dc, character, format, &gm, 0, 0, &identityMatrix); + + Image* im = new Image (Image::SingleChannel, jmax (1, gm.gmBlackBoxX), jmax (1, gm.gmBlackBoxY), true); + + if (bufSize > 0) + { + topLeftX = (float) gm.gmptGlyphOrigin.x; + topLeftY = (float) -gm.gmptGlyphOrigin.y; + + uint8* const data = (uint8*) juce_calloc (bufSize); + + if (wGetGlyphOutlineW != 0) + wGetGlyphOutlineW (dc, character, format, &gm, bufSize, data, &identityMatrix); + else + GetGlyphOutline (dc, character, format, &gm, bufSize, data, &identityMatrix); + + const int stride = ((gm.gmBlackBoxX + 3) & ~3); + + for (int y = gm.gmBlackBoxY; --y >= 0;) + { + for (int x = gm.gmBlackBoxX; --x >= 0;) + { + const int level = data [x + y * stride] << shift; + + if (level > 0) + im->setPixelAt (x, y, Colour ((uint8) 0xff, (uint8) 0xff, (uint8) 0xff, (uint8) jmin (0xff, level))); + } + } + + juce_free (data); + } + + return im; +}*/ + +//============================================================================== +void Typeface::initialiseTypefaceCharacteristics (const String& fontName, + bool bold, + bool italic, + bool addAllGlyphsToFont) +{ + zerostruct (identityMatrix); + identityMatrix.eM11.value = 1; + identityMatrix.eM22.value = 1; + + clear(); + + HDC dc = FontDCHolder::getInstance()->loadFont (fontName, bold, italic, 0); + + float height; + int firstChar, lastChar; + + if (wGetTextMetricsW != 0) + { + TEXTMETRICW tm; + wGetTextMetricsW (dc, &tm); + + height = (float) tm.tmHeight; + firstChar = tm.tmFirstChar; + lastChar = tm.tmLastChar; + + setAscent (tm.tmAscent / height); + setDefaultCharacter (tm.tmDefaultChar); + } + else + { + TEXTMETRIC tm; + GetTextMetrics (dc, &tm); + + height = (float) tm.tmHeight; + firstChar = tm.tmFirstChar; + lastChar = tm.tmLastChar; + + setAscent (tm.tmAscent / height); + setDefaultCharacter (tm.tmDefaultChar); + } + + setName (fontName); + setBold (bold); + setItalic (italic); + + if (addAllGlyphsToFont) + { + for (int character = firstChar; character <= lastChar; ++character) + addGlyphToTypeface (dc, (juce_wchar) character, *this, false); + + int numKPs; + const KERNINGPAIR* const kps = FontDCHolder::getInstance()->getKerningPairs (numKPs); + + for (int i = 0; i < numKPs; ++i) + { + addKerningPair (kps[i].wFirst, + kps[i].wSecond, + kps[i].iKernAmount / height); + } + } +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Messaging.cpp b/build/win32/platform_specific_code/juce_win32_Messaging.cpp new file mode 100644 index 0000000000..1a972354e1 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Messaging.cpp @@ -0,0 +1,247 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_appframework/application/juce_Application.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_core/basics/juce_Time.h" + + +//============================================================================== +static const unsigned int specialId = WM_APP + 0x4400; +static const unsigned int broadcastId = WM_APP + 0x4403; +static const unsigned int specialCallbackId = WM_APP + 0x4402; + +static const TCHAR* const messageWindowName = _T("JUCEWindow"); + +HWND juce_messageWindowHandle = 0; + +extern long improbableWindowNumber; // defined in windowing.cpp + + +//============================================================================== +static LRESULT CALLBACK juce_MessageWndProc (HWND h, + UINT message, + WPARAM wParam, + LPARAM lParam) throw() +{ + JUCE_TRY + { + if (h == juce_messageWindowHandle) + { + if (message == specialCallbackId) + { + MessageCallbackFunction* const func = (MessageCallbackFunction*) wParam; + return (LRESULT) (*func) ((void*) lParam); + } + else if (message == specialId) + { + // these are trapped early in the dispatch call, but must also be checked + // here in case there are windows modal dialog boxes doing their own + // dispatch loop and not calling our version + + MessageManager::getInstance()->deliverMessage ((void*) lParam); + return 0; + } + else if (message == broadcastId) + { + String* const messageString = (String*) lParam; + MessageManager::getInstance()->deliverBroadcastMessage (*messageString); + delete messageString; + return 0; + } + else if (message == WM_COPYDATA && ((const COPYDATASTRUCT*) lParam)->dwData == broadcastId) + { + const String messageString ((const juce_wchar*) ((const COPYDATASTRUCT*) lParam)->lpData, + ((const COPYDATASTRUCT*) lParam)->cbData / sizeof (juce_wchar)); + + PostMessage (juce_messageWindowHandle, broadcastId, 0, (LPARAM) new String (messageString)); + return 0; + } + } + + return DefWindowProc (h, message, wParam, lParam); + } + JUCE_CATCH_EXCEPTION + + return 0; +} + +bool juce_dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) +{ + MSG m; + + if (returnIfNoPendingMessages && ! PeekMessage (&m, (HWND) 0, 0, 0, 0)) + return false; + + if (GetMessage (&m, (HWND) 0, 0, 0) > 0) + { + if (m.message == specialId + && m.hwnd == juce_messageWindowHandle) + { + MessageManager::getInstance()->deliverMessage ((void*) m.lParam); + } + else + { + if (GetWindowLong (m.hwnd, GWLP_USERDATA) != improbableWindowNumber + && (m.message == WM_LBUTTONDOWN || m.message == WM_RBUTTONDOWN)) + { + // if it's someone else's window being clicked on, and the focus is + // currently on a juce window, pass the kb focus over.. + HWND currentFocus = GetFocus(); + + if (currentFocus == 0 || GetWindowLong (currentFocus, GWLP_USERDATA) == improbableWindowNumber) + SetFocus (m.hwnd); + } + + TranslateMessage (&m); + DispatchMessage (&m); + } + } + + return true; +} + +//============================================================================== +bool juce_postMessageToSystemQueue (void* message) +{ + return PostMessage (juce_messageWindowHandle, specialId, 0, (LPARAM) message) != 0; +} + +//============================================================================== +void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, + void* userData) +{ + if (MessageManager::getInstance()->isThisTheMessageThread()) + return (*callback) (userData); + else + return (void*) SendMessage (juce_messageWindowHandle, + specialCallbackId, + (WPARAM) callback, + (LPARAM) userData); +} + +//============================================================================== +static BOOL CALLBACK BroadcastEnumWindowProc (HWND hwnd, LPARAM lParam) +{ + if (hwnd != juce_messageWindowHandle) + (reinterpret_cast (lParam))->add ((void*) hwnd); + + return TRUE; +} + +void MessageManager::broadcastMessage (const String& value) +{ + VoidArray windows; + EnumWindows (&BroadcastEnumWindowProc, (LPARAM) &windows); + + const String localCopy (value); + + COPYDATASTRUCT data; + data.dwData = broadcastId; + data.cbData = (localCopy.length() + 1) * sizeof (juce_wchar); + data.lpData = (void*) (const juce_wchar*) localCopy; + + for (int i = windows.size(); --i >= 0;) + { + HWND hwnd = (HWND) windows.getUnchecked(i); + + TCHAR windowName [64]; // no need to read longer strings than this + GetWindowText (hwnd, windowName, 64); + windowName [63] = 0; + + if (String (windowName) == String (messageWindowName)) + { + DWORD_PTR result; + SendMessageTimeout (hwnd, WM_COPYDATA, + (WPARAM) juce_messageWindowHandle, + (LPARAM) &data, + SMTO_BLOCK | SMTO_ABORTIFHUNG, + 8000, + &result); + } + } +} + +//============================================================================== +static const String getMessageWindowClassName() +{ + // this name has to be different for each app/dll instance because otherwise + // poor old Win32 can get a bit confused (even despite it not being a process-global + // window class). + + static int number = 0; + if (number == 0) + number = 0x7fffffff & (int) Time::getHighResolutionTicks(); + + return T("JUCEWindowClass_") + String (number); +} + +void MessageManager::doPlatformSpecificInitialisation() +{ + OleInitialize (0); + + const String className (getMessageWindowClassName()); + + HMODULE hmod = (HMODULE) PlatformUtilities::getCurrentModuleInstanceHandle(); + + WNDCLASSEX wc; + zerostruct (wc); + + wc.cbSize = sizeof (wc); + wc.lpfnWndProc = (WNDPROC) juce_MessageWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 4; + wc.hInstance = hmod; + wc.lpszClassName = className; + + RegisterClassEx (&wc); + + juce_messageWindowHandle = CreateWindow (wc.lpszClassName, + messageWindowName, + 0, 0, 0, 0, 0, 0, 0, + hmod, 0); +} + +void MessageManager::doPlatformSpecificShutdown() +{ + DestroyWindow (juce_messageWindowHandle); + UnregisterClass (getMessageWindowClassName(), 0); + OleUninitialize(); +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Midi.cpp b/build/win32/platform_specific_code/juce_win32_Midi.cpp new file mode 100644 index 0000000000..ad0291962c --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Midi.cpp @@ -0,0 +1,656 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_appframework/audio/devices/juce_MidiOutput.h" +#include "../../../src/juce_appframework/audio/devices/juce_MidiInput.h" +#include "../../../src/juce_core/basics/juce_Time.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/containers/juce_MemoryBlock.h" + +#ifdef JUCE_MSVC + #pragma warning (disable: 4312) +#endif + +//============================================================================== +static const int midiBufferSize = 1024 * 10; +static const int numInHeaders = 32; +static const int inBufferSize = 128; + +class MidiInThread : public Thread +{ +public: + //============================================================================== + MidiInThread (MidiInput* const input_, + MidiInputCallback* const callback_) + : Thread (T("Juce Midi")), + hIn (0), + input (input_), + callback (callback_), + isStarted (false), + startTime (0), + pendingLength(0) + { + for (int i = numInHeaders; --i >= 0;) + { + zeromem (&hdr[i], sizeof (MIDIHDR)); + hdr[i].lpData = inData[i]; + hdr[i].dwBufferLength = inBufferSize; + } + }; + + ~MidiInThread() + { + stop(); + + if (hIn != 0) + { + int count = 5; + while (--count >= 0) + { + if (midiInClose (hIn) == MMSYSERR_NOERROR) + break; + + Sleep (20); + } + } + } + + //============================================================================== + void handle (const uint32 message, const uint32 timeStamp) + { + jassert (validityInt == 0x12345678); + if (validityInt != 0x12345678) + return; + + const int byte = message & 0xff; + if (byte < 0x80) + return; + + static const char extraDataLengths[] = { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + const int numBytes = extraDataLengths [byte - 0x80] + 1; + + const double time = timeStampToTime (timeStamp); + + lock.enter(); + if (pendingLength < midiBufferSize - 12) + { + char* const p = pending + pendingLength; + *(double*) p = time; + *(uint32*) (p + 8) = numBytes; + *(uint32*) (p + 12) = message; + pendingLength += 12 + numBytes; + } + else + { + jassertfalse // midi buffer overflow! You might need to increase the size.. + } + + lock.exit(); + notify(); + } + + void handleSysEx (MIDIHDR* hdr, const uint32 timeStamp) + { + jassert (validityInt == 0x12345678); + if (validityInt != 0x12345678) + return; + + const int num = hdr->dwBytesRecorded; + + if (num > 0) + { + const double time = timeStampToTime (timeStamp); + + lock.enter(); + + if (pendingLength < midiBufferSize - (8 + num)) + { + char* const p = pending + pendingLength; + *(double*) p = time; + *(uint32*) (p + 8) = num; + memcpy (p + 12, hdr->lpData, num); + pendingLength += 12 + num; + } + else + { + jassertfalse // midi buffer overflow! You might need to increase the size.. + } + + lock.exit(); + notify(); + } + } + + void writeBlock (int i) + { + hdr[i].dwBytesRecorded = 0; + MMRESULT res = midiInPrepareHeader (hIn, &hdr[i], sizeof (MIDIHDR)); + jassert (res == MMSYSERR_NOERROR); + res = midiInAddBuffer (hIn, &hdr[i], sizeof (MIDIHDR)); + jassert (res == MMSYSERR_NOERROR); + } + + void run() + { + MemoryBlock pendingCopy (64); + + while (! threadShouldExit()) + { + for (int i = 0; i < numInHeaders; ++i) + { + if ((hdr[i].dwFlags & WHDR_DONE) != 0) + { + MMRESULT res = midiInUnprepareHeader (hIn, &hdr[i], sizeof (MIDIHDR)); + (void) res; + jassert (res == MMSYSERR_NOERROR); + writeBlock (i); + } + } + + lock.enter(); + + int len = pendingLength; + + if (len > 0) + { + pendingCopy.ensureSize (len); + pendingCopy.copyFrom (pending, 0, len); + pendingLength = 0; + } + + lock.exit(); + + if (len == 0) + { + wait (500); + } + else + { + const char* p = (const char*) pendingCopy.getData(); + + while (len > 0) + { + const double time = *(const double*) p; + const int messageLen = *(const int*) (p + 8); + + const MidiMessage message ((const uint8*) (p + 12), messageLen, time); + + callback->handleIncomingMidiMessage (input, message); + + p += 12 + messageLen; + len -= 12 + messageLen; + } + } + } + } + + void start() + { + jassert (hIn != 0); + if (hIn != 0 && ! isStarted) + { + stop(); + + validityInt = 0x12345678; + + int i; + for (i = 0; i < numInHeaders; ++i) + writeBlock (i); + + startTime = Time::getMillisecondCounter(); + MMRESULT res = midiInStart (hIn); + + jassert (res == MMSYSERR_NOERROR); + + if (res == MMSYSERR_NOERROR) + { + isStarted = true; + pendingLength = 0; + startThread (6); + } + } + } + + void stop() + { + if (isStarted) + { + stopThread (5000); + + midiInReset (hIn); + midiInStop (hIn); + + for (int i = numInHeaders; --i >= 0;) + { + if ((hdr[i].dwFlags & WHDR_DONE) != 0) + { + int c = 10; + while (--c >= 0 && midiInUnprepareHeader (hIn, &hdr[i], sizeof (MIDIHDR)) == MIDIERR_STILLPLAYING) + Sleep (20); + + jassert (c >= 0); + } + } + + isStarted = false; + validityInt = 0; + } + } + + juce_UseDebuggingNewOperator + + HMIDIIN hIn; + +private: + int validityInt; + MidiInput* input; + MidiInputCallback* callback; + bool isStarted; + uint32 startTime; + CriticalSection lock; + + MIDIHDR hdr [numInHeaders]; + char inData [numInHeaders] [inBufferSize]; + + int pendingLength; + char pending [midiBufferSize]; + + double timeStampToTime (uint32 timeStamp) + { + timeStamp += startTime; + + const uint32 now = Time::getMillisecondCounter(); + if (timeStamp > now) + { + if (timeStamp > now + 2) + --startTime; + + timeStamp = now; + } + + return 0.001 * timeStamp; + } + + MidiInThread (const MidiInThread&); + const MidiInThread& operator= (const MidiInThread&); +}; + +static void CALLBACK midiInCallback (HMIDIIN, + UINT uMsg, + DWORD dwInstance, + DWORD midiMessage, + DWORD timeStamp) +{ + MidiInThread* const thread = (MidiInThread*) dwInstance; + + if (thread != 0) + { + if (uMsg == MIM_DATA) + thread->handle (midiMessage, timeStamp); + else if (uMsg == MIM_LONGDATA) + thread->handleSysEx ((MIDIHDR*) midiMessage, timeStamp); + } +} + +//============================================================================== +const StringArray MidiInput::getDevices() +{ + StringArray s; + const int num = midiInGetNumDevs(); + + for (int i = 0; i < num; ++i) + { + MIDIINCAPSW mc; + zerostruct (mc); + + if (midiInGetDevCapsW (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + s.add (String (mc.szPname, sizeof (mc.szPname))); + } + + return s; +} + +int MidiInput::getDefaultDeviceIndex() +{ + return 0; +} + +MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) +{ + if (callback == 0) + return 0; + + UINT deviceId = MIDI_MAPPER; + int n = 0; + + const int num = midiInGetNumDevs(); + + for (int i = 0; i < num; ++i) + { + MIDIINCAPSW mc; + zerostruct (mc); + + if (midiInGetDevCapsW (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + { + if (index == n) + { + deviceId = i; + break; + } + + ++n; + } + } + + MidiInput* const in = new MidiInput (getDevices() [index]); + MidiInThread* const thread = new MidiInThread (in, callback); + + HMIDIIN h; + HRESULT err = midiInOpen (&h, deviceId, + (DWORD_PTR) &midiInCallback, + (DWORD_PTR) thread, + CALLBACK_FUNCTION); + + if (err == MMSYSERR_NOERROR) + { + thread->hIn = h; + in->internal = (void*) thread; + return in; + } + else + { + delete in; + delete thread; + return 0; + } +} + +MidiInput::MidiInput (const String& name_) + : name (name_), + internal (0) +{ +} + +MidiInput::~MidiInput() +{ + if (internal != 0) + { + MidiInThread* const thread = (MidiInThread*) internal; + delete thread; + } +} + +void MidiInput::start() +{ + ((MidiInThread*)internal)->start(); +} + +void MidiInput::stop() +{ + ((MidiInThread*)internal)->stop(); +} + + +//============================================================================== +struct MidiOutHandle +{ + int refCount; + UINT deviceId; + HMIDIOUT handle; + + juce_UseDebuggingNewOperator +}; + +static VoidArray handles (4); + +//============================================================================== +const StringArray MidiOutput::getDevices() +{ + StringArray s; + const int num = midiOutGetNumDevs(); + + for (int i = 0; i < num; ++i) + { + MIDIOUTCAPSW mc; + zerostruct (mc); + + if (midiOutGetDevCapsW (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + s.add (String (mc.szPname, sizeof (mc.szPname))); + } + + return s; +} + +int MidiOutput::getDefaultDeviceIndex() +{ + const int num = midiOutGetNumDevs(); + int n = 0; + + for (int i = 0; i < num; ++i) + { + MIDIOUTCAPSW mc; + zerostruct (mc); + + if (midiOutGetDevCapsW (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + { + if ((mc.wTechnology & MOD_MAPPER) != 0) + return n; + + ++n; + } + } + + return 0; +} + +MidiOutput* MidiOutput::openDevice (int index) +{ + UINT deviceId = MIDI_MAPPER; + const int num = midiOutGetNumDevs(); + int i, n = 0; + + for (i = 0; i < num; ++i) + { + MIDIOUTCAPSW mc; + zerostruct (mc); + + if (midiOutGetDevCapsW (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) + { + // use the microsoft sw synth as a default - best not to allow deviceId + // to be MIDI_MAPPER, or else device sharing breaks + if (String (mc.szPname, sizeof (mc.szPname)).containsIgnoreCase (T("microsoft"))) + deviceId = i; + + if (index == n) + { + deviceId = i; + break; + } + + ++n; + } + } + + for (i = handles.size(); --i >= 0;) + { + MidiOutHandle* const han = (MidiOutHandle*) handles[i]; + + if (han != 0 && han->deviceId == deviceId) + { + han->refCount++; + MidiOutput* out = new MidiOutput(); + out->internal = (void*)han; + return out; + } + } + + HMIDIOUT h = 0; + MMRESULT res = MMSYSERR_NOERROR + 1; + + for (i = 4; --i >= 0;) + { + UINT devId = deviceId; // copy because this call changes the value + res = midiOutOpen (&h, devId, 0, 0, CALLBACK_NULL); + if (res != MMSYSERR_ALLOCATED) + break; + + Sleep (100); + } + + if (res == MMSYSERR_NOERROR) + { + MidiOutHandle* const han = new MidiOutHandle(); + han->deviceId = deviceId; + han->refCount = 1; + han->handle = h; + handles.add (han); + + MidiOutput* const out = new MidiOutput(); + out->internal = (void*)han; + return out; + } + + return 0; +} + +MidiOutput::MidiOutput() +{ +} + +MidiOutput::~MidiOutput() +{ + MidiOutHandle* const h = (MidiOutHandle*) internal; + + if (handles.contains ((void*) h) && --(h->refCount) == 0) + { + midiOutClose (h->handle); + handles.removeValue ((void*)h); + handles.minimiseStorageOverheads(); + delete h; + } +} + +void MidiOutput::reset() +{ + const MidiOutHandle* const h = (MidiOutHandle*) internal; + midiOutReset (h->handle); +} + +bool MidiOutput::getVolume (float& leftVol, + float& rightVol) +{ + const MidiOutHandle* const handle = (const MidiOutHandle*) internal; + + DWORD n; + if (midiOutGetVolume (handle->handle, &n) == MMSYSERR_NOERROR) + { + const unsigned short* const nn = (const unsigned short*) &n; + rightVol = nn[0] / (float) 0xffff; + leftVol = nn[1] / (float) 0xffff; + return true; + } + else + { + rightVol = leftVol = 1.0f; + return false; + } +} + +void MidiOutput::setVolume (float leftVol, + float rightVol) +{ + const MidiOutHandle* const handle = (MidiOutHandle*)internal; + + DWORD n; + unsigned short* nn = (unsigned short*) &n; + nn[0] = (unsigned short) jlimit (0, 0xffff, (int)(rightVol * 0xffff)); + nn[1] = (unsigned short) jlimit (0, 0xffff, (int)(leftVol * 0xffff)); + midiOutSetVolume (handle->handle, n); +} + +void MidiOutput::sendMessageNow (const MidiMessage& message) +{ + const MidiOutHandle* const handle = (const MidiOutHandle*) internal; + + if (message.getRawDataSize() > 3) + { + MIDIHDR h; + zerostruct (h); + + h.lpData = (char*) message.getRawData(); + h.dwBufferLength = message.getRawDataSize(); + h.dwBytesRecorded = message.getRawDataSize(); + + if (midiOutPrepareHeader (handle->handle, &h, sizeof (MIDIHDR)) == MMSYSERR_NOERROR) + { + MMRESULT res = midiOutLongMsg (handle->handle, &h, sizeof (MIDIHDR)); + + if (res == MMSYSERR_NOERROR) + { + while ((h.dwFlags & MHDR_DONE) == 0) + Sleep (1); + + int count = 500; // 1 sec timeout + + while (--count >= 0) + { + res = midiOutUnprepareHeader (handle->handle, &h, sizeof (MIDIHDR)); + + if (res == MIDIERR_STILLPLAYING) + Sleep (2); + else + break; + } + } + } + } + else + { + midiOutShortMsg (handle->handle, + *(unsigned int*) message.getRawData()); + } +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Misc.cpp b/build/win32/platform_specific_code/juce_win32_Misc.cpp new file mode 100644 index 0000000000..52fee9d731 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Misc.cpp @@ -0,0 +1,120 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_appframework/application/juce_SystemClipboard.h" +#include "../../../src/juce_appframework/gui/components/windows/juce_AlertWindow.h" + + +//============================================================================== +bool AlertWindow::showNativeDialogBox (const String& title, + const String& bodyText, + bool isOkCancel) +{ + return MessageBox (0, bodyText, title, + (isOkCancel) ? MB_OKCANCEL + : MB_OK) == IDOK; +} + +//============================================================================== +void PlatformUtilities::beep() +{ + MessageBeep (MB_OK); +} + + +//============================================================================== +#ifdef JUCE_MSVC + #pragma warning (disable : 4127) // "Conditional expression is constant" warning +#endif + +void SystemClipboard::copyTextToClipboard (const String& text) +{ + if (OpenClipboard (0) != 0) + { + if (EmptyClipboard() != 0) + { + const int len = text.length(); + + if (len > 0) + { + HGLOBAL bufH = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE, + (len + 1) * sizeof (wchar_t)); + + if (bufH != 0) + { + wchar_t* const data = (wchar_t*) GlobalLock (bufH); + text.copyToBuffer (data, len); + GlobalUnlock (bufH); + + SetClipboardData (CF_UNICODETEXT, bufH); + } + } + } + + CloseClipboard(); + } +} + +const String SystemClipboard::getTextFromClipboard() +{ + String result; + + if (OpenClipboard (0) != 0) + { + HANDLE bufH = GetClipboardData (CF_UNICODETEXT); + + if (bufH != 0) + { + const wchar_t* const data = (const wchar_t*) GlobalLock (bufH); + + if (data != 0) + { + result = String (data, (int) (GlobalSize (bufH) / sizeof (tchar))); + + GlobalUnlock (bufH); + } + } + + CloseClipboard(); + } + + return result; +} + + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Network.cpp b/build/win32/platform_specific_code/juce_win32_Network.cpp new file mode 100644 index 0000000000..71def49067 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Network.cpp @@ -0,0 +1,339 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) +#endif + +#include "win32_headers.h" +#include +#include +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/text/juce_String.h" +#include "juce_win32_DynamicLibraryLoader.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/containers/juce_MemoryBlock.h" + +#ifndef INTERNET_FLAG_NEED_FILE + #define INTERNET_FLAG_NEED_FILE 0x00000010 +#endif + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + +//============================================================================== +bool juce_isOnLine() +{ + DWORD connectionType; + + return InternetGetConnectedState (&connectionType, 0) != 0 + || (connectionType & (INTERNET_CONNECTION_LAN | INTERNET_CONNECTION_PROXY)) != 0; +} + +struct ConnectionAndRequestStruct +{ + HINTERNET connection, request; +}; + +static HINTERNET sessionHandle = 0; + +void* juce_openInternetFile (const String& url, + const String& postText, + const bool isPost) +{ + if (sessionHandle == 0) + sessionHandle = InternetOpen (_T("juce"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); + + if (sessionHandle != 0) + { + // break up the url.. + TCHAR file[1024], server[1024]; + + URL_COMPONENTS uc; + zerostruct (uc); + + uc.dwStructSize = sizeof (uc); + uc.dwUrlPathLength = sizeof (file); + uc.dwHostNameLength = sizeof (server); + uc.lpszUrlPath = file; + uc.lpszHostName = server; + + if (InternetCrackUrl (url, 0, + ICU_ESCAPE | ICU_DECODE, + &uc)) + { + const bool isFtp = url.startsWithIgnoreCase (T("ftp:")); + + HINTERNET connection = InternetConnect (sessionHandle, + uc.lpszHostName, + uc.nPort, + _T(""), _T(""), + (isFtp) ? INTERNET_SERVICE_FTP + : INTERNET_SERVICE_HTTP, + 0, 0); + + if (connection != 0) + { + if (isFtp) + { + HINTERNET request = FtpOpenFile (connection, + uc.lpszUrlPath, + GENERIC_READ, + FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_NEED_FILE, + 0); + + ConnectionAndRequestStruct* const result = new ConnectionAndRequestStruct(); + result->connection = connection; + result->request = request; + return result; + } + else + { + const TCHAR* mimeTypes[] = { _T("*"), 0 }; + + HINTERNET request = HttpOpenRequest (connection, + isPost ? _T("POST") + : _T("GET"), + uc.lpszUrlPath, + 0, 0, + mimeTypes, + INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE, 0); + + if (request != 0) + { + // (this header is needed to make webservers process a POST request correctly) + const String hdr (T("Content-Type: application/x-www-form-urlencoded")); + + if (HttpSendRequest (request, + hdr, hdr.length(), + (void*)(const char*) postText, + postText.length())) + { + ConnectionAndRequestStruct* const result = new ConnectionAndRequestStruct(); + result->connection = connection; + result->request = request; + return result; + } + + InternetCloseHandle (request); + } + + InternetCloseHandle (connection); + } + } + } + } + + return 0; +} + +int juce_readFromInternetFile (void* handle, void* buffer, int bytesToRead) +{ + DWORD bytesRead = 0; + + const ConnectionAndRequestStruct* const crs = (const ConnectionAndRequestStruct*) handle; + + if (crs != 0) + InternetReadFile (crs->request, + buffer, bytesToRead, + &bytesRead); + + return bytesRead; +} + +int juce_seekInInternetFile (void* handle, int newPosition) +{ + if (handle != 0) + { + const ConnectionAndRequestStruct* const crs = (const ConnectionAndRequestStruct*) handle; + + return InternetSetFilePointer (crs->request, + newPosition, 0, + FILE_BEGIN, 0); + } + else + { + return -1; + } +} + +int juce_getStatusCodeFor (void* handle) +{ + DWORD result = 404; + const ConnectionAndRequestStruct* const crs = (const ConnectionAndRequestStruct*) handle; + + if (crs != 0) + { + DWORD index = 0; + DWORD size = sizeof (result); + + HttpQueryInfo (crs->request, + HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, + &result, + &size, + &index); + } + + return (int) result; +} + +void juce_closeInternetFile (void* handle) +{ + if (handle != 0) + { + ConnectionAndRequestStruct* const crs = (ConnectionAndRequestStruct*) handle; + InternetCloseHandle (crs->request); + InternetCloseHandle (crs->connection); + delete crs; + } +} + +static int getMACAddressViaGetAdaptersInfo (int64* addresses, int maxNum) +{ + int numFound = 0; + + DynamicLibraryLoader dll (T("iphlpapi.dll")); + DynamicLibraryImport (GetAdaptersInfo, getAdaptersInfo, DWORD, dll, (PIP_ADAPTER_INFO, PULONG)) + + if (getAdaptersInfo != 0) + { + ULONG len = sizeof (IP_ADAPTER_INFO); + MemoryBlock mb; + PIP_ADAPTER_INFO adapterInfo = (PIP_ADAPTER_INFO) mb.getData(); + + if (getAdaptersInfo (adapterInfo, &len) == ERROR_BUFFER_OVERFLOW) + { + mb.setSize (len); + adapterInfo = (PIP_ADAPTER_INFO) mb.getData(); + } + + if (getAdaptersInfo (adapterInfo, &len) == NO_ERROR) + { + PIP_ADAPTER_INFO adapter = adapterInfo; + + while (adapter != 0) + { + int64 mac = 0; + for (unsigned int i = 0; i < adapter->AddressLength; ++i) + mac = (mac << 8) | adapter->Address[i]; + + if (numFound < maxNum && mac != 0) + addresses [numFound++] = mac; + + adapter = adapter->Next; + } + } + } + + return numFound; +} + +static int getMACAddressesViaNetBios (int64* addresses, int maxNum) +{ + int numFound = 0; + + DynamicLibraryLoader dll (T("netapi32.dll")); + DynamicLibraryImport (Netbios, NetbiosCall, UCHAR, dll, (PNCB)) + + if (NetbiosCall != 0) + { + NCB ncb; + zerostruct (ncb); + + typedef struct _ASTAT_ + { + ADAPTER_STATUS adapt; + NAME_BUFFER NameBuff [30]; + } ASTAT; + + ASTAT astat; + zerostruct (astat); + + LANA_ENUM enums; + zerostruct (enums); + + ncb.ncb_command = NCBENUM; + ncb.ncb_buffer = (unsigned char*) &enums; + ncb.ncb_length = sizeof (LANA_ENUM); + NetbiosCall (&ncb); + + for (int i = 0; i < enums.length; ++i) + { + zerostruct (ncb); + ncb.ncb_command = NCBRESET; + ncb.ncb_lana_num = enums.lana[i]; + + if (NetbiosCall (&ncb) == 0) + { + zerostruct (ncb); + memcpy (ncb.ncb_callname, "* ", NCBNAMSZ); + ncb.ncb_command = NCBASTAT; + ncb.ncb_lana_num = enums.lana[i]; + + ncb.ncb_buffer = (unsigned char*) &astat; + ncb.ncb_length = sizeof (ASTAT); + + if (NetbiosCall (&ncb) == 0) + { + if (astat.adapt.adapter_type == 0xfe) + { + int64 mac = 0; + for (unsigned int i = 0; i < 6; ++i) + mac = (mac << 8) | astat.adapt.adapter_address[i]; + + if (numFound < maxNum && mac != 0) + addresses [numFound++] = mac; + } + } + } + } + } + + return numFound; +} + +int SystemStats::getMACAddresses (int64* addresses, int maxNum) +{ + int numFound = getMACAddressViaGetAdaptersInfo (addresses, maxNum); + + if (numFound == 0) + numFound = getMACAddressesViaNetBios (addresses, maxNum); + + return numFound; +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_PlatformUtils.cpp b/build/win32/platform_specific_code/juce_win32_PlatformUtils.cpp new file mode 100644 index 0000000000..1a088e9648 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_PlatformUtils.cpp @@ -0,0 +1,291 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) +#endif + +#include "win32_headers.h" +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + +//============================================================================== +UNICODE_FUNCTION (RegCreateKeyExW, LONG, (HKEY, LPCWSTR, DWORD, LPWSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD)) +UNICODE_FUNCTION (RegOpenKeyExW, LONG, (HKEY, LPCWSTR, DWORD, REGSAM, PHKEY)) +UNICODE_FUNCTION (RegQueryValueExW, LONG, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)) +UNICODE_FUNCTION (RegSetValueExW, LONG, (HKEY, LPCWSTR, DWORD, DWORD, const BYTE*, DWORD)) +UNICODE_FUNCTION (RegDeleteValueW, LONG, (HKEY, LPCWSTR)) +UNICODE_FUNCTION (RegDeleteKeyW, LONG, (HKEY, LPCWSTR)) + +void juce_initialiseUnicodeRegistryFunctions() +{ + static bool initialised = false; + + if (! initialised) + { + initialised = true; + + if ((SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0) + { + HMODULE h = LoadLibraryA ("Advapi32.dll"); + UNICODE_FUNCTION_LOAD (RegCreateKeyExW) + UNICODE_FUNCTION_LOAD (RegOpenKeyExW) + UNICODE_FUNCTION_LOAD (RegQueryValueExW) + UNICODE_FUNCTION_LOAD (RegSetValueExW) + UNICODE_FUNCTION_LOAD (RegDeleteValueW) + UNICODE_FUNCTION_LOAD (RegDeleteKeyW) + } + } +} + + +//============================================================================== +static HKEY findKeyForPath (String name, + const bool createForWriting, + String& valueName) +{ + juce_initialiseUnicodeRegistryFunctions(); + + HKEY rootKey = 0; + + if (name.startsWithIgnoreCase (T("HKEY_CURRENT_USER\\"))) + rootKey = HKEY_CURRENT_USER; + else if (name.startsWithIgnoreCase (T("HKEY_LOCAL_MACHINE\\"))) + rootKey = HKEY_LOCAL_MACHINE; + else if (name.startsWithIgnoreCase (T("HKEY_CLASSES_ROOT\\"))) + rootKey = HKEY_CLASSES_ROOT; + + if (rootKey != 0) + { + name = name.substring (name.indexOfChar (T('\\')) + 1); + + const int lastSlash = name.lastIndexOfChar (T('\\')); + valueName = name.substring (lastSlash + 1); + name = name.substring (0, lastSlash); + + HKEY key; + DWORD result; + + if (createForWriting) + { + if (wRegCreateKeyExW != 0) + { + if (wRegCreateKeyExW (rootKey, name, 0, L"", REG_OPTION_NON_VOLATILE, + (KEY_WRITE | KEY_QUERY_VALUE), 0, &key, &result) == ERROR_SUCCESS) + { + return key; + } + } + else + { + if (RegCreateKeyEx (rootKey, name, 0, _T(""), REG_OPTION_NON_VOLATILE, + (KEY_WRITE | KEY_QUERY_VALUE), 0, &key, &result) == ERROR_SUCCESS) + { + return key; + } + } + } + else + { + if (wRegOpenKeyExW != 0) + { + if (wRegOpenKeyExW (rootKey, name, 0, KEY_READ, &key) == ERROR_SUCCESS) + { + return key; + } + } + else + { + if (RegOpenKeyEx (rootKey, name, 0, KEY_READ, &key) == ERROR_SUCCESS) + { + return key; + } + } + } + } + + return 0; +} + +const String PlatformUtilities::getRegistryValue (const String& regValuePath, + const String& defaultValue) +{ + String valueName, s; + HKEY k = findKeyForPath (regValuePath, false, valueName); + + if (k != 0) + { + if (wRegQueryValueExW != 0) + { + WCHAR buffer [2048]; + unsigned long bufferSize = sizeof (buffer); + DWORD type = REG_SZ; + + if (wRegQueryValueExW (k, valueName, 0, &type, (LPBYTE) buffer, &bufferSize) == ERROR_SUCCESS) + s = buffer; + else + s = defaultValue; + } + else + { + TCHAR buffer [2048]; + unsigned long bufferSize = sizeof (buffer); + DWORD type = REG_SZ; + + if (RegQueryValueEx (k, valueName, 0, &type, (LPBYTE) buffer, &bufferSize) == ERROR_SUCCESS) + s = buffer; + else + s = defaultValue; + } + + RegCloseKey (k); + } + + return s; +} + +void PlatformUtilities::setRegistryValue (const String& regValuePath, + const String& value) +{ + String valueName; + HKEY k = findKeyForPath (regValuePath, true, valueName); + + if (k != 0) + { + if (wRegSetValueExW != 0) + wRegSetValueExW (k, valueName, 0, REG_SZ, + (const BYTE*) (const WCHAR*) value, + sizeof (WCHAR) * (value.length() + 1)); + else + RegSetValueEx (k, valueName, 0, REG_SZ, + (const BYTE*) (const TCHAR*) value, + sizeof (TCHAR) * (value.length() + 1)); + + RegCloseKey (k); + } +} + +bool PlatformUtilities::registryValueExists (const String& regValuePath) +{ + bool exists = false; + String valueName; + HKEY k = findKeyForPath (regValuePath, false, valueName); + + if (k != 0) + { + unsigned char buffer [2048]; + unsigned long bufferSize = sizeof (buffer); + DWORD type = 0; + + if (wRegQueryValueExW != 0) + { + if (wRegQueryValueExW (k, valueName, 0, &type, buffer, &bufferSize) == ERROR_SUCCESS) + exists = true; + } + else + { + if (RegQueryValueEx (k, valueName, 0, &type, buffer, &bufferSize) == ERROR_SUCCESS) + exists = true; + } + + RegCloseKey (k); + } + + return exists; +} + +void PlatformUtilities::deleteRegistryValue (const String& regValuePath) +{ + String valueName; + HKEY k = findKeyForPath (regValuePath, true, valueName); + + if (k != 0) + { + if (wRegDeleteValueW != 0) + wRegDeleteValueW (k, valueName); + else + RegDeleteValue (k, valueName); + + RegCloseKey (k); + } +} + +void PlatformUtilities::deleteRegistryKey (const String& regKeyPath) +{ + String valueName; + HKEY k = findKeyForPath (regKeyPath, true, valueName); + + if (k != 0) + { + if (wRegDeleteKeyW != 0) + wRegDeleteKeyW (k, valueName); + else + RegDeleteKey (k, valueName); + + RegCloseKey (k); + } +} + + +//============================================================================== +static void* currentModuleHandle = 0; + +void* PlatformUtilities::getCurrentModuleInstanceHandle() +{ + if (currentModuleHandle == 0) + currentModuleHandle = GetModuleHandle (0); + + return currentModuleHandle; +} + +void PlatformUtilities::setCurrentModuleInstanceHandle (void* newHandle) +{ + currentModuleHandle = newHandle; +} + +void PlatformUtilities::fpuReset() +{ +#ifdef JUCE_MSVC + _clearfp(); +#endif +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_SystemStats.cpp b/build/win32/platform_specific_code/juce_win32_SystemStats.cpp new file mode 100644 index 0000000000..f847ee4d81 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_SystemStats.cpp @@ -0,0 +1,605 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + + +//============================================================================== +// Auto-link the other win32 libs that are needed by library calls.. +#if defined (JUCE_DLL_BUILD) && JUCE_MSVC + + #pragma comment(lib, "kernel32.lib") + #pragma comment(lib, "user32.lib") + #pragma comment(lib, "shell32.lib") + #pragma comment(lib, "gdi32.lib") + #pragma comment(lib, "vfw32.lib") + #pragma comment(lib, "comdlg32.lib") + #pragma comment(lib, "winmm.lib") + #pragma comment(lib, "wininet.lib") + #pragma comment(lib, "ole32.lib") + #pragma comment(lib, "advapi32.lib") + #pragma comment(lib, "ws2_32.lib") + + #if JUCE_OPENGL + #pragma comment(lib, "OpenGL32.Lib") + #pragma comment(lib, "GlU32.Lib") + #endif +#endif + + +//============================================================================== +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/io/files/juce_File.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "juce_win32_DynamicLibraryLoader.h" + +extern void juce_updateMultiMonitorInfo(); // from WindowDriver + +//============================================================================== +void Logger::outputDebugString (const String& text) +{ + OutputDebugString (text + T("\n")); +} + +void Logger::outputDebugPrintf (const tchar* format, ...) +{ + String text; + va_list args; + va_start (args, format); + text.vprintf(format, args); + outputDebugString (text); +} + +//============================================================================== +static int64 hiResTicksPerSecond; +static double hiResTicksScaleFactor; +static SYSTEM_INFO systemInfo; + +static struct _LogicalCpuInfo +{ + bool htSupported; + bool htAvailable; + int numPackages; + int numLogicalPerPackage; + unsigned long physicalAffinityMask; +} logicalCpuInfo; + + +//============================================================================== +#if JUCE_USE_INTRINSICS + +// CPU info functions using intrinsics... + +#pragma intrinsic (__cpuid) +#pragma intrinsic (__rdtsc) + +static unsigned int getCPUIDWord (int* familyModel = 0, int* extFeatures = 0) +{ + int info [4]; + __cpuid (info, 1); + + if (familyModel != 0) + *familyModel = info [0]; + + if (extFeatures != 0) + *extFeatures = info[1]; + + return info[3]; +} + +const String SystemStats::getCpuVendor() +{ + int info [4]; + __cpuid (info, 0); + + char v [12]; + memcpy (v, info + 1, 4); + memcpy (v + 4, info + 3, 4); + memcpy (v + 8, info + 2, 4); + + return String (v, 12); +} + +#else + +//============================================================================== +// CPU info functions using old fashioned inline asm... + +static juce_noinline unsigned int getCPUIDWord (int* familyModel = 0, int* extFeatures = 0) +{ + unsigned int cpu = 0; + unsigned int ext = 0; + unsigned int family = 0; + + #ifdef JUCE_GCC + unsigned int dummy = 0; + #endif + + #ifndef __MINGW32__ + __try + #endif + { + #ifdef JUCE_GCC + __asm__ ("cpuid" : "=a" (family), "=b" (ext), "=c" (dummy),"=d" (cpu) : "a" (1)); + #else + __asm + { + mov eax, 1 + cpuid + mov cpu, edx + mov family, eax + mov ext, ebx + } + + #endif + } + #ifndef __MINGW32__ + __except (EXCEPTION_EXECUTE_HANDLER) + { + return 0; + } + #endif + + if (familyModel != 0) + *familyModel = family; + + if (extFeatures != 0) + *extFeatures = ext; + + return cpu; +} + +static void juce_getCpuVendor (char* const v) +{ + int vendor[4]; + zeromem (vendor, 16); + +#ifdef JUCE_64BIT +#else + #ifndef __MINGW32__ + __try + #endif + { + #ifdef JUCE_GCC + unsigned int dummy = 0; + __asm__ ("cpuid" : "=a" (dummy), "=b" (vendor[0]), "=c" (vendor[2]),"=d" (vendor[1]) : "a" (0)); + #else + __asm + { + mov eax, 0 + cpuid + mov [vendor], ebx + mov [vendor + 4], edx + mov [vendor + 8], ecx + } + #endif + } + #ifndef __MINGW32__ + __except (EXCEPTION_EXECUTE_HANDLER) + { + *v = 0; + } + #endif +#endif + + memcpy (v, vendor, 16); +} + +const String SystemStats::getCpuVendor() +{ + char v [16]; + juce_getCpuVendor (v); + return String (v, 16); +} +#endif + +static void initLogicalCpuInfo() +{ + int familyModelWord, extFeaturesWord; + int featuresWord = getCPUIDWord (&familyModelWord, &extFeaturesWord); + HANDLE hCurrentProcessHandle = GetCurrentProcess(); + + logicalCpuInfo.htSupported = false; + logicalCpuInfo.htAvailable = false; + logicalCpuInfo.numLogicalPerPackage = 1; + logicalCpuInfo.numPackages = 0; + logicalCpuInfo.physicalAffinityMask = 0; + + DWORD_PTR processAffinity, systemAffinity; + + if (! GetProcessAffinityMask (hCurrentProcessHandle, &processAffinity, &systemAffinity)) + return; + + // Checks: CPUID supported, model >= Pentium 4, Hyperthreading bit set, logical CPUs per package > 1 + if (featuresWord == 0 + || ((familyModelWord >> 8) & 0xf) < 15 + || (featuresWord & (1 << 28)) == 0 + || ((extFeaturesWord >> 16) & 0xff) < 2) + { + logicalCpuInfo.physicalAffinityMask = static_cast (processAffinity); + return; + } + + logicalCpuInfo.htSupported = true; + logicalCpuInfo.numLogicalPerPackage = (extFeaturesWord >> 16) & 0xff; + + unsigned int affinityMask; + unsigned int physAff = 0; + + unsigned char i = 1; + unsigned char physIdMask = 0xFF; + unsigned char physIdShift = 0; + + unsigned char apicId; + unsigned char logId; + unsigned char physId; + + while (i < logicalCpuInfo.numLogicalPerPackage) + { + i *= 2; + physIdMask <<= 1; + physIdShift++; + } + + affinityMask = 1; + logicalCpuInfo.numPackages = 0; + + while ((affinityMask != 0) && (affinityMask <= processAffinity)) + { + if (SetProcessAffinityMask (hCurrentProcessHandle, affinityMask)) + { + Sleep(0); // schedule onto correct CPU + + featuresWord = getCPUIDWord (&familyModelWord, &extFeaturesWord); + apicId = (unsigned char) (extFeaturesWord >> 24); + logId = (unsigned char) (apicId & ~physIdMask); + physId = (unsigned char) (apicId >> physIdShift); + + if (logId != 0) + logicalCpuInfo.htAvailable = true; + + if ((((int) logId) % logicalCpuInfo.numLogicalPerPackage) == 0) + { + // This is a physical CPU + physAff |= affinityMask; + logicalCpuInfo.numPackages++; + } + } + + affinityMask = affinityMask << 1; + } + + logicalCpuInfo.physicalAffinityMask = physAff; + + SetProcessAffinityMask(hCurrentProcessHandle, processAffinity); +} + +//============================================================================== +void juce_initialiseThreadEvents(); +void juce_initialiseUnicodeFileFunctions(); + +static struct JuceCpuProps +{ + bool hasMMX : 1, hasSSE : 1, hasSSE2 : 1, has3DNow : 1; +} juce_CpuProps; + +bool SystemStats::hasMMX() +{ + return juce_CpuProps.hasMMX; +} + +bool SystemStats::hasSSE() +{ + return juce_CpuProps.hasSSE; +} + +bool SystemStats::hasSSE2() +{ + return juce_CpuProps.hasSSE2; +} + +bool SystemStats::has3DNow() +{ + return juce_CpuProps.has3DNow; +} + +void SystemStats::initialiseStats() +{ + juce_initialiseUnicodeFileFunctions(); + juce_initialiseThreadEvents(); + + juce_CpuProps.hasMMX = IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE) != 0; + juce_CpuProps.hasSSE = IsProcessorFeaturePresent (PF_XMMI_INSTRUCTIONS_AVAILABLE) != 0; + juce_CpuProps.hasSSE2 = IsProcessorFeaturePresent (PF_XMMI64_INSTRUCTIONS_AVAILABLE) != 0; +#ifdef PF_AMD3D_INSTRUCTIONS_AVAILABLE + juce_CpuProps.has3DNow = IsProcessorFeaturePresent (PF_AMD3D_INSTRUCTIONS_AVAILABLE) != 0; +#else + juce_CpuProps.has3DNow = IsProcessorFeaturePresent (PF_3DNOW_INSTRUCTIONS_AVAILABLE) != 0; +#endif + + LARGE_INTEGER f; + QueryPerformanceFrequency (&f); + hiResTicksPerSecond = f.QuadPart; + hiResTicksScaleFactor = 1000.0 / hiResTicksPerSecond; + + String s (SystemStats::getJUCEVersion()); + + GetSystemInfo (&systemInfo); + initLogicalCpuInfo(); + +#ifdef JUCE_DEBUG + const MMRESULT res = timeBeginPeriod (1); + jassert (res == TIMERR_NOERROR); +#else + timeBeginPeriod (1); +#endif + +#if JUCE_DEBUG && JUCE_MSVC && JUCE_CHECK_MEMORY_LEAKS + _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif +} + +//============================================================================== +SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() +{ + OSVERSIONINFO info; + info.dwOSVersionInfoSize = sizeof (info); + GetVersionEx (&info); + + if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + switch (info.dwMajorVersion) + { + case 3: + return WinNT351; + + case 4: + return WinNT40; + + case 5: + return (info.dwMinorVersion == 0) ? Win2000 : WinXP; + + case 6: + return WinVista; + + default: + break; + } + } + else if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + { + return (info.dwMinorVersion == 0) ? Win95 : Win98; + } + + return UnknownOS; +} + +const String SystemStats::getOperatingSystemName() +{ + const tchar* name = T("Unknown OS"); + + switch (getOperatingSystemType()) + { + case WinXP: + name = T("Windows XP"); + break; + + case Win2000: + name = T("Windows 2000"); + break; + + case Win98: + name = T("Windows 98"); + break; + + case Win95: + name = T("Windows 95"); + break; + + case WinNT351: + name = T("Windows NT 3.51"); + break; + + case WinNT40: + name = T("Windows NT4"); + break; + + case WinVista: + name = T("Windows Vista"); + break; + + default: + break; + } + + return name; +} + +//============================================================================== +int SystemStats::getMemorySizeInMegabytes() +{ + MEMORYSTATUS mem; + GlobalMemoryStatus (&mem); + return (int) (mem.dwTotalPhys / (1024 * 1024)) + 1; +} + +bool SystemStats::hasHyperThreading() +{ + return logicalCpuInfo.htAvailable; +} + +int SystemStats::getNumPhysicalCpus() +{ + if (logicalCpuInfo.numPackages) + return logicalCpuInfo.numPackages; + + return getNumLogicalCpus(); +} + +int SystemStats::getNumLogicalCpus() +{ + return systemInfo.dwNumberOfProcessors; +} + +uint32 SystemStats::getPhysicalAffinityMask() +{ + return logicalCpuInfo.physicalAffinityMask; +} + +//============================================================================== +uint32 juce_millisecondsSinceStartup() throw() +{ + return (uint32) GetTickCount(); +} + +int64 Time::getHighResolutionTicks() throw() +{ + LARGE_INTEGER ticks; + QueryPerformanceCounter (&ticks); + + const int64 mainCounterAsHiResTicks = (GetTickCount() * hiResTicksPerSecond) / 1000; + const int64 newOffset = mainCounterAsHiResTicks - ticks.QuadPart; + + // fix for a very obscure PCI hardware bug that can make the counter + // sometimes jump forwards by a few seconds.. + static int64 hiResTicksOffset = 0; + const int offsetDrift = abs ((int) (newOffset - hiResTicksOffset)); + + if (offsetDrift > ((int) hiResTicksPerSecond) >> 1) + hiResTicksOffset = newOffset; + + return ticks.QuadPart + hiResTicksOffset; +} + +double Time::getMillisecondCounterHiRes() throw() +{ + return getHighResolutionTicks() * hiResTicksScaleFactor; +} + +int64 Time::getHighResolutionTicksPerSecond() throw() +{ + return hiResTicksPerSecond; +} + +int64 SystemStats::getClockCycleCounter() +{ +#if JUCE_USE_INTRINSICS + // MS intrinsics version... + return __rdtsc(); + +#elif JUCE_GCC + // GNU inline asm version... + unsigned int hi = 0, lo = 0; + + __asm__ __volatile__ ( + "xor %%eax, %%eax \n\ + xor %%edx, %%edx \n\ + rdtsc \n\ + movl %%eax, %[lo] \n\ + movl %%edx, %[hi]" + : + : [hi] "m" (hi), + [lo] "m" (lo) + : "cc", "eax", "ebx", "ecx", "edx", "memory"); + + return (int64) ((((uint64) hi) << 32) | lo); +#else + // MSVC inline asm version... + unsigned int hi = 0, lo = 0; + + __asm + { + xor eax, eax + xor edx, edx + rdtsc + mov lo, eax + mov hi, edx + } + + return (int64) ((((uint64) hi) << 32) | lo); +#endif +} + +int SystemStats::getCpuSpeedInMegaherz() +{ + const int64 cycles = SystemStats::getClockCycleCounter(); + const uint32 millis = Time::getMillisecondCounter(); + int lastResult = 0; + + for (;;) + { + int n = 1000000; + while (--n > 0) {} + + const uint32 millisElapsed = Time::getMillisecondCounter() - millis; + const int64 cyclesNow = SystemStats::getClockCycleCounter(); + + if (millisElapsed > 80) + { + const int newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000); + + if (millisElapsed > 500 || (lastResult == newResult && newResult > 100)) + return newResult; + + lastResult = newResult; + } + } +} + + +//============================================================================== +bool Time::setSystemTimeToThisTime() const +{ + SYSTEMTIME st; + + st.wDayOfWeek = 0; + st.wYear = (WORD) getYear(); + st.wMonth = (WORD) (getMonth() + 1); + st.wDay = (WORD) getDayOfMonth(); + st.wHour = (WORD) getHours(); + st.wMinute = (WORD) getMinutes(); + st.wSecond = (WORD) getSeconds(); + st.wMilliseconds = (WORD) (millisSinceEpoch % 1000); + + // do this twice because of daylight saving conversion problems - the + // first one sets it up, the second one kicks it in. + return SetLocalTime (&st) != 0 + && SetLocalTime (&st) != 0; +} + +int SystemStats::getPageSize() +{ + return systemInfo.dwPageSize; +} + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Threads.cpp b/build/win32/platform_specific_code/juce_win32_Threads.cpp new file mode 100644 index 0000000000..1e92c1d36c --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Threads.cpp @@ -0,0 +1,390 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "win32_headers.h" + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) + #include +#endif + +#include +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/text/juce_String.h" +#include "../../../src/juce_core/threads/juce_CriticalSection.h" +#include "../../../src/juce_core/threads/juce_WaitableEvent.h" +#include "../../../src/juce_core/threads/juce_Thread.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_core/threads/juce_InterProcessLock.h" + +extern HWND juce_messageWindowHandle; + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + + +//============================================================================== +CriticalSection::CriticalSection() throw() +{ + // (just to check the MS haven't changed this structure and broken things...) +#if _MSC_VER >= 1400 + static_jassert (sizeof (CRITICAL_SECTION) <= sizeof (internal)); +#else + static_jassert (sizeof (CRITICAL_SECTION) <= 24); +#endif + + InitializeCriticalSection ((CRITICAL_SECTION*) internal); +} + +CriticalSection::~CriticalSection() throw() +{ + DeleteCriticalSection ((CRITICAL_SECTION*) internal); +} + +void CriticalSection::enter() const throw() +{ + EnterCriticalSection ((CRITICAL_SECTION*) internal); +} + +bool CriticalSection::tryEnter() const throw() +{ + return TryEnterCriticalSection ((CRITICAL_SECTION*) internal) != FALSE; +} + +void CriticalSection::exit() const throw() +{ + LeaveCriticalSection ((CRITICAL_SECTION*) internal); +} + +//============================================================================== +WaitableEvent::WaitableEvent() throw() +{ + internal = CreateEvent (0, FALSE, FALSE, 0); +} + +WaitableEvent::~WaitableEvent() throw() +{ + CloseHandle (internal); +} + +bool WaitableEvent::wait (const int timeOutMillisecs) const throw() +{ + return WaitForSingleObject (internal, timeOutMillisecs) == WAIT_OBJECT_0; +} + +void WaitableEvent::signal() const throw() +{ + SetEvent (internal); +} + +void WaitableEvent::reset() const throw() +{ + ResetEvent (internal); +} + +//============================================================================== +void JUCE_API juce_threadEntryPoint (void*); + +static unsigned int __stdcall threadEntryProc (void* userData) +{ + AttachThreadInput (GetWindowThreadProcessId (juce_messageWindowHandle, 0), + GetCurrentThreadId(), TRUE); + + juce_threadEntryPoint (userData); + + _endthread(); + return 0; +} + +void* juce_createThread (void* userData) +{ + unsigned int threadId; + + return (void*) _beginthreadex (0, 0, + &threadEntryProc, + userData, + 0, &threadId); +} + +void juce_killThread (void* handle) +{ + if (handle != 0) + { +#ifdef JUCE_DEBUG + OutputDebugString (_T("** Warning - Forced thread termination **\n")); +#endif + TerminateThread (handle, 0); + } +} + +void juce_setCurrentThreadName (const String& name) +{ +#if JUCE_DEBUG && JUCE_MSVC + struct + { + DWORD dwType; + LPCSTR szName; + DWORD dwThreadID; + DWORD dwFlags; + } info; + + info.dwType = 0x1000; + info.szName = name; + info.dwThreadID = GetCurrentThreadId(); + info.dwFlags = 0; + + #define MS_VC_EXCEPTION 0x406d1388 + + __try + { + RaiseException (MS_VC_EXCEPTION, 0, sizeof (info) / sizeof (ULONG_PTR), (ULONG_PTR*) &info); + } + __except (EXCEPTION_CONTINUE_EXECUTION) + {} +#else + (void) name; +#endif +} + +int Thread::getCurrentThreadId() +{ + return (int) GetCurrentThreadId(); +} + +// priority 1 to 10 where 5=normal, 1=low +void juce_setThreadPriority (void* threadHandle, int priority) +{ + int pri = THREAD_PRIORITY_TIME_CRITICAL; + + if (priority < 1) + pri = THREAD_PRIORITY_IDLE; + else if (priority < 2) + pri = THREAD_PRIORITY_LOWEST; + else if (priority < 5) + pri = THREAD_PRIORITY_BELOW_NORMAL; + else if (priority < 7) + pri = THREAD_PRIORITY_NORMAL; + else if (priority < 9) + pri = THREAD_PRIORITY_ABOVE_NORMAL; + else if (priority < 10) + pri = THREAD_PRIORITY_HIGHEST; + + if (threadHandle == 0) + threadHandle = GetCurrentThread(); + + SetThreadPriority (threadHandle, pri); +} + +void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) +{ + SetThreadAffinityMask (GetCurrentThread(), affinityMask); +} + +static HANDLE sleepEvent = 0; + +void juce_initialiseThreadEvents() +{ + sleepEvent = CreateEvent (0, 0, 0, 0); +} + +void Thread::yield() +{ + Sleep (0); +} + +void Thread::sleep (int millisecs) +{ + if (millisecs >= 10) + { + Sleep (millisecs); + } + else + { + jassert (sleepEvent != 0); + + // unlike Sleep() this is guaranteed to return to the current thread after + // the time expires, so we'll use this for short waits, which are more likely + // to need to be accurate + WaitForSingleObject (sleepEvent, millisecs); + } +} + +//============================================================================== +static int lastProcessPriority = -1; + +// called by WindowDriver because Windows does wierd things to process priority +// when you swap apps, and this forces an update when the app is brought to the front. +void repeatLastProcessPriority() +{ + if (lastProcessPriority >= 0) // (avoid changing this if it's not been explicitly set by the app..) + { + DWORD p; + + switch (lastProcessPriority) + { + case Process::LowPriority: + p = IDLE_PRIORITY_CLASS; + break; + + case Process::NormalPriority: + p = NORMAL_PRIORITY_CLASS; + break; + + case Process::HighPriority: + p = HIGH_PRIORITY_CLASS; + break; + + case Process::RealtimePriority: + p = REALTIME_PRIORITY_CLASS; + break; + + default: + jassertfalse // bad priority value + return; + } + + SetPriorityClass (GetCurrentProcess(), p); + } +} + +void Process::setPriority (ProcessPriority prior) +{ + if (lastProcessPriority != (int) prior) + { + lastProcessPriority = (int) prior; + repeatLastProcessPriority(); + } +} + +//============================================================================== +void Process::raisePrivilege() +{ + jassertfalse // xxx not implemented +} + +void Process::lowerPrivilege() +{ + jassertfalse // xxx not implemented +} + +void Process::terminate() +{ +#if JUCE_DEBUG && JUCE_MSVC && JUCE_CHECK_MEMORY_LEAKS + _CrtDumpMemoryLeaks(); +#endif + + // bullet in the head in case there's a problem shutting down.. + ExitProcess (0); +} + +void* Process::loadDynamicLibrary (const String& name) +{ + void* result = 0; + + JUCE_TRY + { + result = (void*) LoadLibrary (name); + } + JUCE_CATCH_ALL + + return result; +} + +void Process::freeDynamicLibrary (void* h) +{ + JUCE_TRY + { + if (h != 0) + FreeLibrary ((HMODULE) h); + } + JUCE_CATCH_ALL +} + +void* Process::getProcedureEntryPoint (void* h, const String& name) +{ + return (h != 0) ? (void*) GetProcAddress ((HMODULE) h, name) + : 0; +} + + +//============================================================================== +InterProcessLock::InterProcessLock (const String& name_) + : internal (0), + name (name_), + reentrancyLevel (0) +{ +} + +InterProcessLock::~InterProcessLock() +{ + exit(); +} + +bool InterProcessLock::enter (int timeOutMillisecs) +{ + if (reentrancyLevel++ == 0) + { + internal = CreateMutex (0, TRUE, name); + + if (internal != 0 && GetLastError() == ERROR_ALREADY_EXISTS) + { + if (timeOutMillisecs == 0 + || WaitForSingleObject (internal, (timeOutMillisecs < 0) ? INFINITE : timeOutMillisecs) + == WAIT_TIMEOUT) + { + ReleaseMutex (internal); + CloseHandle (internal); + internal = 0; + } + } + } + + return (internal != 0); +} + +void InterProcessLock::exit() +{ + if (--reentrancyLevel == 0 && internal != 0) + { + ReleaseMutex (internal); + CloseHandle (internal); + internal = 0; + } +} + + + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/juce_win32_Windowing.cpp b/build/win32/platform_specific_code/juce_win32_Windowing.cpp new file mode 100644 index 0000000000..7f754bf4a0 --- /dev/null +++ b/build/win32/platform_specific_code/juce_win32_Windowing.cpp @@ -0,0 +1,3536 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _MSC_VER + #pragma warning (disable: 4514) + #pragma warning (push) +#endif + +#include "win32_headers.h" +#include +#include +#include + +#if JUCE_OPENGL + #include +#endif + +#ifdef _MSC_VER + #pragma warning (pop) + #pragma warning (disable: 4312 4244) +#endif + + +#undef GetSystemMetrics // multimon overrides this for some reason and causes a mess.. + +// these are in the windows SDK, but need to be repeated here for GCC.. +#ifndef GET_APPCOMMAND_LPARAM + #define FAPPCOMMAND_MASK 0xF000 + #define GET_APPCOMMAND_LPARAM(lParam) ((short) (HIWORD(lParam) & ~FAPPCOMMAND_MASK)) + #define APPCOMMAND_MEDIA_NEXTTRACK 11 + #define APPCOMMAND_MEDIA_PREVIOUSTRACK 12 + #define APPCOMMAND_MEDIA_STOP 13 + #define APPCOMMAND_MEDIA_PLAY_PAUSE 14 + #define WM_APPCOMMAND 0x0319 +#endif + + +#include "../../../src/juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "../../../src/juce_core/text/juce_StringArray.h" +#include "../../../src/juce_core/basics/juce_SystemStats.h" +#include "../../../src/juce_core/threads/juce_Process.h" +#include "../../../src/juce_core/misc/juce_PlatformUtilities.h" +#include "../../../src/juce_appframework/events/juce_Timer.h" +#include "../../../src/juce_appframework/events/juce_MessageManager.h" +#include "../../../src/juce_appframework/application/juce_DeletedAtShutdown.h" +#include "../../../src/juce_appframework/gui/components/keyboard/juce_KeyPress.h" +#include "../../../src/juce_appframework/gui/components/mouse/juce_DragAndDropContainer.h" +#include "../../../src/juce_appframework/gui/components/juce_Desktop.h" +#include "../../../src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.h" +#include "../../../src/juce_appframework/gui/components/special/juce_OpenGLComponent.h" +#include "../../../src/juce_appframework/gui/components/special/juce_DropShadower.h" +#include "../../../src/juce_appframework/gui/components/special/juce_ActiveXControlComponent.h" +#include "../../../src/juce_appframework/gui/components/special/juce_SystemTrayIconComponent.h" +#include "../../../src/juce_appframework/gui/components/juce_ComponentDeletionWatcher.h" +#include "../../../src/juce_appframework/gui/components/layout/juce_ComponentBoundsConstrainer.h" +#include "../../../src/juce_appframework/gui/graphics/imaging/juce_ImageFileFormat.h" +#include "../../../src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" +#include "../../../src/juce_appframework/gui/graphics/geometry/juce_PathIterator.h" +#include "../../../src/juce_appframework/gui/components/layout/juce_ComponentMovementWatcher.h" +#include "juce_win32_DynamicLibraryLoader.h" + + +extern void repeatLastProcessPriority(); // in juce_win32_Threads.cpp +extern void juce_CheckCurrentlyFocusedTopLevelWindow(); // in juce_TopLevelWindow.cpp + +const int juce_windowIsSemiTransparentFlag = (1 << 31); // also in component.cpp + +#ifndef ULW_ALPHA + #define ULW_ALPHA 0x00000002 +#endif + +#ifndef AC_SRC_ALPHA + #define AC_SRC_ALPHA 0x01 +#endif + +#define DEBUG_REPAINT_TIMES 0 + +static HPALETTE palette = 0; +static bool createPaletteIfNeeded = true; +static bool shouldDeactivateTitleBar = true; + +static HICON createHICONFromImage (const Image& image, const BOOL isIcon, int hotspotX, int hotspotY); +#define WM_TRAYNOTIFY WM_USER + 100 + +//============================================================================== +typedef BOOL (WINAPI* UpdateLayeredWinFunc) (HWND, HDC, POINT*, SIZE*, HDC, POINT*, COLORREF, BLENDFUNCTION*, DWORD); +static UpdateLayeredWinFunc updateLayeredWindow = 0; + +bool Desktop::canUseSemiTransparentWindows() +{ + if (updateLayeredWindow == 0) + { + HMODULE user32Mod = GetModuleHandle (_T("user32.dll")); + updateLayeredWindow = (UpdateLayeredWinFunc) GetProcAddress (user32Mod, "UpdateLayeredWindow"); + } + + return updateLayeredWindow != 0; +} + +//============================================================================== +UNICODE_FUNCTION (SetWindowTextW, BOOL, (HWND, LPCWSTR)) +UNICODE_FUNCTION (DragQueryFileW, UINT, (HDROP, UINT, LPWSTR, UINT)) +UNICODE_FUNCTION (MapVirtualKeyW, UINT, (UINT, UINT)) +UNICODE_FUNCTION (RegisterClassExW, ATOM, (CONST WNDCLASSEXW*)) +UNICODE_FUNCTION (CreateWindowExW, HWND, (DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)) +UNICODE_FUNCTION (DefWindowProcW, LRESULT, (HWND, UINT, WPARAM, LPARAM)) + +void juce_initialiseUnicodeWindowFunctions() +{ + static bool initialised = false; + + if (! initialised) + { + initialised = true; + + if ((SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0) + { + HMODULE h = LoadLibraryA ("user32.dll"); + UNICODE_FUNCTION_LOAD (SetWindowTextW) + UNICODE_FUNCTION_LOAD (MapVirtualKeyW) + UNICODE_FUNCTION_LOAD (RegisterClassExW) + UNICODE_FUNCTION_LOAD (CreateWindowExW) + UNICODE_FUNCTION_LOAD (DefWindowProcW) + + if (wDefWindowProcW == 0) + wDefWindowProcW = & DefWindowProcA; + + h = LoadLibraryA ("shell32.dll"); + UNICODE_FUNCTION_LOAD (DragQueryFileW) + } + } +} + +#undef DefWindowProc +#define DefWindowProc wDefWindowProcW + + +//============================================================================== +static const int extendedKeyModifier = 0x10000; + +const int KeyPress::spaceKey = VK_SPACE; +const int KeyPress::returnKey = VK_RETURN; +const int KeyPress::escapeKey = VK_ESCAPE; +const int KeyPress::backspaceKey = VK_BACK; +const int KeyPress::deleteKey = VK_DELETE | extendedKeyModifier; +const int KeyPress::insertKey = VK_INSERT | extendedKeyModifier; +const int KeyPress::tabKey = VK_TAB; +const int KeyPress::leftKey = VK_LEFT | extendedKeyModifier; +const int KeyPress::rightKey = VK_RIGHT | extendedKeyModifier; +const int KeyPress::upKey = VK_UP | extendedKeyModifier; +const int KeyPress::downKey = VK_DOWN | extendedKeyModifier; +const int KeyPress::homeKey = VK_HOME | extendedKeyModifier; +const int KeyPress::endKey = VK_END | extendedKeyModifier; +const int KeyPress::pageUpKey = VK_PRIOR | extendedKeyModifier; +const int KeyPress::pageDownKey = VK_NEXT | extendedKeyModifier; +const int KeyPress::F1Key = VK_F1 | extendedKeyModifier; +const int KeyPress::F2Key = VK_F2 | extendedKeyModifier; +const int KeyPress::F3Key = VK_F3 | extendedKeyModifier; +const int KeyPress::F4Key = VK_F4 | extendedKeyModifier; +const int KeyPress::F5Key = VK_F5 | extendedKeyModifier; +const int KeyPress::F6Key = VK_F6 | extendedKeyModifier; +const int KeyPress::F7Key = VK_F7 | extendedKeyModifier; +const int KeyPress::F8Key = VK_F8 | extendedKeyModifier; +const int KeyPress::F9Key = VK_F9 | extendedKeyModifier; +const int KeyPress::F10Key = VK_F10 | extendedKeyModifier; +const int KeyPress::F11Key = VK_F11 | extendedKeyModifier; +const int KeyPress::F12Key = VK_F12 | extendedKeyModifier; +const int KeyPress::F13Key = VK_F13 | extendedKeyModifier; +const int KeyPress::F14Key = VK_F14 | extendedKeyModifier; +const int KeyPress::F15Key = VK_F15 | extendedKeyModifier; +const int KeyPress::F16Key = VK_F16 | extendedKeyModifier; +const int KeyPress::numberPad0 = VK_NUMPAD0 | extendedKeyModifier; +const int KeyPress::numberPad1 = VK_NUMPAD1 | extendedKeyModifier; +const int KeyPress::numberPad2 = VK_NUMPAD2 | extendedKeyModifier; +const int KeyPress::numberPad3 = VK_NUMPAD3 | extendedKeyModifier; +const int KeyPress::numberPad4 = VK_NUMPAD4 | extendedKeyModifier; +const int KeyPress::numberPad5 = VK_NUMPAD5 | extendedKeyModifier; +const int KeyPress::numberPad6 = VK_NUMPAD6 | extendedKeyModifier; +const int KeyPress::numberPad7 = VK_NUMPAD7 | extendedKeyModifier; +const int KeyPress::numberPad8 = VK_NUMPAD8 | extendedKeyModifier; +const int KeyPress::numberPad9 = VK_NUMPAD9 | extendedKeyModifier; +const int KeyPress::numberPadAdd = VK_ADD | extendedKeyModifier; +const int KeyPress::numberPadSubtract = VK_SUBTRACT | extendedKeyModifier; +const int KeyPress::numberPadMultiply = VK_MULTIPLY | extendedKeyModifier; +const int KeyPress::numberPadDivide = VK_DIVIDE | extendedKeyModifier; +const int KeyPress::numberPadSeparator = VK_SEPARATOR | extendedKeyModifier; +const int KeyPress::numberPadDecimalPoint = VK_DECIMAL | extendedKeyModifier; +const int KeyPress::playKey = 0x30000; +const int KeyPress::stopKey = 0x30001; +const int KeyPress::fastForwardKey = 0x30002; +const int KeyPress::rewindKey = 0x30003; + +//============================================================================== +class WindowsBitmapImage : public Image +{ +public: + //============================================================================== + HBITMAP hBitmap; + BITMAPV4HEADER bitmapInfo; + HDC hdc; + unsigned char* bitmapData; + + //============================================================================== + WindowsBitmapImage (const PixelFormat format_, + const int w, const int h, const bool clearImage) + : Image (format_, w, h) + { + jassert (format_ == RGB || format_ == ARGB); + + pixelStride = (format_ == RGB) ? 3 : 4; + + zerostruct (bitmapInfo); + bitmapInfo.bV4Size = sizeof (BITMAPV4HEADER); + bitmapInfo.bV4Width = w; + bitmapInfo.bV4Height = h; + bitmapInfo.bV4Planes = 1; + bitmapInfo.bV4BitCount = (unsigned short) (pixelStride * 8); + + if (format_ == ARGB) + { + bitmapInfo.bV4AlphaMask = 0xff000000; + bitmapInfo.bV4RedMask = 0xff0000; + bitmapInfo.bV4GreenMask = 0xff00; + bitmapInfo.bV4BlueMask = 0xff; + bitmapInfo.bV4V4Compression = BI_BITFIELDS; + } + else + { + bitmapInfo.bV4V4Compression = BI_RGB; + } + + lineStride = -((w * pixelStride + 3) & ~3); + + HDC dc = GetDC (0); + hdc = CreateCompatibleDC (dc); + ReleaseDC (0, dc); + + SetMapMode (hdc, MM_TEXT); + + hBitmap = CreateDIBSection (hdc, + (BITMAPINFO*) &(bitmapInfo), + DIB_RGB_COLORS, + (void**) &bitmapData, + 0, 0); + + SelectObject (hdc, hBitmap); + + static uint8 needsClearing = 0; + + if (needsClearing == 0) + { + if ((SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0) + needsClearing = 2; + else + needsClearing = 1; + } + + if (format_ == ARGB && needsClearing == 2 && clearImage) + zeromem (bitmapData, abs (h * lineStride)); + + imageData = bitmapData - (lineStride * (h - 1)); + } + + ~WindowsBitmapImage() + { + DeleteDC (hdc); + DeleteObject (hBitmap); + imageData = 0; // to stop the base class freeing this + + } + + void blitToWindow (HWND hwnd, HDC dc, const bool transparent, + int x, int y, const RectangleList& maskedRegion) + { + static HDRAWDIB hdd = 0; + static bool needToCreateDrawDib = true; + + if (needToCreateDrawDib) + { + needToCreateDrawDib = false; + + HDC dc = GetDC (0); + const int n = GetDeviceCaps (dc, BITSPIXEL); + ReleaseDC (0, dc); + + // only open if we're not palettised + if (n > 8) + hdd = DrawDibOpen(); + } + + if (createPaletteIfNeeded) + { + HDC dc = GetDC (0); + const int n = GetDeviceCaps (dc, BITSPIXEL); + ReleaseDC (0, dc); + + if (n <= 8) + palette = CreateHalftonePalette (dc); + + createPaletteIfNeeded = false; + } + + if (palette != 0) + { + SelectPalette (dc, palette, FALSE); + RealizePalette (dc); + SetStretchBltMode (dc, HALFTONE); + } + + SetMapMode (dc, MM_TEXT); + + if (transparent) + { + POINT p, pos; + SIZE size; + + RECT windowBounds; + GetWindowRect (hwnd, &windowBounds); + + p.x = -x; + p.y = -y; + pos.x = windowBounds.left; + pos.y = windowBounds.top; + size.cx = windowBounds.right - windowBounds.left; + size.cy = windowBounds.bottom - windowBounds.top; + + BLENDFUNCTION bf; + bf.AlphaFormat = AC_SRC_ALPHA; + bf.BlendFlags = 0; + bf.BlendOp = AC_SRC_OVER; + bf.SourceConstantAlpha = 0xff; + + if (! maskedRegion.isEmpty()) + { + for (RectangleList::Iterator i (maskedRegion); i.next();) + { + const Rectangle& r = i.getRectangle(); + ExcludeClipRect (hdc, r.getX(), r.getY(), r.getRight(), r.getBottom()); + } + } + + updateLayeredWindow (hwnd, 0, &pos, &size, hdc, &p, 0, &bf, ULW_ALPHA); + } + else + { + int savedDC = 0; + + if (! maskedRegion.isEmpty()) + { + savedDC = SaveDC (dc); + + for (RectangleList::Iterator i (maskedRegion); i.next();) + { + const Rectangle& r = i.getRectangle(); + ExcludeClipRect (dc, r.getX(), r.getY(), r.getRight(), r.getBottom()); + } + } + + const int w = getWidth(); + const int h = getHeight(); + + if (hdd == 0) + { + StretchDIBits (dc, + x, y, w, h, + 0, 0, w, h, + bitmapData, (const BITMAPINFO*) &bitmapInfo, + DIB_RGB_COLORS, SRCCOPY); + } + else + { + DrawDibDraw (hdd, dc, x, y, -1, -1, + (BITMAPINFOHEADER*) &bitmapInfo, bitmapData, + 0, 0, w, h, 0); + } + + if (! maskedRegion.isEmpty()) + RestoreDC (dc, savedDC); + } + } + + juce_UseDebuggingNewOperator + +private: + WindowsBitmapImage (const WindowsBitmapImage&); + const WindowsBitmapImage& operator= (const WindowsBitmapImage&); +}; + +//============================================================================== +long improbableWindowNumber = 0xf965aa01; // also referenced by messaging.cpp + + +//============================================================================== +static int currentModifiers = 0; + +static void updateKeyModifiers() +{ + currentModifiers &= ~(ModifierKeys::shiftModifier + | ModifierKeys::ctrlModifier + | ModifierKeys::altModifier); + + if ((GetKeyState (VK_SHIFT) & 0x8000) != 0) + currentModifiers |= ModifierKeys::shiftModifier; + + if ((GetKeyState (VK_CONTROL) & 0x8000) != 0) + currentModifiers |= ModifierKeys::ctrlModifier; + + if ((GetKeyState (VK_MENU) & 0x8000) != 0) + currentModifiers |= ModifierKeys::altModifier; +} + +void ModifierKeys::updateCurrentModifiers() +{ + currentModifierFlags = currentModifiers; +} + +bool KeyPress::isKeyCurrentlyDown (int keyCode) +{ + SHORT k = (SHORT) keyCode; + + if ((keyCode & extendedKeyModifier) == 0 + && (k >= (SHORT) T('a') && k <= (SHORT) T('z'))) + k += (SHORT) T('A') - (SHORT) T('a'); + + const SHORT translatedValues[] = { (SHORT) ',', VK_OEM_COMMA, + (SHORT) '+', VK_OEM_PLUS, + (SHORT) '-', VK_OEM_MINUS, + (SHORT) '.', VK_OEM_PERIOD, + (SHORT) ';', VK_OEM_1, + (SHORT) ':', VK_OEM_1, + (SHORT) '/', VK_OEM_2, + (SHORT) '?', VK_OEM_2, + (SHORT) '[', VK_OEM_4, + (SHORT) ']', VK_OEM_6 }; + + for (int i = 0; i < numElementsInArray (translatedValues); i += 2) + if (k == translatedValues [i]) + k = translatedValues [i + 1]; + + return (GetKeyState (k) & 0x8000) != 0; +} + +const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() +{ + updateKeyModifiers(); + + currentModifiers &= ~ModifierKeys::allMouseButtonModifiers; + + if ((GetKeyState (VK_LBUTTON) & 0x8000) != 0) + currentModifiers |= ModifierKeys::leftButtonModifier; + + if ((GetKeyState (VK_RBUTTON) & 0x8000) != 0) + currentModifiers |= ModifierKeys::rightButtonModifier; + + if ((GetKeyState (VK_MBUTTON) & 0x8000) != 0) + currentModifiers |= ModifierKeys::middleButtonModifier; + + return ModifierKeys (currentModifiers); +} + +static int64 getMouseEventTime() +{ + static int64 eventTimeOffset = 0; + static DWORD lastMessageTime = 0; + const DWORD thisMessageTime = GetMessageTime(); + + if (thisMessageTime < lastMessageTime || lastMessageTime == 0) + { + lastMessageTime = thisMessageTime; + eventTimeOffset = Time::currentTimeMillis() - thisMessageTime; + } + + return eventTimeOffset + thisMessageTime; +} + + +//============================================================================== +class Win32ComponentPeer : public ComponentPeer +{ +public: + //============================================================================== + Win32ComponentPeer (Component* const component, + const int windowStyleFlags) + : ComponentPeer (component, windowStyleFlags), + dontRepaint (false), + fullScreen (false), + isDragging (false), + isMouseOver (false), + taskBarIcon (0) + { + juce_initialiseUnicodeWindowFunctions(); + + MessageManager::getInstance() + ->callFunctionOnMessageThread (&createWindowCallback, (void*) this); + + setTitle (component->getName()); + + if ((windowStyleFlags & windowHasDropShadow) != 0 + && Desktop::canUseSemiTransparentWindows()) + { + shadower = component->getLookAndFeel().createDropShadowerForComponent (component); + + if (shadower != 0) + shadower->setOwner (component); + } + else + { + shadower = 0; + } + } + + ~Win32ComponentPeer() + { + setTaskBarIcon (0); + deleteAndZero (shadower); + + // do this before the next bit to avoid messages arriving for this window + // before it's destroyed + SetWindowLongPtr (hwnd, GWLP_USERDATA, 0); + + MessageManager::getInstance() + ->callFunctionOnMessageThread (&destroyWindowCallback, (void*) hwnd); + } + + //============================================================================== + void* getNativeHandle() const + { + return (void*) hwnd; + } + + void setVisible (bool shouldBeVisible) + { + ShowWindow (hwnd, shouldBeVisible ? SW_SHOWNA : SW_HIDE); + + if (shouldBeVisible) + InvalidateRect (hwnd, 0, 0); + else + lastPaintTime = 0; + } + + void setTitle (const String& title) + { + if (wSetWindowTextW != 0) + wSetWindowTextW (hwnd, title); + else + SetWindowText (hwnd, title); + } + + void setPosition (int x, int y) + { + offsetWithinParent (x, y); + SetWindowPos (hwnd, 0, + x - windowBorder.getLeft(), + y - windowBorder.getTop(), + 0, 0, + SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING); + } + + void repaintNowIfTransparent() + { + if (isTransparent() && lastPaintTime > 0 && Time::getMillisecondCounter() > lastPaintTime + 30) + handlePaintMessage(); + } + + void updateBorderSize() + { + WINDOWINFO info; + info.cbSize = sizeof (info); + + if (GetWindowInfo (hwnd, &info)) + { + windowBorder = BorderSize (info.rcClient.top - info.rcWindow.top, + info.rcClient.left - info.rcWindow.left, + info.rcWindow.bottom - info.rcClient.bottom, + info.rcWindow.right - info.rcClient.right); + } + } + + void setSize (int w, int h) + { + SetWindowPos (hwnd, 0, 0, 0, + w + windowBorder.getLeftAndRight(), + h + windowBorder.getTopAndBottom(), + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING); + + updateBorderSize(); + + repaintNowIfTransparent(); + } + + void setBounds (int x, int y, int w, int h, const bool isNowFullScreen) + { + fullScreen = isNowFullScreen; + offsetWithinParent (x, y); + + SetWindowPos (hwnd, 0, + x - windowBorder.getLeft(), + y - windowBorder.getTop(), + w + windowBorder.getLeftAndRight(), + h + windowBorder.getTopAndBottom(), + SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING); + + updateBorderSize(); + + repaintNowIfTransparent(); + } + + void getBounds (int& x, int& y, int& w, int& h) const + { + RECT r; + GetWindowRect (hwnd, &r); + + x = r.left; + y = r.top; + w = r.right - x; + h = r.bottom - y; + + HWND parentH = GetParent (hwnd); + if (parentH != 0) + { + GetWindowRect (parentH, &r); + x -= r.left; + y -= r.top; + } + + x += windowBorder.getLeft(); + y += windowBorder.getTop(); + w -= windowBorder.getLeftAndRight(); + h -= windowBorder.getTopAndBottom(); + } + + int getScreenX() const + { + RECT r; + GetWindowRect (hwnd, &r); + return r.left + windowBorder.getLeft(); + } + + int getScreenY() const + { + RECT r; + GetWindowRect (hwnd, &r); + return r.top + windowBorder.getTop(); + } + + void relativePositionToGlobal (int& x, int& y) + { + RECT r; + GetWindowRect (hwnd, &r); + + x += r.left + windowBorder.getLeft(); + y += r.top + windowBorder.getTop(); + } + + void globalPositionToRelative (int& x, int& y) + { + RECT r; + GetWindowRect (hwnd, &r); + + x -= r.left + windowBorder.getLeft(); + y -= r.top + windowBorder.getTop(); + } + + void setMinimised (bool shouldBeMinimised) + { + if (shouldBeMinimised != isMinimised()) + ShowWindow (hwnd, shouldBeMinimised ? SW_MINIMIZE : SW_SHOWNORMAL); + } + + bool isMinimised() const + { + WINDOWPLACEMENT wp; + wp.length = sizeof (WINDOWPLACEMENT); + GetWindowPlacement (hwnd, &wp); + + return wp.showCmd == SW_SHOWMINIMIZED; + } + + void setFullScreen (bool shouldBeFullScreen) + { + setMinimised (false); + + if (fullScreen != shouldBeFullScreen) + { + fullScreen = shouldBeFullScreen; + const ComponentDeletionWatcher deletionChecker (component); + + if (! fullScreen) + { + if (hasTitleBar()) + ShowWindow (hwnd, SW_SHOWNORMAL); + + if (! lastNonFullscreenBounds.isEmpty()) + { + setBounds (lastNonFullscreenBounds.getX(), + lastNonFullscreenBounds.getY(), + lastNonFullscreenBounds.getWidth(), + lastNonFullscreenBounds.getHeight(), + false); + } + } + else + { + if (hasTitleBar()) + ShowWindow (hwnd, SW_SHOWMAXIMIZED); + else + SendMessage (hwnd, WM_SETTINGCHANGE, 0, 0); + } + + if (! deletionChecker.hasBeenDeleted()) + handleMovedOrResized(); + } + } + + bool isFullScreen() const + { + if (! hasTitleBar()) + return fullScreen; + + WINDOWPLACEMENT wp; + wp.length = sizeof (wp); + GetWindowPlacement (hwnd, &wp); + + return wp.showCmd == SW_SHOWMAXIMIZED; + } + + bool contains (int x, int y, bool trueIfInAChildWindow) const + { + RECT r; + GetWindowRect (hwnd, &r); + + POINT p; + p.x = x + r.left; + p.y = y + r.top; + + HWND w = WindowFromPoint (p); + + return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0)); + } + + const BorderSize getFrameSize() const + { + return windowBorder; + } + + bool setAlwaysOnTop (bool alwaysOnTop) + { + const bool oldDeactivate = shouldDeactivateTitleBar; + shouldDeactivateTitleBar = ((styleFlags & windowIsTemporary) == 0); + + SetWindowPos (hwnd, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, + 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING); + + shouldDeactivateTitleBar = oldDeactivate; + + if (shadower != 0) + shadower->componentBroughtToFront (*component); + + return true; + } + + void toFront (bool makeActive) + { + setMinimised (false); + + const bool oldDeactivate = shouldDeactivateTitleBar; + shouldDeactivateTitleBar = ((styleFlags & windowIsTemporary) == 0); + + MessageManager::getInstance() + ->callFunctionOnMessageThread (makeActive ? &toFrontCallback1 + : &toFrontCallback2, + (void*) hwnd); + + shouldDeactivateTitleBar = oldDeactivate; + + if (! makeActive) + { + // in this case a broughttofront call won't have occured, so do it now.. + handleBroughtToFront(); + } + } + + void toBehind (ComponentPeer* other) + { + Win32ComponentPeer* const otherPeer = dynamic_cast (other); + + jassert (otherPeer != 0); // wrong type of window? + + if (otherPeer != 0) + { + setMinimised (false); + + SetWindowPos (hwnd, otherPeer->hwnd, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING); + } + } + + bool isFocused() const + { + return MessageManager::getInstance() + ->callFunctionOnMessageThread (&getFocusCallback, 0) == (void*) hwnd; + } + + void grabFocus() + { + const bool oldDeactivate = shouldDeactivateTitleBar; + shouldDeactivateTitleBar = ((styleFlags & windowIsTemporary) == 0); + + MessageManager::getInstance() + ->callFunctionOnMessageThread (&setFocusCallback, (void*) hwnd); + + shouldDeactivateTitleBar = oldDeactivate; + } + + void repaint (int x, int y, int w, int h) + { + const RECT r = { x, y, x + w, y + h }; + InvalidateRect (hwnd, &r, FALSE); + } + + void performAnyPendingRepaintsNow() + { + MSG m; + if (component->isVisible() && PeekMessage (&m, hwnd, WM_PAINT, WM_PAINT, PM_REMOVE)) + DispatchMessage (&m); + } + + //============================================================================== + static Win32ComponentPeer* getOwnerOfWindow (HWND h) + { + if (h != 0 && GetWindowLongPtr (h, GWLP_USERDATA) == improbableWindowNumber) + return (Win32ComponentPeer*) GetWindowLongPtr (h, 8); + + return 0; + } + + //============================================================================== + void setTaskBarIcon (const Image* const image) + { + if (image != 0) + { + HICON hicon = createHICONFromImage (*image, TRUE, 0, 0); + + if (taskBarIcon == 0) + { + taskBarIcon = new NOTIFYICONDATA(); + taskBarIcon->cbSize = sizeof (NOTIFYICONDATA); + taskBarIcon->hWnd = (HWND) hwnd; + taskBarIcon->uID = (int) (pointer_sized_int) hwnd; + taskBarIcon->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + taskBarIcon->uCallbackMessage = WM_TRAYNOTIFY; + taskBarIcon->hIcon = hicon; + taskBarIcon->szTip[0] = 0; + + Shell_NotifyIcon (NIM_ADD, taskBarIcon); + } + else + { + HICON oldIcon = taskBarIcon->hIcon; + + taskBarIcon->hIcon = hicon; + taskBarIcon->uFlags = NIF_ICON; + Shell_NotifyIcon (NIM_MODIFY, taskBarIcon); + + DestroyIcon (oldIcon); + } + + DestroyIcon (hicon); + } + else if (taskBarIcon != 0) + { + taskBarIcon->uFlags = 0; + Shell_NotifyIcon (NIM_DELETE, taskBarIcon); + DestroyIcon (taskBarIcon->hIcon); + deleteAndZero (taskBarIcon); + } + } + + void setTaskBarIconToolTip (const String& toolTip) const + { + if (taskBarIcon != 0) + { + taskBarIcon->uFlags = NIF_TIP; + toolTip.copyToBuffer (taskBarIcon->szTip, sizeof (taskBarIcon->szTip) - 1); + Shell_NotifyIcon (NIM_MODIFY, taskBarIcon); + } + } + + //============================================================================== + juce_UseDebuggingNewOperator + + bool dontRepaint; + +private: + HWND hwnd; + DropShadower* shadower; + bool fullScreen, isDragging, isMouseOver; + BorderSize windowBorder; + NOTIFYICONDATA* taskBarIcon; + friend class WindowClassHolder; + + //============================================================================== + class TemporaryImage : public Timer + { + public: + //============================================================================== + TemporaryImage() + : image (0) + { + } + + ~TemporaryImage() + { + delete image; + } + + //============================================================================== + WindowsBitmapImage* getImage (const bool transparent, const int w, const int h) + { + const Image::PixelFormat format = transparent ? Image::ARGB : Image::RGB; + + if (image == 0 || image->getWidth() < w || image->getHeight() < h || image->getFormat() != format) + { + delete image; + image = new WindowsBitmapImage (format, (w + 31) & ~31, (h + 31) & ~31, false); + } + + startTimer (3000); + return image; + } + + //============================================================================== + void timerCallback() + { + stopTimer(); + deleteAndZero (image); + } + + private: + WindowsBitmapImage* image; + + TemporaryImage (const TemporaryImage&); + const TemporaryImage& operator= (const TemporaryImage&); + }; + + TemporaryImage offscreenImageGenerator; + + //============================================================================== + static void* createWindowCallback (void* userData) + { + ((Win32ComponentPeer*) userData)->createWindow(); + return 0; + } + + class WindowClassHolder : public DeletedAtShutdown + { + public: + WindowClassHolder() + : windowClassName (T("JUCE_")) + { + // this name has to be different for each app/dll instance because otherwise + // poor old Win32 can get a bit confused (even despite it not being a process-global + // window class). + windowClassName << (int) (Time::currentTimeMillis() & 0x7fffffff); + + HINSTANCE moduleHandle = (HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle(); + + TCHAR moduleFile [1024]; + moduleFile[0] = 0; + GetModuleFileName (moduleHandle, moduleFile, 1024); + WORD iconNum = 0; + + if (wRegisterClassExW != 0) + { + WNDCLASSEXW wcex; + wcex.cbSize = sizeof (wcex); + wcex.style = CS_OWNDC; + wcex.lpfnWndProc = (WNDPROC) windowProc; + wcex.lpszClassName = windowClassName; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 32; + wcex.hInstance = moduleHandle; + wcex.hIcon = ExtractAssociatedIcon (moduleHandle, moduleFile, &iconNum); + iconNum = 1; + wcex.hIconSm = ExtractAssociatedIcon (moduleHandle, moduleFile, &iconNum); + wcex.hCursor = 0; + wcex.hbrBackground = 0; + wcex.lpszMenuName = 0; + + wRegisterClassExW (&wcex); + } + else + { + WNDCLASSEX wcex; + wcex.cbSize = sizeof (wcex); + wcex.style = CS_OWNDC; + wcex.lpfnWndProc = (WNDPROC) windowProc; + wcex.lpszClassName = windowClassName; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 32; + wcex.hInstance = moduleHandle; + wcex.hIcon = ExtractAssociatedIcon (moduleHandle, moduleFile, &iconNum); + iconNum = 1; + wcex.hIconSm = ExtractAssociatedIcon (moduleHandle, moduleFile, &iconNum); + wcex.hCursor = 0; + wcex.hbrBackground = 0; + wcex.lpszMenuName = 0; + + RegisterClassEx (&wcex); + } + } + + ~WindowClassHolder() + { + if (ComponentPeer::getNumPeers() == 0) + UnregisterClass (windowClassName, (HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle()); + } + + String windowClassName; + }; + + void createWindow() + { + DWORD exstyle = WS_EX_ACCEPTFILES; + DWORD type = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + + if (hasTitleBar()) + { + type |= WS_OVERLAPPED; + exstyle |= WS_EX_APPWINDOW; + + if ((styleFlags & windowHasCloseButton) != 0) + { + type |= WS_SYSMENU; + } + else + { + // annoyingly, windows won't let you have a min/max button without a close button + jassert ((styleFlags & (windowHasMinimiseButton | windowHasMaximiseButton)) == 0); + } + + if ((styleFlags & windowIsResizable) != 0) + type |= WS_THICKFRAME; + } + else + { + type |= WS_POPUP | WS_SYSMENU; + + if ((styleFlags & windowAppearsOnTaskbar) == 0) + exstyle |= WS_EX_TOOLWINDOW; + else + exstyle |= WS_EX_APPWINDOW; + } + + if ((styleFlags & windowHasMinimiseButton) != 0) + type |= WS_MINIMIZEBOX; + + if ((styleFlags & windowHasMaximiseButton) != 0) + type |= WS_MAXIMIZEBOX; + + if ((styleFlags & windowIgnoresMouseClicks) != 0) + exstyle |= WS_EX_TRANSPARENT; + + if ((styleFlags & juce_windowIsSemiTransparentFlag) != 0 + && Desktop::canUseSemiTransparentWindows()) + exstyle |= WS_EX_LAYERED; + + static WindowClassHolder* windowClassHolder = 0; + + if (windowClassHolder == 0) + windowClassHolder = new WindowClassHolder(); + + if (wCreateWindowExW != 0) + hwnd = wCreateWindowExW (exstyle, windowClassHolder->windowClassName, L"", type, 0, 0, 0, 0, 0, 0, 0, 0); + else + hwnd = CreateWindowEx (exstyle, windowClassHolder->windowClassName, _T(""), type, 0, 0, 0, 0, 0, 0, 0, 0); + + if (hwnd != 0) + { + SetWindowLongPtr (hwnd, 0, 0); + SetWindowLongPtr (hwnd, 8, (LONG_PTR) this); + SetWindowLongPtr (hwnd, GWLP_USERDATA, improbableWindowNumber); + + DragAcceptFiles (hwnd, TRUE); + + updateBorderSize(); + + // Calling this function here is (for some reason) necessary to make Windows + // correctly enable the menu items that we specify in the wm_initmenu message. + GetSystemMenu (hwnd, false); + } + else + { + jassertfalse + } + } + + static void* destroyWindowCallback (void* handle) + { + DestroyWindow ((HWND) handle); + return 0; + } + + static void* toFrontCallback1 (void* h) + { + SetForegroundWindow ((HWND) h); + return 0; + } + + static void* toFrontCallback2 (void* h) + { + SetWindowPos ((HWND) h, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING); + return 0; + } + + static void* setFocusCallback (void* h) + { + SetFocus ((HWND) h); + return 0; + } + + static void* getFocusCallback (void*) + { + return (void*) GetFocus(); + } + + void offsetWithinParent (int& x, int& y) const + { + if (isTransparent()) + { + HWND parentHwnd = GetParent (hwnd); + + if (parentHwnd != 0) + { + RECT parentRect; + GetWindowRect (parentHwnd, &parentRect); + x += parentRect.left; + y += parentRect.top; + } + } + } + + bool isTransparent() const + { + return (GetWindowLong (hwnd, GWL_EXSTYLE) & WS_EX_LAYERED) != 0; + } + + inline bool hasTitleBar() const throw() { return (styleFlags & windowHasTitleBar) != 0; } + + //============================================================================== + void handlePaintMessage() + { +#if DEBUG_REPAINT_TIMES + const double paintStart = Time::getMillisecondCounterHiRes(); +#endif + HRGN rgn = CreateRectRgn (0, 0, 0, 0); + const int regionType = GetUpdateRgn (hwnd, rgn, false); + + PAINTSTRUCT paintStruct; + HDC dc = BeginPaint (hwnd, &paintStruct); // Note this can immediately generate a WM_NCPAINT + // message and become re-entrant, but that's OK + + // if something in a paint handler calls, e.g. a message box, this can become reentrant and + // corrupt the image it's using to paint into, so do a check here. + static bool reentrant = false; + if (reentrant) + { + DeleteObject (rgn); + EndPaint (hwnd, &paintStruct); + return; + } + + reentrant = true; + + // this is the rectangle to update.. + int x = paintStruct.rcPaint.left; + int y = paintStruct.rcPaint.top; + int w = paintStruct.rcPaint.right - x; + int h = paintStruct.rcPaint.bottom - y; + + const bool transparent = isTransparent(); + + if (transparent) + { + // it's not possible to have a transparent window with a title bar at the moment! + jassert (! hasTitleBar()); + + RECT r; + GetWindowRect (hwnd, &r); + x = y = 0; + w = r.right - r.left; + h = r.bottom - r.top; + } + + if (w > 0 && h > 0) + { + clearMaskedRegion(); + + WindowsBitmapImage* const offscreenImage = offscreenImageGenerator.getImage (transparent, w, h); + + LowLevelGraphicsSoftwareRenderer context (*offscreenImage); + + RectangleList* const contextClip = context.getRawClipRegion(); + contextClip->clear(); + + context.setOrigin (-x, -y); + + bool needToPaintAll = true; + + if (regionType == COMPLEXREGION && ! transparent) + { + HRGN clipRgn = CreateRectRgnIndirect (&paintStruct.rcPaint); + CombineRgn (rgn, rgn, clipRgn, RGN_AND); + DeleteObject (clipRgn); + + char rgnData [8192]; + const DWORD res = GetRegionData (rgn, sizeof (rgnData), (RGNDATA*) rgnData); + + if (res > 0 && res <= sizeof (rgnData)) + { + const RGNDATAHEADER* const hdr = &(((const RGNDATA*) rgnData)->rdh); + + if (hdr->iType == RDH_RECTANGLES + && hdr->rcBound.right - hdr->rcBound.left >= w + && hdr->rcBound.bottom - hdr->rcBound.top >= h) + { + needToPaintAll = false; + + const RECT* rects = (const RECT*) (rgnData + sizeof (RGNDATAHEADER)); + int num = ((RGNDATA*) rgnData)->rdh.nCount; + + while (--num >= 0) + { + // (need to move this one pixel to the left because of a win32 bug) + const int cx = jmax (x, rects->left - 1); + const int cy = rects->top; + const int cw = rects->right - cx; + const int ch = rects->bottom - rects->top; + + if (cx + cw - x <= w && cy + ch - y <= h) + { + contextClip->addWithoutMerging (Rectangle (cx - x, cy - y, cw, ch)); + } + else + { + needToPaintAll = true; + break; + } + + ++rects; + } + } + } + } + + if (needToPaintAll) + { + contextClip->clear(); + contextClip->addWithoutMerging (Rectangle (0, 0, w, h)); + } + + if (transparent) + { + RectangleList::Iterator i (*contextClip); + + while (i.next()) + { + const Rectangle& r = i.getRectangle(); + offscreenImage->clear (r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + } + + // if the component's not opaque, this won't draw properly unless the platform can support this + jassert (Desktop::canUseSemiTransparentWindows() || component->isOpaque()); + + updateCurrentModifiers(); + + handlePaint (context); + + if (! dontRepaint) + offscreenImage->blitToWindow (hwnd, dc, transparent, x, y, maskedRegion); + } + + DeleteObject (rgn); + EndPaint (hwnd, &paintStruct); + reentrant = false; + +#ifndef JUCE_GCC //xxx should add this fn for gcc.. + _fpreset(); // because some graphics cards can unmask FP exceptions +#endif + + lastPaintTime = Time::getMillisecondCounter(); + +#if DEBUG_REPAINT_TIMES + const double elapsed = Time::getMillisecondCounterHiRes() - paintStart; + Logger::outputDebugString (T("repaint time: ") + String (elapsed, 2)); +#endif + } + + //============================================================================== + void doMouseMove (const int x, const int y) + { + static uint32 lastMouseTime = 0; + // this can be set to throttle the mouse-messages to less than a + // certain number per second, as things can get unresponsive + // if each drag or move callback has to do a lot of work. + const int maxMouseMovesPerSecond = 60; + + const int64 mouseEventTime = getMouseEventTime(); + + if (! isMouseOver) + { + isMouseOver = true; + + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof (tme); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + tme.dwHoverTime = 0; + + if (! TrackMouseEvent (&tme)) + { + jassertfalse; + } + + updateKeyModifiers(); + handleMouseEnter (x, y, mouseEventTime); + } + else if (! isDragging) + { + if (x >= 0 && y >= 0 + && x < component->getWidth() + && y < component->getHeight()) + { + RECT r; + GetWindowRect (hwnd, &r); + + POINT p; + p.x = x + r.left + windowBorder.getLeft(); + p.y = y + r.top + windowBorder.getTop(); + + if (WindowFromPoint (p) == hwnd) + { + const uint32 now = Time::getMillisecondCounter(); + + if (now > lastMouseTime + 1000 / maxMouseMovesPerSecond) + { + lastMouseTime = now; + handleMouseMove (x, y, mouseEventTime); + } + } + } + } + else + { + const uint32 now = Time::getMillisecondCounter(); + + if (now > lastMouseTime + 1000 / maxMouseMovesPerSecond) + { + lastMouseTime = now; + handleMouseDrag (x, y, mouseEventTime); + } + } + } + + void doMouseDown (const int x, const int y, const WPARAM wParam) + { + if (GetCapture() != hwnd) + SetCapture (hwnd); + + doMouseMove (x, y); + + currentModifiers &= ~ModifierKeys::allMouseButtonModifiers; + + if ((wParam & MK_LBUTTON) != 0) + currentModifiers |= ModifierKeys::leftButtonModifier; + + if ((wParam & MK_RBUTTON) != 0) + currentModifiers |= ModifierKeys::rightButtonModifier; + + if ((wParam & MK_MBUTTON) != 0) + currentModifiers |= ModifierKeys::middleButtonModifier; + + updateKeyModifiers(); + isDragging = true; + + handleMouseDown (x, y, getMouseEventTime()); + } + + void doMouseUp (const int x, const int y, const WPARAM wParam) + { + int numButtons = 0; + + if ((wParam & MK_LBUTTON) != 0) + ++numButtons; + + if ((wParam & MK_RBUTTON) != 0) + ++numButtons; + + if ((wParam & MK_MBUTTON) != 0) + ++numButtons; + + const int oldModifiers = currentModifiers; + + // update the currentmodifiers only after the callback, so the callback + // knows which button was released. + currentModifiers &= ~ModifierKeys::allMouseButtonModifiers; + + if ((wParam & MK_LBUTTON) != 0) + currentModifiers |= ModifierKeys::leftButtonModifier; + + if ((wParam & MK_RBUTTON) != 0) + currentModifiers |= ModifierKeys::rightButtonModifier; + + if ((wParam & MK_MBUTTON) != 0) + currentModifiers |= ModifierKeys::middleButtonModifier; + + updateKeyModifiers(); + isDragging = false; + + // release the mouse capture if the user's not still got a button down + if (numButtons == 0 && hwnd == GetCapture()) + ReleaseCapture(); + + handleMouseUp (oldModifiers, x, y, getMouseEventTime()); + } + + void doCaptureChanged() + { + if (isDragging) + { + RECT wr; + GetWindowRect (hwnd, &wr); + + const DWORD mp = GetMessagePos(); + + doMouseUp (GET_X_LPARAM (mp) - wr.left - windowBorder.getLeft(), + GET_Y_LPARAM (mp) - wr.top - windowBorder.getTop(), + getMouseEventTime()); + } + } + + void doMouseExit() + { + if (isMouseOver) + { + isMouseOver = false; + RECT wr; + GetWindowRect (hwnd, &wr); + + const DWORD mp = GetMessagePos(); + + handleMouseExit (GET_X_LPARAM (mp) - wr.left - windowBorder.getLeft(), + GET_Y_LPARAM (mp) - wr.top - windowBorder.getTop(), + getMouseEventTime()); + } + } + + void doMouseWheel (const WPARAM wParam, const bool isVertical) + { + updateKeyModifiers(); + + const int amount = jlimit (-1000, 1000, (int) (0.75f * (short) HIWORD (wParam))); + + handleMouseWheel (isVertical ? 0 : amount, + isVertical ? amount : 0, + getMouseEventTime()); + } + + //============================================================================== + void doKeyUp (const WPARAM key) + { + updateKeyModifiers(); + + switch (key) + { + case VK_SHIFT: + case VK_CONTROL: + case VK_MENU: + case VK_CAPITAL: + case VK_LWIN: + case VK_RWIN: + case VK_APPS: + case VK_NUMLOCK: + case VK_SCROLL: + case VK_LSHIFT: + case VK_RSHIFT: + case VK_LCONTROL: + case VK_LMENU: + case VK_RCONTROL: + case VK_RMENU: + handleModifierKeysChange(); + } + + handleKeyUpOrDown(); + } + + void doKeyDown (const WPARAM key) + { + updateKeyModifiers(); + + switch (key) + { + case VK_SHIFT: + case VK_LSHIFT: + case VK_RSHIFT: + case VK_CONTROL: + case VK_LCONTROL: + case VK_RCONTROL: + case VK_MENU: + case VK_LMENU: + case VK_RMENU: + case VK_LWIN: + case VK_RWIN: + case VK_CAPITAL: + case VK_NUMLOCK: + case VK_SCROLL: + case VK_APPS: + handleModifierKeysChange(); + break; + + case VK_LEFT: + case VK_RIGHT: + case VK_UP: + case VK_DOWN: + case VK_PRIOR: + case VK_NEXT: + case VK_HOME: + case VK_END: + case VK_DELETE: + case VK_INSERT: + case VK_F1: + case VK_F2: + case VK_F3: + case VK_F4: + case VK_F5: + case VK_F6: + case VK_F7: + case VK_F8: + case VK_F9: + case VK_F10: + case VK_F11: + case VK_F12: + case VK_F13: + case VK_F14: + case VK_F15: + case VK_F16: + handleKeyUpOrDown(); + handleKeyPress (extendedKeyModifier | (int) key, 0); + break; + + case VK_NUMPAD0: + case VK_NUMPAD1: + case VK_NUMPAD2: + case VK_NUMPAD3: + case VK_NUMPAD4: + case VK_NUMPAD5: + case VK_NUMPAD6: + case VK_NUMPAD7: + case VK_NUMPAD8: + case VK_NUMPAD9: + case VK_ADD: + case VK_SUBTRACT: + case VK_MULTIPLY: + case VK_DIVIDE: + case VK_SEPARATOR: + case VK_DECIMAL: + handleKeyUpOrDown(); + break; + + default: + handleKeyUpOrDown(); + + if ((currentModifiers & (ModifierKeys::ctrlModifier | ModifierKeys::altModifier)) != 0) + { + UINT keyChar = wMapVirtualKeyW != 0 ? wMapVirtualKeyW (key, 2) + : MapVirtualKey (key, 2); + + handleKeyPress ((int) LOWORD (keyChar), 0); + } + + break; + } + } + + void doKeyChar (int key, const LPARAM flags) + { + updateKeyModifiers(); + + if ((currentModifiers & ModifierKeys::ctrlModifier) != 0 + && key <= 31) + { + return; + } + + const juce_wchar textChar = (juce_wchar) key; + + if (key >= '0' && key <= '9') + { + switch ((flags >> 16) & 0xff) // check for a numeric keypad scan-code + { + case 0x52: + case 0x4f: + case 0x50: + case 0x51: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x47: + case 0x48: + case 0x49: + key = (key - '0') + KeyPress::numberPad0; + break; + default: + break; + } + } + + handleKeyPress (key, textChar); + } + + bool doAppCommand (const LPARAM lParam) + { + int key = 0; + + switch (GET_APPCOMMAND_LPARAM (lParam)) + { + case APPCOMMAND_MEDIA_PLAY_PAUSE: + key = KeyPress::playKey; + break; + + case APPCOMMAND_MEDIA_STOP: + key = KeyPress::stopKey; + break; + + case APPCOMMAND_MEDIA_NEXTTRACK: + key = KeyPress::fastForwardKey; + break; + + case APPCOMMAND_MEDIA_PREVIOUSTRACK: + key = KeyPress::rewindKey; + break; + } + + if (key != 0) + { + updateKeyModifiers(); + + if (hwnd == GetActiveWindow()) + { + handleKeyPress (key, 0); + return true; + } + } + + return false; + } + + //============================================================================== + void doDroppedFiles (HDROP hdrop) + { + POINT p; + DragQueryPoint (hdrop, &p); + + const int numFiles = DragQueryFile (hdrop, 0xffffffff, 0, 0); + StringArray files; + + const int size = sizeof (WCHAR) * MAX_PATH * 2 + 8; + char* const name = (char*) juce_calloc (size); + + for (int i = 0; i < numFiles; ++i) + { + if (wDragQueryFileW != 0) + { + wDragQueryFileW (hdrop, i, (LPWSTR) name, MAX_PATH); + files.add ((LPWSTR) name); + } + else + { + DragQueryFile (hdrop, i, (LPSTR) name, MAX_PATH); + files.add ((LPSTR) name); + } + } + + juce_free (name); + DragFinish (hdrop); + + handleFilesDropped (p.x, p.y, files); + } + + void doSettingChange() + { + Desktop::getInstance().refreshMonitorSizes(); + + if (fullScreen && ! isMinimised()) + { + const Rectangle r (component->getParentMonitorArea()); + + SetWindowPos (hwnd, 0, + r.getX(), r.getY(), r.getWidth(), r.getHeight(), + SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOSENDCHANGING); + } + } + + //============================================================================== +public: + static LRESULT CALLBACK windowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) + { + Win32ComponentPeer* const peer = getOwnerOfWindow (h); + + if (peer != 0) + return peer->peerWindowProc (h, message, wParam, lParam); + + return DefWindowProc (h, message, wParam, lParam); + } + +private: + LRESULT peerWindowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) + { + { + const MessageManagerLock messLock; + + if (isValidPeer (this)) + { + switch (message) + { + case WM_NCHITTEST: + if (hasTitleBar()) + break; + + return HTCLIENT; + + //============================================================================== + case WM_PAINT: + handlePaintMessage(); + return 0; + + case WM_NCPAINT: + if (wParam != 1) + handlePaintMessage(); + + if (hasTitleBar()) + break; + + return 0; + + case WM_ERASEBKGND: + case WM_NCCALCSIZE: + if (hasTitleBar()) + break; + + return 1; + + //============================================================================== + case WM_MOUSEMOVE: + doMouseMove (GET_X_LPARAM (lParam), GET_Y_LPARAM (lParam)); + return 0; + + case WM_MOUSELEAVE: + doMouseExit(); + return 0; + + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + doMouseDown (GET_X_LPARAM (lParam), GET_Y_LPARAM (lParam), wParam); + return 0; + + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + doMouseUp (GET_X_LPARAM (lParam), GET_Y_LPARAM (lParam), wParam); + return 0; + + case WM_CAPTURECHANGED: + doCaptureChanged(); + return 0; + + case WM_NCMOUSEMOVE: + if (hasTitleBar()) + break; + + return 0; + + case 0x020A: /* WM_MOUSEWHEEL */ + doMouseWheel (wParam, true); + return 0; + + case 0x020E: /* WM_MOUSEHWHEEL */ + doMouseWheel (wParam, false); + return 0; + + //============================================================================== + case WM_WINDOWPOSCHANGING: + if ((styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) + { + WINDOWPOS* const wp = (WINDOWPOS*) lParam; + + if ((wp->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE)) + { + if (constrainer != 0) + { + const Rectangle current (component->getX() - windowBorder.getLeft(), + component->getY() - windowBorder.getTop(), + component->getWidth() + windowBorder.getLeftAndRight(), + component->getHeight() + windowBorder.getTopAndBottom()); + + constrainer->checkBounds (wp->x, wp->y, wp->cx, wp->cy, + current, + Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), + wp->y != current.getY() && wp->y + wp->cy == current.getBottom(), + wp->x != current.getX() && wp->x + wp->cx == current.getRight(), + wp->y == current.getY() && wp->y + wp->cy != current.getBottom(), + wp->x == current.getX() && wp->x + wp->cx != current.getRight()); + } + } + } + + return 0; + + case WM_WINDOWPOSCHANGED: + handleMovedOrResized(); + + if (dontRepaint) + break; // needed for non-accelerated openGL windows to draw themselves correctly.. + else + return 0; + + //============================================================================== + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + doKeyDown (wParam); + break; + + case WM_KEYUP: + case WM_SYSKEYUP: + doKeyUp (wParam); + return 0; + + case WM_APPCOMMAND: + if (doAppCommand (lParam)) + return TRUE; + else + break; + + case WM_CHAR: + doKeyChar ((int) wParam, lParam); + break; + + //============================================================================== + case WM_SETFOCUS: + updateKeyModifiers(); + handleFocusGain(); + break; + + case WM_KILLFOCUS: + handleFocusLoss(); + break; + + case WM_ACTIVATEAPP: + // Windows does weird things to process priority when you swap apps, + // so this forces an update when the app is brought to the front + if (wParam != FALSE) + repeatLastProcessPriority(); + + juce_CheckCurrentlyFocusedTopLevelWindow(); + return 0; + + case WM_ACTIVATE: + if (LOWORD (wParam) == WA_ACTIVE || LOWORD (wParam) == WA_CLICKACTIVE) + { + updateKeyModifiers(); + + if (isMinimised()) + { + component->repaint(); + handleMovedOrResized(); + + if (! isValidMessageListener()) + return 0; + } + + if (LOWORD (wParam) == WA_CLICKACTIVE + && component->isCurrentlyBlockedByAnotherModalComponent()) + { + int mx, my; + component->getMouseXYRelative (mx, my); + Component* const underMouse = component->getComponentAt (mx, my); + + if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent()) + Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); + + return 0; + } + + handleBroughtToFront(); + return 0; + } + + break; + + case WM_NCACTIVATE: + // while a temporary window is being shown, prevent Windows from deactivating the + // title bars of our main windows. + if (wParam == 0 && ! shouldDeactivateTitleBar) + wParam = TRUE; // change this and let it get passed to the DefWindowProc. + + break; + + case WM_MOUSEACTIVATE: + if (! component->getMouseClickGrabsKeyboardFocus()) + return MA_NOACTIVATE; + + break; + + case WM_SHOWWINDOW: + if (wParam != 0) + handleBroughtToFront(); + + break; + + case WM_CLOSE: + handleUserClosingWindow(); + return 0; + + //============================================================================== + case WM_DROPFILES: + doDroppedFiles ((HDROP) wParam); + break; + + case WM_TRAYNOTIFY: + if (component->isCurrentlyBlockedByAnotherModalComponent()) + { + if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN + || lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) + { + Component* const current = Component::getCurrentlyModalComponent(); + + if (current != 0) + current->inputAttemptWhenModal(); + } + } + else + { + MouseEvent e (0, 0, ModifierKeys::getCurrentModifiersRealtime(), component, + getMouseEventTime(), 0, 0, getMouseEventTime(), 1, false); + + if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN) + { + SetFocus (hwnd); + SetForegroundWindow (hwnd); + + component->mouseDown (e); + } + else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) + component->mouseUp (e); + else if (lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) + component->mouseDoubleClick (e); + else if (lParam == WM_MOUSEMOVE) + component->mouseMove (e); + } + + break; + + //============================================================================== + case WM_SYNCPAINT: + return 0; + + case WM_PALETTECHANGED: + InvalidateRect (h, 0, 0); + break; + + case WM_DISPLAYCHANGE: + InvalidateRect (h, 0, 0); + createPaletteIfNeeded = true; + handleScreenSizeChange(); + // intentional fall-through... + case WM_SETTINGCHANGE: // note the fall-through in the previous case! + doSettingChange(); + break; + + case WM_INITMENU: + if (! hasTitleBar()) + { + if (isFullScreen()) + { + EnableMenuItem ((HMENU) wParam, SC_RESTORE, MF_BYCOMMAND | MF_ENABLED); + EnableMenuItem ((HMENU) wParam, SC_MOVE, MF_BYCOMMAND | MF_GRAYED); + } + else if (! isMinimised()) + { + EnableMenuItem ((HMENU) wParam, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED); + } + } + break; + + case WM_SYSCOMMAND: + if (hasTitleBar()) + { + switch (wParam & 0xfff0) + { + case SC_CLOSE: + PostMessage (h, WM_CLOSE, 0, 0); + return 0; + + case SC_KEYMENU: + if (h == GetCapture()) + ReleaseCapture(); + break; + + case SC_MAXIMIZE: + setFullScreen (true); + return 0; + + case SC_RESTORE: + if (isFullScreen()) + { + setFullScreen (false); + return 0; + } + break; + } + } + else + { + switch (wParam & 0xfff0) + { + case SC_MINIMIZE: + setMinimised(true); + return 0; + + case SC_MAXIMIZE: + setFullScreen(true); + return 0; + + case SC_RESTORE: + if (isMinimised()) + setMinimised (false); + else if (isFullScreen()) + setFullScreen (false); + + return 0; + } + } + + break; + + case WM_NCLBUTTONDOWN: + case WM_NCRBUTTONDOWN: + case WM_NCMBUTTONDOWN: + if (component->isCurrentlyBlockedByAnotherModalComponent()) + { + Component* const current = Component::getCurrentlyModalComponent(); + + if (current != 0) + current->inputAttemptWhenModal(); + } + + break; + + //case WM_IME_STARTCOMPOSITION; + // return 0; + + default: + break; + } + } + } + + // (the message manager lock exits before calling this, to avoid deadlocks if + // this calls into non-juce windows) + return DefWindowProc (h, message, wParam, lParam); + } + + Win32ComponentPeer (const Win32ComponentPeer&); + const Win32ComponentPeer& operator= (const Win32ComponentPeer&); +}; + + +ComponentPeer* Component::createNewPeer (int styleFlags, void* /*nativeWindowToAttachTo*/) +{ + return new Win32ComponentPeer (this, styleFlags); +} + +//============================================================================== +void SystemTrayIconComponent::setIconImage (const Image& newImage) +{ + Win32ComponentPeer* const wp = dynamic_cast (getPeer()); + + if (wp != 0) + wp->setTaskBarIcon (&newImage); +} + +void SystemTrayIconComponent::setIconTooltip (const String& tooltip) +{ + Win32ComponentPeer* const wp = dynamic_cast (getPeer()); + + if (wp != 0) + wp->setTaskBarIconToolTip (tooltip); +} + +//============================================================================== +void juce_setWindowStyleBit (HWND h, int styleType, int feature, bool bitIsSet) +{ + DWORD val = GetWindowLong (h, styleType); + + if (bitIsSet) + val |= feature; + else + val &= ~feature; + + SetWindowLongPtr (h, styleType, val); + SetWindowPos (h, 0, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER + | SWP_NOOWNERZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); +} + + +//============================================================================== +bool Process::isForegroundProcess() +{ + HWND fg = GetForegroundWindow(); + + if (fg == 0) + return true; + + DWORD processId = 0; + GetWindowThreadProcessId (fg, &processId); + + return processId == GetCurrentProcessId(); +} + +//============================================================================== +void Desktop::getMousePosition (int& x, int& y) +{ + POINT mousePos; + GetCursorPos (&mousePos); + x = mousePos.x; + y = mousePos.y; +} + +void Desktop::setMousePosition (int x, int y) +{ + SetCursorPos (x, y); +} + +//============================================================================== +BOOL CALLBACK enumMonitorsProc (HMONITOR, HDC, LPRECT r, LPARAM userInfo) +{ + Array * const monitorCoords = (Array *) userInfo; + + monitorCoords->add (Rectangle (r->left, r->top, r->right - r->left, r->bottom - r->top)); + + return TRUE; +} + +void juce_updateMultiMonitorInfo (Array & monitorCoords, const bool clipToWorkArea) +{ + DynamicLibraryLoader user32Dll ("user32.dll"); + DynamicLibraryImport (EnumDisplayMonitors, enumDisplayMonitors, BOOL, user32Dll, + (HDC hdc, LPCRECT lprcClip, MONITORENUMPROC, LPARAM)) + + if (enumDisplayMonitors != 0) + enumDisplayMonitors (0, 0, &enumMonitorsProc, (LPARAM) &monitorCoords); + + // make sure the first in the list is the main monitor + for (int i = 1; i < monitorCoords.size(); ++i) + if (monitorCoords[i].getX() == 0 && monitorCoords[i].getY() == 0) + monitorCoords.swap (i, 0); + + if (monitorCoords.size() == 0) + { + RECT r; + GetWindowRect (GetDesktopWindow(), &r); + + monitorCoords.add (Rectangle (r.left, r.top, r.right - r.left, r.bottom - r.top)); + } + + if (clipToWorkArea) + { + // clip the main monitor to the active non-taskbar area + RECT r; + SystemParametersInfo (SPI_GETWORKAREA, 0, &r, 0); + + Rectangle& screen = monitorCoords.getReference (0); + + screen.setPosition (jmax (screen.getX(), r.left), + jmax (screen.getY(), r.top)); + + screen.setSize (jmin (screen.getRight(), r.right) - screen.getX(), + jmin (screen.getBottom(), r.bottom) - screen.getY()); + } +} + +//============================================================================== +static Image* createImageFromHBITMAP (HBITMAP bitmap) +{ + Image* im = 0; + + if (bitmap != 0) + { + BITMAP bm; + + if (GetObject (bitmap, sizeof (BITMAP), &bm) + && bm.bmWidth > 0 && bm.bmHeight > 0) + { + HDC tempDC = GetDC (0); + HDC dc = CreateCompatibleDC (tempDC); + ReleaseDC (0, tempDC); + + SelectObject (dc, bitmap); + + im = new Image (Image::ARGB, bm.bmWidth, bm.bmHeight, true); + + for (int y = bm.bmHeight; --y >= 0;) + { + for (int x = bm.bmWidth; --x >= 0;) + { + COLORREF col = GetPixel (dc, x, y); + + im->setPixelAt (x, y, Colour ((uint8) GetRValue (col), + (uint8) GetGValue (col), + (uint8) GetBValue (col))); + } + } + + DeleteDC (dc); + } + } + + return im; +} + +static Image* createImageFromHICON (HICON icon) +{ + ICONINFO info; + + if (GetIconInfo (icon, &info)) + { + Image* const mask = createImageFromHBITMAP (info.hbmMask); + + if (mask == 0) + return 0; + + Image* const image = createImageFromHBITMAP (info.hbmColor); + + if (image == 0) + return mask; + + for (int y = image->getHeight(); --y >= 0;) + { + for (int x = image->getWidth(); --x >= 0;) + { + const float brightness = mask->getPixelAt (x, y).getBrightness(); + + if (brightness > 0.0f) + image->multiplyAlphaAt (x, y, 1.0f - brightness); + } + } + + delete mask; + return image; + } + + return 0; +} + +static HICON createHICONFromImage (const Image& image, const BOOL isIcon, int hotspotX, int hotspotY) +{ + HBITMAP mask = CreateBitmap (image.getWidth(), image.getHeight(), 1, 1, 0); + + ICONINFO info; + info.fIcon = isIcon; + info.xHotspot = hotspotX; + info.yHotspot = hotspotY; + info.hbmMask = mask; + HICON hi = 0; + + if (SystemStats::getOperatingSystemType() >= SystemStats::WinXP) + { + WindowsBitmapImage bitmap (Image::ARGB, image.getWidth(), image.getHeight(), true); + Graphics g (bitmap); + g.drawImageAt (&image, 0, 0); + + info.hbmColor = bitmap.hBitmap; + hi = CreateIconIndirect (&info); + } + else + { + HBITMAP colour = CreateCompatibleBitmap (GetDC (0), image.getWidth(), image.getHeight()); + + HDC colDC = CreateCompatibleDC (GetDC (0)); + HDC alphaDC = CreateCompatibleDC (GetDC (0)); + SelectObject (colDC, colour); + SelectObject (alphaDC, mask); + + for (int y = image.getHeight(); --y >= 0;) + { + for (int x = image.getWidth(); --x >= 0;) + { + const Colour c (image.getPixelAt (x, y)); + + SetPixel (colDC, x, y, COLORREF (c.getRed() | (c.getGreen() << 8) | (c.getBlue() << 16))); + SetPixel (alphaDC, x, y, COLORREF (0xffffff - (c.getAlpha() | (c.getAlpha() << 8) | (c.getAlpha() << 16)))); + } + } + + DeleteDC (colDC); + DeleteDC (alphaDC); + + info.hbmColor = colour; + hi = CreateIconIndirect (&info); + DeleteObject (colour); + } + + DeleteObject (mask); + return hi; +} + +Image* juce_createIconForFile (const File& file) +{ + Image* image = 0; + + TCHAR filename [1024]; + file.getFullPathName().copyToBuffer (filename, 1023); + WORD iconNum = 0; + + HICON icon = ExtractAssociatedIcon ((HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle(), + filename, &iconNum); + + if (icon != 0) + { + image = createImageFromHICON (icon); + DestroyIcon (icon); + } + + return image; +} + +//============================================================================== +void* juce_createMouseCursorFromImage (const Image& image, int hotspotX, int hotspotY) +{ + const int maxW = GetSystemMetrics (SM_CXCURSOR); + const int maxH = GetSystemMetrics (SM_CYCURSOR); + + const Image* im = ℑ + Image* newIm = 0; + + if (image.getWidth() > maxW || image.getHeight() > maxH) + { + im = newIm = image.createCopy (maxW, maxH); + + hotspotX = (hotspotX * maxW) / image.getWidth(); + hotspotY = (hotspotY * maxH) / image.getHeight(); + } + + void* cursorH = 0; + + const SystemStats::OperatingSystemType os = SystemStats::getOperatingSystemType(); + + if (os == SystemStats::WinXP) + { + cursorH = (void*) createHICONFromImage (*im, FALSE, hotspotX, hotspotY); + } + else + { + const int stride = (maxW + 7) >> 3; + uint8* const andPlane = (uint8*) juce_calloc (stride * maxH); + uint8* const xorPlane = (uint8*) juce_calloc (stride * maxH); + int index = 0; + + for (int y = 0; y < maxH; ++y) + { + for (int x = 0; x < maxW; ++x) + { + const unsigned char bit = (unsigned char) (1 << (7 - (x & 7))); + + const Colour pixelColour (im->getPixelAt (x, y)); + + if (pixelColour.getAlpha() < 127) + andPlane [index + (x >> 3)] |= bit; + else if (pixelColour.getBrightness() >= 0.5f) + xorPlane [index + (x >> 3)] |= bit; + } + + index += stride; + } + + cursorH = CreateCursor (0, hotspotX, hotspotY, maxW, maxH, andPlane, xorPlane); + + juce_free (andPlane); + juce_free (xorPlane); + } + + delete newIm; + return cursorH; +} + +void juce_deleteMouseCursor (void* cursorHandle, bool isStandard) +{ + if (cursorHandle != 0 && ! isStandard) + DestroyCursor ((HCURSOR) cursorHandle); +} + +void* juce_createStandardMouseCursor (MouseCursor::StandardCursorType type) +{ + LPCTSTR cursorName = IDC_ARROW; + + switch (type) + { + case MouseCursor::NormalCursor: + cursorName = IDC_ARROW; + break; + + case MouseCursor::NoCursor: + return 0; + + case MouseCursor::DraggingHandCursor: + { + static void* dragHandCursor = 0; + + if (dragHandCursor == 0) + { + const unsigned char dragHandData[] = + { 71,73,70,56,57,97,16,0,16,0,145,2,0,0,0,0,255,255,255,0,0,0,0,0,0,33,249,4,1,0,0,2,0,44,0,0,0,0,16,0, + 16,0,0,2,52,148,47,0,200,185,16,130,90,12,74,139,107,84,123,39, 132,117,151,116,132,146,248,60,209,138, + 98,22,203,114,34,236,37,52,77,217,247,154,191,119,110,240,193,128,193,95,163,56,60,234,98,135,2,0,59 }; + + Image* const image = ImageFileFormat::loadFrom ((const char*) dragHandData, sizeof (dragHandData)); + dragHandCursor = juce_createMouseCursorFromImage (*image, 8, 7); + delete image; + } + + return dragHandCursor; + } + + case MouseCursor::WaitCursor: + cursorName = IDC_WAIT; + break; + + case MouseCursor::IBeamCursor: + cursorName = IDC_IBEAM; + break; + + case MouseCursor::PointingHandCursor: + cursorName = MAKEINTRESOURCE(32649); + break; + + case MouseCursor::LeftRightResizeCursor: + case MouseCursor::LeftEdgeResizeCursor: + case MouseCursor::RightEdgeResizeCursor: + cursorName = IDC_SIZEWE; + break; + + case MouseCursor::UpDownResizeCursor: + case MouseCursor::TopEdgeResizeCursor: + case MouseCursor::BottomEdgeResizeCursor: + cursorName = IDC_SIZENS; + break; + + case MouseCursor::TopLeftCornerResizeCursor: + case MouseCursor::BottomRightCornerResizeCursor: + cursorName = IDC_SIZENWSE; + break; + + case MouseCursor::TopRightCornerResizeCursor: + case MouseCursor::BottomLeftCornerResizeCursor: + cursorName = IDC_SIZENESW; + break; + + case MouseCursor::UpDownLeftRightResizeCursor: + cursorName = IDC_SIZEALL; + break; + + case MouseCursor::CrosshairCursor: + cursorName = IDC_CROSS; + break; + + case MouseCursor::CopyingCursor: + // can't seem to find one of these in the win32 list.. + break; + } + + HCURSOR cursorH = LoadCursor (0, cursorName); + + if (cursorH == 0) + cursorH = LoadCursor (0, IDC_ARROW); + + return (void*) cursorH; +} + +//============================================================================== +void MouseCursor::showInWindow (ComponentPeer*) const +{ + SetCursor ((HCURSOR) getHandle()); +} + +void MouseCursor::showInAllWindows() const +{ + showInWindow (0); +} + +//============================================================================== +class JuceDropSource : public IDropSource +{ + int refCount; + +public: + JuceDropSource() + : refCount (1) + { + } + + virtual ~JuceDropSource() + { + jassert (refCount == 0); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IDropSource) + { + AddRef(); + *result = this; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { jassert (refCount > 0); const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall QueryContinueDrag (BOOL escapePressed, DWORD keys) + { + if (escapePressed) + return DRAGDROP_S_CANCEL; + + if ((keys & (MK_LBUTTON | MK_RBUTTON)) == 0) + return DRAGDROP_S_DROP; + + return S_OK; + } + + HRESULT __stdcall GiveFeedback (DWORD) + { + return DRAGDROP_S_USEDEFAULTCURSORS; + } +}; + + +class JuceEnumFormatEtc : public IEnumFORMATETC +{ +private: + int refCount; + FORMATETC* formats; + int numFormats, index; + + static void copyFormatEtc (FORMATETC& dest, FORMATETC& source) + { + dest = source; + + if (source.ptd != 0) + { + dest.ptd = (DVTARGETDEVICE*) CoTaskMemAlloc (sizeof (DVTARGETDEVICE)); + *(dest.ptd) = *(source.ptd); + } + } + +public: + JuceEnumFormatEtc (FORMATETC* const formats_, + const int numFormats_) + : refCount (1), + formats (formats_), + numFormats (numFormats_), + index (0) + { + } + + virtual ~JuceEnumFormatEtc() + { + jassert (refCount == 0); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IEnumFORMATETC) + { + AddRef(); + *result = this; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { jassert (refCount > 0); const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall Clone (IEnumFORMATETC** result) + { + if (result == 0) + return E_POINTER; + + JuceEnumFormatEtc* const newOne = new JuceEnumFormatEtc (formats, numFormats); + newOne->index = index; + + *result = newOne; + return S_OK; + } + + HRESULT __stdcall Next (ULONG celt, LPFORMATETC lpFormatEtc, ULONG* pceltFetched) + { + if (pceltFetched != 0) + *pceltFetched = 0; + + if (celt <= 0 || lpFormatEtc == 0 || index >= numFormats + || (pceltFetched == 0 && celt != 1)) + return S_FALSE; + + int numDone = 0; + + while (index < numFormats && numDone < (int) celt) + copyFormatEtc (lpFormatEtc [numDone++], formats [index++]); + + if (pceltFetched != 0) + *pceltFetched = numDone; + + return (numDone != 0) ? S_OK : S_FALSE; + } + + HRESULT __stdcall Skip (ULONG celt) + { + if (index + (int) celt >= numFormats) + return S_FALSE; + + index += celt; + return S_OK; + } + + HRESULT __stdcall Reset() + { + index = 0; + return S_OK; + } +}; + +class JuceDataObject : public IDataObject +{ + int refCount; + JuceDropSource* dropSource; + + FORMATETC* formats; + STGMEDIUM* mediums; + int numFormats; + + int indexOfFormat (const FORMATETC* const f) const + { + for (int i = 0; i < numFormats; ++i) + { + if (f->tymed == formats[i].tymed + && f->cfFormat == formats[i].cfFormat + && f->dwAspect == formats[i].dwAspect) + { + return i; + } + } + + return -1; + } + +public: + JuceDataObject (JuceDropSource* const dropSource_, + FORMATETC* const formats_, + STGMEDIUM* const mediums_, + const int numFormats_) + : refCount (1), + dropSource (dropSource_), + formats (formats_), + mediums (mediums_), + numFormats (numFormats_) + { + } + + virtual ~JuceDataObject() + { + jassert (refCount == 0); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IDataObject) + { + AddRef(); + *result = this; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { jassert (refCount > 0); const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall GetData (FORMATETC __RPC_FAR* pFormatEtc, STGMEDIUM __RPC_FAR* pMedium) + { + const int i = indexOfFormat (pFormatEtc); + + if (i >= 0) + { + pMedium->tymed = formats[i].tymed; + pMedium->pUnkForRelease = 0; + + if (formats[i].tymed == TYMED_HGLOBAL) + { + const SIZE_T len = GlobalSize (mediums[i].hGlobal); + void* const src = GlobalLock (mediums[i].hGlobal); + void* const dst = GlobalAlloc (GMEM_FIXED, len); + + memcpy (dst, src, len); + + GlobalUnlock (mediums[i].hGlobal); + + pMedium->hGlobal = dst; + return S_OK; + } + } + + return DV_E_FORMATETC; + } + + HRESULT __stdcall QueryGetData (FORMATETC __RPC_FAR* result) + { + if (result == 0) + return E_INVALIDARG; + + return (indexOfFormat (result) >= 0) ? S_OK : DV_E_FORMATETC; + } + + HRESULT __stdcall GetCanonicalFormatEtc (FORMATETC __RPC_FAR*, FORMATETC __RPC_FAR* pFormatEtcOut) + { + pFormatEtcOut->ptd = 0; + return E_NOTIMPL; + } + + HRESULT __stdcall EnumFormatEtc (DWORD direction, IEnumFORMATETC __RPC_FAR *__RPC_FAR *result) + { + if (result == 0) + return E_POINTER; + + if (direction == DATADIR_GET) + { + *result = new JuceEnumFormatEtc (formats, numFormats); + return S_OK; + } + + *result = 0; + return E_NOTIMPL; + } + + HRESULT __stdcall GetDataHere (FORMATETC __RPC_FAR*, STGMEDIUM __RPC_FAR*) { return DATA_E_FORMATETC; } + HRESULT __stdcall SetData (FORMATETC __RPC_FAR*, STGMEDIUM __RPC_FAR*, BOOL) { return E_NOTIMPL; } + HRESULT __stdcall DAdvise (FORMATETC __RPC_FAR*, DWORD, IAdviseSink __RPC_FAR*, DWORD __RPC_FAR*) { return OLE_E_ADVISENOTSUPPORTED; } + HRESULT __stdcall DUnadvise (DWORD) { return E_NOTIMPL; } + HRESULT __stdcall EnumDAdvise (IEnumSTATDATA __RPC_FAR *__RPC_FAR *) { return OLE_E_ADVISENOTSUPPORTED; } +}; + +static HDROP createHDrop (const StringArray& fileNames) +{ + int totalChars = 0; + for (int i = fileNames.size(); --i >= 0;) + totalChars += fileNames[i].length() + 1; + + HDROP hDrop = (HDROP) GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, + sizeof (DROPFILES) + + sizeof (WCHAR) * (totalChars + 2)); + + if (hDrop != 0) + { + LPDROPFILES pDropFiles = (LPDROPFILES) GlobalLock (hDrop); + pDropFiles->pFiles = sizeof (DROPFILES); + + pDropFiles->fWide = (SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0; + + if (pDropFiles->fWide) + { + WCHAR* fname = (WCHAR*) (((char*) pDropFiles) + sizeof (DROPFILES)); + + for (int i = 0; i < fileNames.size(); ++i) + { + fileNames[i].copyToBuffer (fname, 2048); + fname += fileNames[i].length() + 1; + } + + *fname = 0; + } + else + { + char* fname = ((char*) pDropFiles) + sizeof (DROPFILES); + + for (int i = 0; i < fileNames.size(); ++i) + { + fileNames[i].copyToBuffer (fname, 2048); + fname += fileNames[i].length() + 1; + } + + *fname = 0; + } + + GlobalUnlock (hDrop); + } + + return hDrop; +} + +static bool performDragDrop (FORMATETC* format, STGMEDIUM* medium, const DWORD whatToDo) +{ + JuceDropSource* const source = new JuceDropSource(); + JuceDataObject* const data = new JuceDataObject (source, format, medium, 1); + + DWORD effect; + HRESULT res = DoDragDrop (data, source, whatToDo, &effect); + + data->Release(); + source->Release(); + + return res == DRAGDROP_S_DROP; +} + +bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMove) +{ + FORMATETC format = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + STGMEDIUM medium = { TYMED_HGLOBAL, { 0 }, 0 }; + + medium.hGlobal = createHDrop (files); + + return performDragDrop (&format, &medium, canMove ? (DROPEFFECT_COPY | DROPEFFECT_MOVE) + : DROPEFFECT_COPY); +} + +bool DragAndDropContainer::performExternalDragDropOfText (const String& text) +{ + FORMATETC format = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + STGMEDIUM medium = { TYMED_HGLOBAL, { 0 }, 0 }; + + const int numChars = text.length(); + + medium.hGlobal = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, (numChars + 2) * sizeof (WCHAR)); + char* d = (char*) GlobalLock (medium.hGlobal); + + if ((SystemStats::getOperatingSystemType() & SystemStats::WindowsNT) != 0) + { + text.copyToBuffer ((WCHAR*) d, numChars + 1); + format.cfFormat = CF_UNICODETEXT; + } + else + { + text.copyToBuffer (d, numChars + 1); + } + + GlobalUnlock (medium.hGlobal); + + return performDragDrop (&format, &medium, DROPEFFECT_COPY | DROPEFFECT_MOVE); +} + + +//============================================================================== +#if JUCE_OPENGL + +struct OpenGLContextInfo +{ + Win32ComponentPeer* nativeWindow; + + HDC dc; + HGLRC renderContext; +}; + +void* juce_createOpenGLContext (OpenGLComponent* component, void* sharedContext) +{ + jassert (component != 0); + + Win32ComponentPeer* const peer = dynamic_cast (component->getTopLevelComponent()->getPeer()); + + if (peer == 0) + return 0; + + OpenGLContextInfo* const oc = new OpenGLContextInfo(); + + oc->nativeWindow = new Win32ComponentPeer (component, 0); + oc->nativeWindow->dontRepaint = true; + oc->nativeWindow->setVisible (true); + HWND hwnd = (HWND) oc->nativeWindow->getNativeHandle(); + + SetParent (hwnd, (HWND) peer->getNativeHandle()); + juce_setWindowStyleBit (hwnd, GWL_STYLE, WS_CHILD, true); + juce_setWindowStyleBit (hwnd, GWL_STYLE, WS_POPUP, false); + + oc->dc = GetDC (hwnd); + + PIXELFORMATDESCRIPTOR pfd; + zerostruct (pfd); + pfd.nSize = sizeof (pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 32; + pfd.cDepthBits = 32; + pfd.iLayerType = PFD_MAIN_PLANE; + + int format = ChoosePixelFormat (oc->dc, &pfd); + + if (format == 0 || ! SetPixelFormat (oc->dc, format, &pfd)) + { + // try some less ambitious formats if it fails.. + pfd.cColorBits = 24; + format = ChoosePixelFormat (oc->dc, &pfd); + + if (format == 0 || ! SetPixelFormat (oc->dc, format, &pfd)) + { + pfd.cDepthBits = 16; + format = ChoosePixelFormat (oc->dc, &pfd); + + if (format == 0 || ! SetPixelFormat (oc->dc, format, &pfd)) + { + pfd.cColorBits = 32; + format = ChoosePixelFormat (oc->dc, &pfd); + + if (format == 0 || ! SetPixelFormat (oc->dc, format, &pfd)) + { + jassertfalse // can't find a suitable pixel format that works for opengl + } + } + } + } + + oc->renderContext = wglCreateContext (oc->dc); + + if (sharedContext != 0) + wglShareLists (((OpenGLContextInfo*) sharedContext)->renderContext, oc->renderContext); + + return oc; +} + +void juce_updateOpenGLWindowPos (void* context, Component* owner, Component* topComp) +{ + jassert (context != 0); + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + SetWindowPos ((HWND) oc->nativeWindow->getNativeHandle(), 0, + owner->getScreenX() - topComp->getScreenX(), + owner->getScreenY() - topComp->getScreenY(), + owner->getWidth(), + owner->getHeight(), + SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING); +} + +void juce_deleteOpenGLContext (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + { + wglDeleteContext (oc->renderContext); + ReleaseDC ((HWND) oc->nativeWindow->getNativeHandle(), oc->dc); + + deleteAndZero (oc->nativeWindow); + + delete oc; + } +} + +bool juce_makeOpenGLContextCurrent (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + return wglMakeCurrent (oc->dc, oc->renderContext) != 0; + else + return wglMakeCurrent (0, 0) != 0; +} + +void juce_swapOpenGLBuffers (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + SwapBuffers (oc->dc); +} + +void juce_repaintOpenGLWindow (void* context) +{ + OpenGLContextInfo* const oc = (OpenGLContextInfo*) context; + + if (oc != 0) + { + int x, y, w, h; + oc->nativeWindow->getBounds (x, y, w, h); + oc->nativeWindow->repaint (0, 0, w, h); + } +} + +#endif + + +//============================================================================== +class JuceIStorage : public IStorage +{ + int refCount; + +public: + JuceIStorage() : refCount (1) {} + + virtual ~JuceIStorage() + { + jassert (refCount == 0); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IStorage) + { + AddRef(); + *result = this; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall CreateStream (const WCHAR*, DWORD, DWORD, DWORD, IStream**) { return E_NOTIMPL; } + HRESULT __stdcall OpenStream (const WCHAR*, void*, DWORD, DWORD, IStream**) { return E_NOTIMPL; } + HRESULT __stdcall CreateStorage (const WCHAR*, DWORD, DWORD, DWORD, IStorage**) { return E_NOTIMPL; } + HRESULT __stdcall OpenStorage (const WCHAR*, IStorage*, DWORD, SNB, DWORD, IStorage**) { return E_NOTIMPL; } + HRESULT __stdcall CopyTo (DWORD, IID const*, SNB, IStorage*) { return E_NOTIMPL; } + HRESULT __stdcall MoveElementTo (const OLECHAR*,IStorage*, const OLECHAR*, DWORD) { return E_NOTIMPL; } + HRESULT __stdcall Commit (DWORD) { return E_NOTIMPL; } + HRESULT __stdcall Revert() { return E_NOTIMPL; } + HRESULT __stdcall EnumElements (DWORD, void*, DWORD, IEnumSTATSTG**) { return E_NOTIMPL; } + HRESULT __stdcall DestroyElement (const OLECHAR*) { return E_NOTIMPL; } + HRESULT __stdcall RenameElement (const WCHAR*, const WCHAR*) { return E_NOTIMPL; } + HRESULT __stdcall SetElementTimes (const WCHAR*, FILETIME const*, FILETIME const*, FILETIME const*) { return E_NOTIMPL; } + HRESULT __stdcall SetClass (REFCLSID) { return S_OK; } + HRESULT __stdcall SetStateBits (DWORD, DWORD) { return E_NOTIMPL; } + HRESULT __stdcall Stat (STATSTG*, DWORD) { return E_NOTIMPL; } + + juce_UseDebuggingNewOperator +}; + + +class JuceOleInPlaceFrame : public IOleInPlaceFrame +{ + int refCount; + HWND window; + +public: + JuceOleInPlaceFrame (HWND window_) + : refCount (1), + window (window_) + { + } + + virtual ~JuceOleInPlaceFrame() + { + jassert (refCount == 0); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IOleInPlaceFrame) + { + AddRef(); + *result = this; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } + HRESULT __stdcall ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } + HRESULT __stdcall GetBorder (LPRECT) { return E_NOTIMPL; } + HRESULT __stdcall RequestBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } + HRESULT __stdcall SetBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } + HRESULT __stdcall SetActiveObject (IOleInPlaceActiveObject*, LPCOLESTR) { return S_OK; } + HRESULT __stdcall InsertMenus (HMENU, LPOLEMENUGROUPWIDTHS) { return E_NOTIMPL; } + HRESULT __stdcall SetMenu (HMENU, HOLEMENU, HWND) { return S_OK; } + HRESULT __stdcall RemoveMenus (HMENU) { return E_NOTIMPL; } + HRESULT __stdcall SetStatusText (LPCOLESTR) { return S_OK; } + HRESULT __stdcall EnableModeless (BOOL) { return S_OK; } + HRESULT __stdcall TranslateAccelerator(LPMSG, WORD) { return E_NOTIMPL; } + + juce_UseDebuggingNewOperator +}; + + +class JuceIOleInPlaceSite : public IOleInPlaceSite +{ + int refCount; + HWND window; + JuceOleInPlaceFrame* frame; + +public: + JuceIOleInPlaceSite (HWND window_) + : refCount (1), + window (window_) + { + frame = new JuceOleInPlaceFrame (window); + } + + virtual ~JuceIOleInPlaceSite() + { + jassert (refCount == 0); + frame->Release(); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IOleInPlaceSite) + { + AddRef(); + *result = this; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } + HRESULT __stdcall ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } + HRESULT __stdcall CanInPlaceActivate() { return S_OK; } + HRESULT __stdcall OnInPlaceActivate() { return S_OK; } + HRESULT __stdcall OnUIActivate() { return S_OK; } + + HRESULT __stdcall GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo) + { + frame->AddRef(); + *lplpFrame = frame; + *lplpDoc = 0; + lpFrameInfo->fMDIApp = FALSE; + lpFrameInfo->hwndFrame = window; + lpFrameInfo->haccel = 0; + lpFrameInfo->cAccelEntries = 0; + return S_OK; + } + + HRESULT __stdcall Scroll (SIZE) { return E_NOTIMPL; } + HRESULT __stdcall OnUIDeactivate (BOOL) { return S_OK; } + HRESULT __stdcall OnInPlaceDeactivate() { return S_OK; } + HRESULT __stdcall DiscardUndoState() { return E_NOTIMPL; } + HRESULT __stdcall DeactivateAndUndo() { return E_NOTIMPL; } + HRESULT __stdcall OnPosRectChange (LPCRECT) { return S_OK; } + + juce_UseDebuggingNewOperator +}; + + +class JuceIOleClientSite : public IOleClientSite +{ + int refCount; + JuceIOleInPlaceSite* inplaceSite; + +public: + JuceIOleClientSite (HWND window) + : refCount (1) + { + inplaceSite = new JuceIOleInPlaceSite (window); + } + + virtual ~JuceIOleClientSite() + { + jassert (refCount == 0); + inplaceSite->Release(); + } + + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) + { + if (id == IID_IUnknown || id == IID_IOleClientSite) + { + AddRef(); + *result = this; + return S_OK; + } + else if (id == IID_IOleInPlaceSite) + { + inplaceSite->AddRef(); + *result = inplaceSite; + return S_OK; + } + + *result = 0; + return E_NOINTERFACE; + } + + ULONG __stdcall AddRef() { return ++refCount; } + ULONG __stdcall Release() { const int r = --refCount; if (r == 0) delete this; return r; } + + HRESULT __stdcall SaveObject() { return E_NOTIMPL; } + HRESULT __stdcall GetMoniker (DWORD, DWORD, IMoniker**) { return E_NOTIMPL; } + HRESULT __stdcall GetContainer (LPOLECONTAINER* ppContainer) { *ppContainer = 0; return E_NOINTERFACE; } + HRESULT __stdcall ShowObject() { return S_OK; } + HRESULT __stdcall OnShowWindow (BOOL) { return E_NOTIMPL; } + HRESULT __stdcall RequestNewObjectLayout() { return E_NOTIMPL; } + + juce_UseDebuggingNewOperator +}; + +//============================================================================== +class ActiveXControlData : public ComponentMovementWatcher +{ + ActiveXControlComponent* const owner; + bool wasShowing; + +public: + IStorage* storage; + IOleClientSite* clientSite; + IOleObject* control; + + //============================================================================== + ActiveXControlData (HWND hwnd, + ActiveXControlComponent* const owner_) + : ComponentMovementWatcher (owner_), + owner (owner_), + wasShowing (owner_ != 0 && owner_->isShowing()), + storage (new JuceIStorage()), + clientSite (new JuceIOleClientSite (hwnd)), + control (0) + { + } + + ~ActiveXControlData() + { + if (control != 0) + { + control->Close (OLECLOSE_NOSAVE); + control->Release(); + } + + clientSite->Release(); + storage->Release(); + } + + //============================================================================== + void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) + { + Component* const topComp = owner->getTopLevelComponent(); + + if (topComp->getPeer() != 0) + { + int x = 0, y = 0; + owner->relativePositionToOtherComponent (topComp, x, y); + + owner->setControlBounds (Rectangle (x, y, owner->getWidth(), owner->getHeight())); + } + } + + void componentPeerChanged() + { + const bool isShowingNow = owner->isShowing(); + + if (wasShowing != isShowingNow) + { + wasShowing = isShowingNow; + + owner->setControlVisible (isShowingNow); + } + } + + void componentVisibilityChanged (Component&) + { + componentPeerChanged(); + } +}; + +//============================================================================== +static VoidArray activeXComps; + +static HWND getHWND (const ActiveXControlComponent* const component) +{ + HWND hwnd = 0; + + const IID iid = IID_IOleWindow; + IOleWindow* const window = (IOleWindow*) component->queryInterface (&iid); + + if (window != 0) + { + window->GetWindow (&hwnd); + window->Release(); + } + + return hwnd; +} + +static void offerActiveXMouseEventToPeer (ComponentPeer* const peer, HWND hwnd, UINT message, LPARAM lParam) +{ + RECT activeXRect, peerRect; + GetWindowRect (hwnd, &activeXRect); + GetWindowRect ((HWND) peer->getNativeHandle(), &peerRect); + + const int mx = GET_X_LPARAM (lParam) + activeXRect.left - peerRect.left; + const int my = GET_Y_LPARAM (lParam) + activeXRect.top - peerRect.top; + const int64 mouseEventTime = getMouseEventTime(); + + const int oldModifiers = currentModifiers; + ModifierKeys::getCurrentModifiersRealtime(); // to update the mouse button flags + + switch (message) + { + case WM_MOUSEMOVE: + if (ModifierKeys (currentModifiers).isAnyMouseButtonDown()) + peer->handleMouseDrag (mx, my, mouseEventTime); + else + peer->handleMouseMove (mx, my, mouseEventTime); + break; + + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + peer->handleMouseDown (mx, my, mouseEventTime); + break; + + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + peer->handleMouseUp (oldModifiers, mx, my, mouseEventTime); + break; + + default: + break; + } +} + +// intercepts events going to an activeX control, so we can sneakily use the mouse events +static LRESULT CALLBACK activeXHookWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + for (int i = activeXComps.size(); --i >= 0;) + { + const ActiveXControlComponent* const ax = (const ActiveXControlComponent*) activeXComps.getUnchecked(i); + + HWND controlHWND = getHWND (ax); + + if (controlHWND == hwnd) + { + switch (message) + { + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + if (ax->isShowing()) + { + ComponentPeer* const peer = ax->getPeer(); + + if (peer != 0) + offerActiveXMouseEventToPeer (peer, hwnd, message, lParam); + } + break; + + default: + break; + } + + return CallWindowProc ((WNDPROC) (ax->originalWndProc), hwnd, message, wParam, lParam); + } + } + + return DefWindowProc (hwnd, message, wParam, lParam); +} + +ActiveXControlComponent::ActiveXControlComponent() + : originalWndProc (0), + control (0) +{ + activeXComps.add (this); +} + +ActiveXControlComponent::~ActiveXControlComponent() +{ + deleteControl(); + activeXComps.removeValue (this); +} + +void ActiveXControlComponent::paint (Graphics& g) +{ + if (control == 0) + g.fillAll (Colours::lightgrey); +} + +bool ActiveXControlComponent::createControl (const void* controlIID) +{ + deleteControl(); + ComponentPeer* const peer = getPeer(); + + // the component must have already been added to a real window when you call this! + jassert (dynamic_cast (peer) != 0); + + if (dynamic_cast (peer) != 0) + { + int x = 0, y = 0; + relativePositionToOtherComponent (getTopLevelComponent(), x, y); + + HWND hwnd = (HWND) peer->getNativeHandle(); + + ActiveXControlData* const info = new ActiveXControlData (hwnd, this); + + HRESULT hr; + if ((hr = OleCreate (*(const IID*) controlIID, IID_IOleObject, 1 /*OLERENDER_DRAW*/, 0, + info->clientSite, info->storage, + (void**) &(info->control))) == S_OK) + { + info->control->SetHostNames (L"Juce", 0); + + if (OleSetContainedObject (info->control, TRUE) == S_OK) + { + RECT rect; + rect.left = x; + rect.top = y; + rect.right = x + getWidth(); + rect.bottom = y + getHeight(); + + if (info->control->DoVerb (OLEIVERB_SHOW, 0, info->clientSite, 0, hwnd, &rect) == S_OK) + { + control = info; + setControlBounds (Rectangle (x, y, getWidth(), getHeight())); + + HWND controlHWND = getHWND (this); + + if (controlHWND != 0) + { + originalWndProc = (void*) GetWindowLongPtr (controlHWND, GWLP_WNDPROC); + SetWindowLongPtr (controlHWND, GWLP_WNDPROC, (LONG_PTR) activeXHookWndProc); + } + + return true; + } + } + } + + delete info; + } + + return false; +} + +void ActiveXControlComponent::deleteControl() +{ + ActiveXControlData* const info = (ActiveXControlData*) control; + + if (info != 0) + { + delete info; + control = 0; + originalWndProc = 0; + } +} + +void* ActiveXControlComponent::queryInterface (const void* iid) const +{ + ActiveXControlData* const info = (ActiveXControlData*) control; + + void* result = 0; + + if (info != 0 && info->control != 0 + && info->control->QueryInterface (*(const IID*) iid, &result) == S_OK) + return result; + + return 0; +} + +void ActiveXControlComponent::setControlBounds (const Rectangle& newBounds) const +{ + HWND hwnd = getHWND (this); + + if (hwnd != 0) + MoveWindow (hwnd, newBounds.getX(), newBounds.getY(), newBounds.getWidth(), newBounds.getHeight(), TRUE); +} + +void ActiveXControlComponent::setControlVisible (const bool shouldBeVisible) const +{ + HWND hwnd = getHWND (this); + + if (hwnd != 0) + ShowWindow (hwnd, shouldBeVisible ? SW_SHOWNA : SW_HIDE); +} + + +END_JUCE_NAMESPACE diff --git a/build/win32/platform_specific_code/win32_headers.h b/build/win32/platform_specific_code/win32_headers.h new file mode 100644 index 0000000000..7711e2e3ec --- /dev/null +++ b/build/win32/platform_specific_code/win32_headers.h @@ -0,0 +1,76 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __WIN32_HEADERS_JUCEHEADER__ +#define __WIN32_HEADERS_JUCEHEADER__ + +#include "../../../juce_Config.h" + +#define STRICT +#define WIN32_LEAN_AND_MEAN + +// don't want to get told about microsoft's mistakes.. +#ifdef _MSC_VER + #pragma warning (push) + #pragma warning (disable : 4100 4201) +#endif + +// use Platform SDK as win2000 unless this is disabled +#ifndef DISABLE_TRANSPARENT_WINDOWS + #define _WIN32_WINNT 0x0500 +#endif + +#include +#include +#include +#include +#include +#include + +#undef PACKED + +#ifdef _MSC_VER + #pragma warning (pop) +#endif + +//============================================================================== +// helpers for dynamically loading unicode functions.. + +#define UNICODE_FUNCTION(functionName, returnType, params) \ + typedef returnType (WINAPI *type##functionName) params; \ + static type##functionName w##functionName = 0; + +#define UNICODE_FUNCTION_LOAD(functionName) \ + w##functionName = (type##functionName) GetProcAddress (h, #functionName); \ + jassert (w##functionName != 0); \ + + +#endif // __WIN32_HEADERS_JUCEHEADER__ diff --git a/build/win32/vc6/JUCE.dsp b/build/win32/vc6/JUCE.dsp new file mode 100644 index 0000000000..09eac641ae --- /dev/null +++ b/build/win32/vc6/JUCE.dsp @@ -0,0 +1,2901 @@ +# Microsoft Developer Studio Project File - Name="JUCE" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=JUCE - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "JUCE.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "JUCE.mak" CFG="JUCE - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "JUCE - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "JUCE - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "JUCE - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../../../bin/intermediate_win32/static" +# PROP Intermediate_Dir "../../../bin/intermediate_win32/static" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /G6 /MT /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"../../../bin/jucelib_static_Win32.lib" + +!ELSEIF "$(CFG)" == "JUCE - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../../../bin/intermediate_win32/staticdebug" +# PROP Intermediate_Dir "../../../bin/intermediate_win32/staticdebug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /G6 /MTd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"../../../bin/jucelib_static_Win32_debug.lib" + +!ENDIF + +# Begin Target + +# Name "JUCE - Win32 Release" +# Name "JUCE - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Group "appframework" + +# PROP Default_Filter "" +# Begin Group "application" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_Application.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_Application.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandID.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandInfo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandInfo.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandManager.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandManager.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandTarget.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationCommandTarget.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationProperties.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_ApplicationProperties.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_DeletedAtShutdown.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_DeletedAtShutdown.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_PropertiesFile.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_PropertiesFile.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\application\juce_SystemClipboard.h +# End Source File +# End Group +# Begin Group "audio" + +# PROP Default_Filter "" +# Begin Group "audio_file_formats" + +# PROP Default_Filter "" +# Begin Group "flac" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\bitbuffer.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\bitmath.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\cpu.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\crc.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\fixed.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\float.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\format.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\juce_FlacHeader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\lpc_flac.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\md5.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\memory.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\stream_decoder.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\stream_encoder.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\stream_encoder_framing.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\flac\libFLAC\window_flac.c +# End Source File +# End Group +# Begin Group "ogg" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\bitwise.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\framing.c +# End Source File +# End Group +# Begin Group "vorbis" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\analysis.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\bitrate.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\block.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\codebook.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\envelope.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\floor0.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\floor1.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\info.c" +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\juce_OggVorbisHeader.h +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lpc.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\lsp.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\mapping0.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\mdct.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\psy.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\registry.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\res0.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\sharedbook.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\smallft.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\synthesis.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\vorbisenc.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\vorbisfile.c" +# End Source File +# Begin Source File + +SOURCE="..\..\..\src\juce_appframework\audio\audio_file_formats\oggvorbis\libvorbis-1.1.2\lib\window.c" +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AiffAudioFormat.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AiffAudioFormat.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioCDReader.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioCDReader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormat.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormat.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatManager.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatManager.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatReader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioFormatWriter.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioSubsectionReader.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_AudioSubsectionReader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_FlacAudioFormat.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_FlacAudioFormat.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_OggVorbisAudioFormat.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_OggVorbisAudioFormat.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_WavAudioFormat.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_file_formats\juce_WavAudioFormat.h +# End Source File +# End Group +# Begin Group "audio_sources" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioFormatReaderSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioFormatReaderSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioSourcePlayer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioSourcePlayer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioTransportSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_AudioTransportSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_BufferingAudioSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_BufferingAudioSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_ChannelRemappingAudioSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_ChannelRemappingAudioSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_MixerAudioSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_MixerAudioSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_PositionableAudioSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_ResamplingAudioSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_ResamplingAudioSource.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\audio_sources\juce_ToneGeneratorAudioSource.h +# End Source File +# End Group +# Begin Group "devices" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_AudioDeviceManager.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_AudioDeviceManager.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODevice.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODevice.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODeviceType.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_AudioIODeviceType.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_MidiInput.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\devices\juce_MidiOutput.h +# End Source File +# End Group +# Begin Group "midi" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiFile.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiFile.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiKeyboardState.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiKeyboardState.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessage.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageCollector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageCollector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageSequence.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\midi\juce_MidiMessageSequence.h +# End Source File +# End Group +# Begin Group "synthesisers" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\synthesisers\juce_Sampler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\synthesisers\juce_Sampler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\synthesisers\juce_Synthesiser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\synthesisers\juce_Synthesiser.h +# End Source File +# End Group +# Begin Group "dsp" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\dsp\juce_AudioDataConverters.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\dsp\juce_AudioDataConverters.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\dsp\juce_AudioSampleBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\dsp\juce_AudioSampleBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\dsp\juce_IIRFilter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\audio\dsp\juce_IIRFilter.h +# End Source File +# End Group +# End Group +# Begin Group "events" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ActionBroadcaster.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ActionBroadcaster.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ActionListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ActionListenerList.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ActionListenerList.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_AsyncUpdater.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_AsyncUpdater.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ChangeBroadcaster.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ChangeBroadcaster.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ChangeListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ChangeListenerList.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_ChangeListenerList.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_InterprocessConnection.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_InterprocessConnection.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_InterprocessConnectionServer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_InterprocessConnectionServer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_Message.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_Message.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_MessageListener.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_MessageListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_MessageManager.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_MessageManager.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_MultiTimer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_MultiTimer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_Timer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\events\juce_Timer.h +# End Source File +# End Group +# Begin Group "gui" + +# PROP Default_Filter "" +# Begin Group "graphics" + +# PROP Default_Filter "" +# Begin Group "brushes" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_Brush.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_Brush.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_GradientBrush.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_GradientBrush.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_ImageBrush.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_ImageBrush.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_SolidColourBrush.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\brushes\juce_SolidColourBrush.h +# End Source File +# End Group +# Begin Group "colour" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colour.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colour.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_ColourGradient.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_ColourGradient.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colours.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_Colours.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\colour\juce_PixelFormats.h +# End Source File +# End Group +# Begin Group "contexts" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_EdgeTable.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_EdgeTable.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Graphics.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Graphics.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Justification.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_Justification.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsContext.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsPostScriptRenderer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsPostScriptRenderer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_RectanglePlacement.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\contexts\juce_RectanglePlacement.h +# End Source File +# End Group +# Begin Group "fonts" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Font.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Font.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_GlyphArrangement.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_GlyphArrangement.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_TextLayout.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_TextLayout.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_Typeface.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\fonts\juce_TypeFace.h +# End Source File +# End Group +# Begin Group "geometry" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_AffineTransform.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_AffineTransform.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_BorderSize.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_BorderSize.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Line.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Line.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Path.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Path.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathIterator.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathIterator.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathStrokeType.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PathStrokeType.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Point.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Point.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PositionedRectangle.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_PositionedRectangle.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Rectangle.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_Rectangle.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_RectangleList.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\geometry\juce_RectangleList.h +# End Source File +# End Group +# Begin Group "imaging" + +# PROP Default_Filter "" +# Begin Group "image_file_formats" + +# PROP Default_Filter "" +# Begin Group "jpglib" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\cderror.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcapimin.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcapistd.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jccoefct.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jccolor.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcdctmgr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jchuff.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jchuff.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcinit.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcmainct.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcmarker.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcmaster.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcomapi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jconfig.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcparam.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcphuff.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcprepct.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jcsample.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jctrans.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdapimin.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdapistd.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdatasrc.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdcoefct.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdcolor.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdct.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jddctmgr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdhuff.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdhuff.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdinput.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmainct.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmarker.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmaster.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdmerge.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdphuff.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdpostct.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdsample.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jdtrans.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jerror.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jerror.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jfdctflt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jfdctfst.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jfdctint.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctflt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctfst.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctint.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jidctred.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jinclude.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmemmgr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmemnobs.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmemsys.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jmorecfg.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jpegint.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jpeglib.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jquant1.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jquant2.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jutils.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\jversion.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\transupp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\jpglib\transupp.h +# End Source File +# End Group +# Begin Group "pnglib" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\png.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\png.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngerror.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pnggccrd.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngget.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngmem.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngpread.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngread.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngrio.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngrtran.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngrutil.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngset.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngtrans.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngvcrd.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwio.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwrite.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwtran.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\pnglib\pngwutil.c +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_GIFLoader.cpp +# ADD CPP /W1 +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_JPEGLoader.cpp +# ADD CPP /W1 +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\image_file_formats\juce_PNGLoader.cpp +# ADD CPP /W1 +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_Image.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_Image.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageCache.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageCache.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageConvolutionKernel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageConvolutionKernel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageFileFormat.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\imaging\juce_ImageFileFormat.h +# End Source File +# End Group +# Begin Group "effects" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_DropShadowEffect.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_DropShadowEffect.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_GlowEffect.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_GlowEffect.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_ImageEffectFilter.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_ReduceOpacityEffect.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\effects\juce_ReduceOpacityEffect.h +# End Source File +# End Group +# Begin Group "drawables" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_Drawable.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_Drawable.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableComposite.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableComposite.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableImage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableImage.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawablePath.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawablePath.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableText.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_DrawableText.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\graphics\drawables\juce_SVGParser.cpp +# End Source File +# End Group +# End Group +# Begin Group "components" + +# PROP Default_Filter "" +# Begin Group "buttons" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ArrowButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ArrowButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_Button.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_Button.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_DrawableButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_DrawableButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_HyperlinkButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_HyperlinkButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ImageButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ImageButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ShapeButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ShapeButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_TextButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_TextButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToggleButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToggleButton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToolbarButton.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\buttons\juce_ToolbarButton.h +# End Source File +# End Group +# Begin Group "controls" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ComboBox.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ComboBox.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_Label.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_Label.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ListBox.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ListBox.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ProgressBar.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ProgressBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_Slider.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_Slider.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TableHeaderComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TableHeaderComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TableListBox.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TableListBox.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TextEditor.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TextEditor.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_Toolbar.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_Toolbar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemFactory.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemPalette.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_ToolbarItemPalette.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TreeView.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\controls\juce_TreeView.h +# End Source File +# End Group +# Begin Group "keyboard" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyboardFocusTraverser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyListener.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyMappingEditorComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyMappingEditorComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPress.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPress.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPressMappingSet.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_KeyPressMappingSet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_ModifierKeys.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\keyboard\juce_ModifierKeys.h +# End Source File +# End Group +# Begin Group "layout" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentAnimator.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentAnimator.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentBoundsConstrainer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentBoundsConstrainer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentMovementWatcher.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ComponentMovementWatcher.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_GroupComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_GroupComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_MultiDocumentPanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_MultiDocumentPanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableBase.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableBorderComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableBorderComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableCornerComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ResizableCornerComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ScrollBar.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_ScrollBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutManager.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutManager.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutResizerBar.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableLayoutResizerBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableObjectResizer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_StretchableObjectResizer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedButtonBar.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedButtonBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_TabbedComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_Viewport.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\layout\juce_Viewport.h +# End Source File +# End Group +# Begin Group "lookandfeel" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_LookAndFeel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_LookAndFeel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_ShinyLookAndFeel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\lookandfeel\juce_ShinyLookAndFeel.h +# End Source File +# End Group +# Begin Group "menus" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarModel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_MenuBarModel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_PopupMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_PopupMenu.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\menus\juce_PopupMenuCustomComponent.h +# End Source File +# End Group +# Begin Group "mouse" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_ComponentDragger.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_ComponentDragger.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_DragAndDropContainer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_DragAndDropContainer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_DragAndDropTarget.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_LassoComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseCursor.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseCursor.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseEvent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseEvent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseHoverDetector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseHoverDetector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseListener.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_MouseListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\mouse\juce_TooltipClient.h +# End Source File +# End Group +# Begin Group "special" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_ActiveXControlComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_AudioDeviceSelectorComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_AudioDeviceSelectorComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleMessageComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_BubbleMessageComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_ColourSelector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_ColourSelector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_DropShadower.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_DropShadower.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_MagnifierComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_MagnifierComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_MidiKeyboardComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_MidiKeyboardComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_OpenGLComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_OpenGLComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_PreferencesPanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_PreferencesPanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_QuickTimeMovieComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_QuickTimeMovieComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_SystemTrayIconComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\special\juce_SystemTrayIconComponent.h +# End Source File +# End Group +# Begin Group "windows" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_AlertWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_AlertWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ComponentPeer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ComponentPeer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_DialogWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_DialogWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_DocumentWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_DocumentWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ResizableWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ResizableWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_SplashScreen.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_SplashScreen.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ThreadWithProgressWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ThreadWithProgressWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ToolTipWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_ToolTipWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_TopLevelWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\windows\juce_TopLevelWindow.h +# End Source File +# End Group +# Begin Group "filebrowser" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_DirectoryContentsList.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_DirectoryContentsList.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileBrowserComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileBrowserComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileBrowserListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooserDialogBox.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileChooserDialogBox.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileFilter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileFilter.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileListComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FileListComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FilenameComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FilenameComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_FilePreviewComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_ImagePreviewComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_ImagePreviewComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_WildcardFileFilter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\filebrowser\juce_WildcardFileFilter.h +# End Source File +# End Group +# Begin Group "properties" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_BooleanPropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_BooleanPropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_ButtonPropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_ButtonPropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_ChoicePropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_ChoicePropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyPanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_PropertyPanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_SliderPropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_SliderPropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_TextPropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\properties\juce_TextPropertyComponent.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_Component.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_Component.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_ComponentDeletionWatcher.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_ComponentListener.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_ComponentListener.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_Desktop.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\gui\components\juce_Desktop.h +# End Source File +# End Group +# End Group +# Begin Group "documents" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_FileBasedDocument.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_FileBasedDocument.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_RecentlyOpenedFilesList.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_RecentlyOpenedFilesList.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_SelectedItemSet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_UndoableAction.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_UndoManager.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_appframework\documents\juce_UndoManager.h +# End Source File +# End Group +# End Group +# Begin Group "core" + +# PROP Default_Filter "" +# Begin Group "basics" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Atomic.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_DataConversions.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_FileLogger.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_FileLogger.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Logger.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Logger.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_MathsFunctions.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Memory.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_PlatformDefs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Random.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Random.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_RelativeTime.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_RelativeTime.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Singleton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_StandardHeader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_SystemStats.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_SystemStats.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Time.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\basics\juce_Time.h +# End Source File +# End Group +# Begin Group "containers" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_Array.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_ArrayAllocationBase.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_BitArray.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_BitArray.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_ElementComparator.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_MemoryBlock.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_MemoryBlock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_OwnedArray.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_PropertySet.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_PropertySet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_ReferenceCountedArray.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_ReferenceCountedObject.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_SortedSet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_SparseSet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\containers\juce_VoidArray.h +# End Source File +# End Group +# Begin Group "io" + +# PROP Default_Filter "" +# Begin Group "files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_DirectoryIterator.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_DirectoryIterator.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_File.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_File.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_FileInputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_FileInputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_FileOutputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_FileOutputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_FileSearchPath.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_FileSearchPath.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_NamedPipe.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\files\juce_NamedPipe.h +# End Source File +# End Group +# Begin Group "network" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\network\juce_Socket.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\network\juce_Socket.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\network\juce_URL.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\network\juce_URL.h +# End Source File +# End Group +# Begin Group "streams" + +# PROP Default_Filter "" +# Begin Group "zlib" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\adler32.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\compress.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\crc32.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\deflate.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\infback.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\inffast.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\inflate.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\inftrees.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\trees.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\uncompr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\zlib\zutil.c +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_BufferedInputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_BufferedInputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_GZIPCompressorOutputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_GZIPCompressorOutputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_GZIPDecompressorInputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_GZIPDecompressorInputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_MemoryInputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_MemoryInputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_MemoryOutputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_MemoryOutputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_SubregionStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\streams\juce_SubregionStream.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\juce_InputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\juce_InputStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\juce_OutputStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\io\juce_OutputStream.h +# End Source File +# End Group +# Begin Group "misc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_PerformanceCounter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_PerformanceCounter.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_PlatformUtilities.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_Uuid.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_Uuid.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_ZipFile.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\misc\juce_ZipFile.h +# End Source File +# End Group +# Begin Group "text" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_CharacterFunctions.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_CharacterFunctions.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_LocalisedStrings.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_LocalisedStrings.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_String.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_String.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_StringArray.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_StringArray.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_StringPairArray.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_StringPairArray.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_TextFunctions.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_XmlDocument.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_XmlDocument.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_XmlElement.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\text\juce_XmlElement.h +# End Source File +# End Group +# Begin Group "threads" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_CriticalSection.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_InterProcessLock.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_InterProcessLock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_Process.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_ReadWriteLock.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_ReadWriteLock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_ScopedLock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_Thread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_Thread.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_ThreadPool.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_ThreadPool.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_TimeSliceThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_TimeSliceThread.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\threads\juce_WaitableEvent.h +# End Source File +# End Group +# Begin Group "cryptography" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_BlowFish.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_BlowFish.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_MD5.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_MD5.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_Primes.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_Primes.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_RSAKey.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\juce_core\cryptography\juce_RSAKey.h +# End Source File +# End Group +# End Group +# Begin Group "win32_code" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_ASIO.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_AudioCDReader.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_DirectSound.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_DynamicLibraryLoader.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_FileChooser.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Files.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Fonts.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Messaging.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Midi.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Misc.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Network.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_PlatformUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_SystemStats.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Threads.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\juce_win32_Windowing.cpp +# End Source File +# Begin Source File + +SOURCE=..\platform_specific_code\win32_headers.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\juce.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\juce_Config.h +# End Source File +# End Group +# Begin Source File + +SOURCE="..\..\..\docs\JUCE changelist.txt" +# End Source File +# End Target +# End Project diff --git a/build/win32/vc8/JUCE.vcproj b/build/win32/vc8/JUCE.vcproj new file mode 100644 index 0000000000..fee40932a6 --- /dev/null +++ b/build/win32/vc8/JUCE.vcproj @@ -0,0 +1,6086 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/JUCE changelist.txt b/docs/JUCE changelist.txt new file mode 100644 index 0000000000..8330271c23 --- /dev/null +++ b/docs/JUCE changelist.txt @@ -0,0 +1,683 @@ + +============================================================================== + + JUCE version 1.44 + +============================================================================== +Changelist for version 1.44 + +- changed the MouseEvent structure so that it now contains a pointer to the event component and also the original component. +- added a PopupMenu::dismissAllActiveMenus() method +- added the JUCE_LOG_ASSERTIONS flag, which can automatically log assertion failures, even in release builds + + +============================================================================== +Changelist for version 1.43 + +- I've done a bit of tidying up of the juce tree, moving things like the demo, the jucer, etc into a folder called "extras", and this also now includes the audio plugin code and BinaryBuilder, rather than having those available as separate downloads. +- native menu bar support for the Mac! See MenuBarModel::setMacMainMenu(). +- a few changes to the MenuBarModel class and MenuBarComponent - the model object now has listeners, and when a menu changes, you should call MenuBarModel::menuItemsChanged() rather than calling the old equivalent method on the bar component. Also, the MenuBarModel virtual methods have changed slightly and no longer have a menu bar component as one of their parameters. One other related change is that DocumentWindow::setMenuBar() no longer takes a command manager - you should register the command manager directly using MenuBarModel::setApplicationCommandManagerToWatch +- horizontal mouse-wheel support - this involves a change to the Component::mouseWheelMove method, to add an extra parameter. If you've got existing code that uses the old form of this method, it should fail to compile with an error, and you just need to tweak it to add the new parameter +- sorted out some problems with the jucer's colour swatch menus +- fixes for AudioDeviceManager forgetting channel selection +- added a textCharacter member to the KeyPress class - this allows a unicode printing character to be stored separately from the keycode. +- added support for extra numeric keypad keys like add, subtract etc, and F13-F16 +- added a radio group ID field to buttons in the jucer +- renamed TaskbarIconComponent as SystemTrayIconComponent to make it more obvious what it does, and added support for tray icons on linux (thanks to kraken for the code for that one) +- new class: ChannelRemappingAudioSource, which lets you take a source and remap its input and output channels. +- some tweaks to the Time functions on win32 to make them slightly more efficient +- new method: Slider::setIncDecButtonsDraggable(), which adds a hybrid click/drag mode to the inc/dec button slider +- added some linux-specific methods for creating new midi in/out devices (ta to kraken) + +============================================================================== +Changelist for version 1.42 + +- jucer: fix for crash when trying to add items to a button +- optimisation for UndoManager when there's a lot of items +- added multiple file selection as an option for the FileChooser (using native dialogs, not yet juce file browsers) +- added some colour IDs for rotary slider colours +- new method: PopupMenu::addSectionHeader() +- tweaked the way that options are passed to the PropertiesFile constructor, and added an option to save the file as XML. +- new method: Slider::setSkewFactorFromMidPoint() +- jucer: added an option to specify a virtual parent class for components, so that you can edit a component of your own class using a built-in type (e.g. edit your own slider subclass using the slider class). Thanks to kraken for this idea. +- plugins: added support for current-program-only settings to be saved for VSTs +- changes to the way events are dispatched on the mac, to make use of mouse-tracking. This was necessary to avoid problems embedding HIViews in juce windows, and hopefully shouldn't cause any problems anywhere else in the code +- altered the way Files are stored internally to avoid ambiguity between "/" (on mac/linux) and File::nonexistent. Previously all files were stored without a trailing slash, but now in the case of the root dir, the slash is kept. + +============================================================================== +Changelist for version 1.41 + +- handy new macro: numElementsInArray() +- improved menu highlighting of custom menu components +- win32 windowing changes to avoid problems with plugins messing up their host's keyboard accelerators +- new class: ApplicationProperties - this is a handy singleton for managing PropertyFile objects when you need both user-specific settings and settings that are common to all users of a machine +- extra options for PopupMenu to allow more control over the width and number of columns used. Note that there's a small change to the prototype of LookAndFeel::getIdealPopupMenuItemSize, in case you've overridden this in your code +- for consistency, changed the ComboBox to use a normal menu as its popup component, instead of the slightly-different component it had been using. This also involved ditching a load of LookAndFeel methods that were for drawing the old popup. +- the FLAC and Ogg-Vorbis libraries are now embedded and integrated into the juce build. Previously these could only be used if you linked to their library files, which needed building separately, but now it all just works without any external dependencies. +- tweaked the AudioDeviceSelectorComponent to give more flexible control over which channels are enabled in a multi-channel soundcard +- Linux + Mac: added a sockets-based HTTP stream class, so that linux now has this functionality. On the Mac, this replaces the old version which used deprecated OS functions (and which kept randomly crashing deep inside Apple's HTTP code) +- altered the AudioFormat::createWriterFor method to take an OutputStream rather than a FileOutputStream - if you've written a custom AudioFormat you'll have to tweak your method prototypes +- more efficient zip file parsing +- renamed MemoryBlock::to64BitEncoding and MemoryBlock::from64BitEncoding because they're a misnomer, and I must have been a bit muddled when I wrote those. They're now called toBase64Encoding and fromBase64Encoding. +- new methods: String::indexOfAnyOf and lastIndexOfAnyOf +- changes to the prototype of File::findChildFiles, DirectoryIterator, and a couple of other related methods, so that you can use an enum to specify whether to search for files, directories, or both. +- added some methods to ListBox and TableListBox to return the position of rows and cells +- added a method to allow easy drag-and-dropping of treeview items +- added support for the numeric keypad in KeyPress +- added methods to create custom buttons in TabbedComponents, and to save/restore the scroll position of a ListBox +- fixed whitespace display in a password textbox +- jucer: a very useful change allows each co-ordinate of a component to now be made relative to another component instead of the parent, allowing some complex layout behaviour. +- linux: added support for dealing with drag-and-dropped files (thanks to kraken for the code behind that one!) + +============================================================================== +Changelist for version 1.40 + +- Audio Plugins: added an initial release of an RTAS wrapper! +- new classes: IIRFilter and IIRFilterAudioSource +- changed the Synthesiser to use reference counting for SynthesiserSound objects, so that sounds can be allowed to play on after being removed. +- added some colour options to the GroupComponent and Toolbar classes +- added a mouse-sensitivity setting to sliders +- Linux: added support for XShm, which uses shared memory to improve rendering speed +- Added a new method File::getSpecialLocation(), which lets you find out various system paths, e.g. home folders, documents folders, etc. This replaces a bunch of existing static method calls in SystemStats. +- Added a TableListBoxModel::getDragSourceDescription() method to allow easier dragging of table rows +- Added an option to PropertiesFile for creating files that are common to all users. Also tweaked a couple of methods in this class. +- Mac: added a PlatformUtilities method to convert unicode strings to their precomposed form, and used this in lots of file handling routines to avoid mix-ups between encodings of extended characters. +- Altered the directory search code to optimise fetching of file attributes - this should help when browsing directories on slower network drives +- couple of small fixes for TableHeaderComponent in stretch-to-fit mode +- added a new virtual method to OpenGLComponent to provide a callback for setting-up a new GL context +- some improvements to the AudioDeviceManager to make it do a better job of saving and restoring its state +- Jucer: some fixes for embedded jucer components +- changed the PNG loading code to correctly handle interlaced PNG formats +- added methods to convert a Path into a simple string of co-ordinates that can be reloaded. Also added a button to the font demo to turn glyphs into these strings +- added a multi-select option flag to treeviews +- mac + linux: implemented the InterProcessLock class +- fixed DirectSound handling of unicode driver names + +============================================================================== +Changelist for version 1.39 + +- change to the way Components and LookAndFeel objects handle colour. Preset colours are now identified by a unique ID number, and can be retrieved or set either for the lookandfeel object or overridden for an individual component. See the new Component::findColour and LookAndFeel::findColour methods for more info on this. +- new classes: SamplerSound and SamplerVoice, which are used with the Symthesiser class to form a very simple sampler. I've added an example of this to the audio demo. +- some Win32 changes to enable window maximising via the native system menu +- added an option to the Slider class for showing min/max values +- added ALSA midi output support for Linux +- support for Linux displays with only 16-bit colour, and fixes for handling of exteneded keycode input +- added some more string constructors, for creating strings from unsigned integers as well as signed ones +- new class: ComponentMovementWatcher, for keeping track of movements of deeply nested components (probably quite esoteric, but needed for things like OpenGL and ActiveX windows) +- Jucer: made references to embedded jucer files use relative pathnames rather than absolute, so directories of jucer files can be moved easily without breaking links +- Jucer: added constructor parameters properties for the components inside tabbed components, viewports and jucer components. +- Jucer: SVG files can now be dropped in as image resources +- changed the ApplicationCommandManager::getFirstCommandTarget() method to add a command ID parameter +- MemoryBlock::to64BitEncoding now returns a string rather than taking a dest string parameter +- tweaked the ImageCache class to use 64-bit hash-codes +- Plugin toolkit: added a class StandAloneFilterWindow, which is a window object you can use to build a plugin as a standalone app + +============================================================================== +Changelist for version 1.38 + +- Windows: mouse cursors and taskbar icons now use a full 8-bit alpha channel when running on WinXP +- Fixed some SVG bugs and made the parser more efficient +- got rid of the Component::setDragRepeatInterval() method and replaced it with a static method beginDragAutoRepeat(). This makes it easier for a parent component to enable auto-repeat when its children are clicked. +- bugfixes for some keyboard codes on Windows, RelativeTime rounding accuracy, Linux opengl repainting, mac window repainting, BWAV history chunk parsing, Table components, Mac fonts, Mac CoreAudio built-in device pairing, nested modal state return values, full-screen windows using native title bars, linux filenames with extended character sets. +- Windows: updated the network MAC address function, which wasn't correctly finding all network cards on some systems +- changes to allow a 64-bit build on Windows, including greater use of compiler intrinsics +- two new header files: juce_WithoutMacros.h and juce_DefineMacros.h (in the juce/src directory) - these make it easy to include juce.h without it defining macros that may conflict with other 3rd party header files. See the comments in these files for more info. +- tidied up the SystemStats operating system detection detection, to use an enum instead of strings, added Windows Vista detection, and renamed some of the methods. If you use these, you'll probably have to change the method you're calling, but it's not difficult. +- added an option to TreeView to set the indent size +- updated the build instructions for Windows compilers + +============================================================================== +Changelist for version 1.37 + +- new classes: Toolbar and a bunch of related classes. For creating and dynamically customising toolbars. +- new class: ComponentAnimator, which will move and resize components to new positions, taking a specified length of time to get there. There's a button to demonstrate this in the jucedemo widgets section, on the buttons page +- new class: MultiTimer, which is like a Timer, but allows multiple independent timers with different frequencies to share a callback +- fixed a few bugs in the SVG parser and a gradient-rendering bug, and added an SVG object to the "paths + transforms" demo page +- added some assertions to warn people about adding components directly to a ResizableWindow rather than using setContentComponent() +- to improve performance of the ElementComparator class, I've changed the sort routines to use a templated class rather than a virtual method. If this breaks your code, all you need to do is to no longer derive your class from ElementComparator and everything else should continue to work as normal. +- finished off the ThreadPool class, and souped-up the threading page of the demo app to show how to use it. +- added some static methods to Drawable to automatically load Drawables from some kind of image or SVG file +- fixes for some Mac VST and AU windowing bugs +- new method Component::canModalEventBeSentToComponent(), which allows a modal component to selectively allow events to reach components that it is blocking +- fixed deprecated function warnings in MSVC8 +- all projects and solutions are now compatible with MS Visual Studio 2005 - I've renamed some of the vcexpress directories to "vc7", and the projects in them will load with either VCexpress or VC8 +- updated the "hello world" projects to use a document window +- altered the AudioFileFormat::createReaderFor() method to specify whether the input stream should be preserved if opening fails + +============================================================================== +Changelist for version 1.36 + +- Windows: ActiveXComponents (and QuickTime components) now get told about any mouse events that happen inside the control +- Graphics::saveState() now saves the colour and brush as well as the clip region and origin +- SimpleListBox now prevents mouse clicks from getting sent to the list if the component is disabled +- new classes: TableListBox, TableHeaderComponent - these are for creating table components with column headings that can be re-ordered, resized, etc. I've added a table demo to the juce demo to show how to use it, and the Jucer's resources panel also now uses a stretch-to-fit table. +- removed class SimpleListBox: I've got rid of the separate SimpleListBox class, and merged its functionality with ListBox. If you're currently using a SimpleListBox, the only change you should need to make is to replace "SimpleListBox" in your code with "ListBox". +- Changes to ListBox: if you're using a ListBox with custom row components, you'll need to change your class to also derive from ListBoxModel, and make sure you call ListBox::setModel() to make it use your model class. Then you'll need to replace the old createRowComponent() and updateRowComponent() methods with the new refreshComponentForRow() method. +- new handy macro: forEachXmlChildElement, which is a neat way of iterating the child elements of an XmlElement +- new class: StretchableObjectResizer, which is for calculating how to fit a set of resizable items into a given space +- new class: TaskbarIconComponent, on Windows only, this lets you show an icon in the system tray. +- fixes for using a DLL build on Windows - I've moved all the allocators into the juce DLL, so this should now work ok +- added a bit of SSE optimisation in the graphics rendering code (just for blending large blocks of solid colour) + +============================================================================== +Changelist for version 1.35 + +- added a simple SVG parser to the Drawable class - this can parse SVG into a graph of Drawable objects that you can then render. The parser's pretty basic, and doesn't support much of the (very large) SVG spec, but I'll keep adding features to it as they're needed +- fixed the updating of ToggleButtons that are connected to app commands so that they correctly reflect the command's 'ticked' state. +- fixed the XML parser's handling of non-text element entities +- added a few handy static methods to AffineTransform +- gradient fills can now have a transform matrix specified, to deform their shape +- new class: RectanglePlacement, which is a bit like Justification, but specifically for fitting rectangular graphics within a viewport with various positioning options. This will break a few places where you call methods like drawImageWithin(), but is easy to update and the result is more readable code. +- new method Colours::findColourForName() for looking up colour names from a string +- added a flag to ApplicationCommandInfo to stop menus and buttons getting flashed when particular commands are invoked +- new class: CharacterFunctions, which contains a set of static functions for manipulating ascii and unicode characters and null-terminated strings. This is intended to replace any use of functions like strlen, etc, with a set of safe, platform-independent ones. +- some fixes and optimisations to the file chooser components +- altered the Graphics and LowLevelGraphicsContext classes to use a stack for pushing and popping the clip regions, instead of setting these explicitly with a RectangleList. (This change is needed for future support of OS contexts that can't retrieve the clip path as a set of rectangles) +- removed the Graphics class's copy constructor (use the saveState/restoreState methods instead of a temporary copy) +- added method String::indexOfWholeWord() +- tidied up some of the header files, moving all inline functions (like jlimit, jmax, etc) into the juce namespace +- Mac: complete rewite of the windowing code. Components are now placed in HIViews, rather than directly in Windows. As well as being more futureproof, this is vital for support of AudioUnits and VSTs on Intel Macs. +- Mac: tidied up the build environment. It now compiles a universal binary which is compatible with any system from 10.2 onwards, including intel on 10.4 +- Windows: new ActiveXControlComponent class, which lets you embed an ActiveX control in a Juce window. I wrote this to get the new Quicktime control working, but made it generic so you could use it for other things like embedding a web browser, etc. +- Windows: completely rewritten Quicktime support. This now requires QT7 (on windows, not Mac), but it now uses the new ActiveX QT control, which is much better than the archaic way it used to be done. Would like to update the Mac version too, but that'd only work on 10.4, so will wait until older OS versions are less common. +- Windows: fixes for non-western keyboard input sometimes not working in textboxes +- Linux: added a MIDI input device, using ALSA +- Linux: made launching of URLs in the default browser work properly +- Jucer: added an option to view a semi-transparent overlay of the components while editing the background graphics +- Jucer: better positioning of new objects when zoomed-in +- Jucer: added a "common background" graphics layer to buttons, which is drawn behind all the other button states +- Jucer: added key shortcuts for nudging component's position and size around +- JuceAudioPlugin: rewrote the mac VST and AU wrappers to embed a HIView rather than the old window hackery it was using. + +============================================================================== +Changelist for version 1.34 + +- a bunch of changes to continue improving the expressiveness and consistency of listener classes, (and moving away from generic listeners like ChangeListener): +- new class: LabelListener class now replaces Label's use of ChangeListeners +- new class: ComboBoxListener for ComboBoxes, replacing the old use of ActionListener +- new class: ScrollBarListener for ScrollBars, replacing the old use of ChangeListener +- new class: KeyboardFocusTraverser, to take the logic of keyboard focus traversal out of the component class. +- removed the Component::setFocusOrder method - instead, a KeyboardFocusTraverser object now decides the focus order (and can be overridden to support custom behaviours) +- new class: ApplicationCommandManagerListener - this is used to listen for commands being invoked, and for changes to the status of commands. The Button class now uses this so that when a button is linked to a command, it enables itself only when the command is active, and flashes when it's invoked. +- new class: FocusChangeListener - this can be registered with the Desktop class to receive callbacks whenever the focused component changes +- new class: FilenameComponentListener - for getting events from FilenameComponents, replacing the use of ActionListener +- new class: BooleanPropertyComponent - a property component with a toggle button in it +- some fixes to DLL builds on windows +- couple of additions to the MidiKeyboardComponent class +- fix for large menus not scrolling correctly +- got rid of Component::getMouseX() and getMouseY() - this functionality is already available in Desktop::getMousePosition(), so not needed here as well +- replaced the Component::getMouseXRelative() and getMouseYRelative() method with a single method getMouseXYRelative() that returns both co-ordinates at once (this is a more efficient way of doing things) +- added new methods Component::relativePositionToGlobal, globalPositionToRelative and relativePositionToOtherComponent for converting co-ordinates to and from screen co-ords. These replace the old getXRelativeTo() method. +- new class: MagnifierComponent, which magnifies or shrinks any component that you put inside it +- added colour swatches to the ColourSelectorComponent +- Jucer: literal text strings can now contain special strings which are treated as c++ code - anything inside a pair of %% characters counts as c++, so %%getName()%% gets translated into the name of the component; %%getButtonText()%% into getButtonText(), and these are concatenated with the rest of the string. +- Jucer: Button documents now have a list of the various over/down/toggled states for which you want to design paint routines, and any combination of these can be enabled +- Jucer: you can now drag-and-drop a Jucer .cpp file into a component's layout window, and it will add it as a Jucer component +- Jucer: highlighted object borders can now go beyond the edges of the component, making it easier to edit comps that are slightly off-screen or aligned with the edges of the parent comp +- Jucer: new command to bring any items that are off the edges of the screen back into the middle +- Jucer: ComboBoxes and Labels now create callback methods +- Jucer: Zoom mode! As well as the zoom in/out commands on the menus and keyboard, you can use the mouse-wheel with ctrl or alt held down to zoom. +- Jucer: Holding down the space bar now lets you scroll around the component +- Jucer: ability to group paint elements together to treat them as a single entity + +============================================================================== +Changelist for version 1.33 + +- fixed some graphics error with path strokes, and optimised the stroke creation code +- improved the ellipse and rounded rectangle path routines by using cubic approximations +- couple of extra methods for the AsyncUpdater class +- changed sliders so that they now use a SliderListener class to receive callbacks instead of using ChangeListeners +- Jucer: lots and lots of bugfixes +- Jucer: added options for converting text and other graphics elements into paths +- Jucer: Viewports can now have a content component specified, which may be a Jucer component +- Jucer: TabbedComponents can now be edited and have the contents of each tab specified +- Jucer: Added a list of extra callback methods that can be added to the code automatically +- Jucer: Added an option to images to change the stretch mode +- Jucer: Graphic objects can now use an ImageBrush for their fill or stroke +- Jucer: You can now drag-and-drop image files onto the graphics element editor page +- Jucer: Added a tooltip property to those components that implement the SettableTooltipClient interface +- Jucer: Gave it an icon +- Jucer: Sliders now create a SliderListener callback + +============================================================================== +Changelist for version 1.32 + +- Jucer: added undo/redo support! +- Jucer: restructured most of the project, adding support for documents of different types, so now it can create either normal components, or buttons with normal/over/down graphics. More document types can be added in future +- Jucer: added a VC6 project, and fixed some things that didn't build because of VC6 compiler bugs +- Jucer: holding down shift when resizing things now fixes the aspect ratio +- Jucer: holding down ctrl when dragging disables/enables grid-snapping +- added a couple of options to MultiDocumentPanel +- fixed a graphics bug with thick path strokes not being created correctly +- mac: managed to stop it repainting windows unnecessarily while dragging them around + +============================================================================== +Changelist for version 1.31 + +- First release of the Jucer! This is a component development tool that lets you design Juce components and produces c++ code. This initial release is functional but still a work-in-progress - it will be an ongoing project, adding more and more functionality and shortcuts for creating juce-based code. The Jucer source code lives inside the Juce tree, in the juce/jucer folder. +- new class: PositionedRectangle, which specifies a rectangle using either absolute or proportional co-ordinates, and giving flexible control over the anchor points used. Handy for positioning components. +- new set of classes: PropertyComponent, PropertyPanel and various basic subclasses of PropertyComponent. These allow you to quickly set up a properties panel for something, e.g. a selected object, which shows a list of named properties of various types, e.g. text, sliders, combo boxes, etc. +- added a method ApplicationCommandManager::setFirstCommandTarget() to make it easier to set up non-component command targets +- change to the FileBasedDocument load/save methods so that they can return an error message on failure +- new method: Graphics::fillCheckerBoard() +- added options to FileChooser and FileChooserDialogBox to prompt the user about overwriting files that already exist +- change to TabbedComponent, so that instead of using a virtual method to create the components for the tabs, you add components using the addTab method and the TabbedComponent looks after them for you. +- fixes to some focus issues, such as popup menus temporarily moving focus away from the main window +- new class: MultiDocumentPanel to hold multiple document windows as either floating DocumentWindows or in a TabbedComponent. + +============================================================================== +Changelist for version 1.30 + +- major set of new classes to introduce "application commands". This is a powerful mechanism for despatching commands to command targets. It allows commands to be bound to keystrokes and easily triggered by menus, buttons, etc. New classes to support this include ApplicationCommandManager, ApplicationCommandTarget, ApplicationCommandInfo. I've rewritten the Juce demo to use commands to control its menu system, and added key-shortcuts to select the various demos. +- the new app command stuff replaces a lot of the functionality that was in KeyPressMappingSet, so this class has been slimmed down with some functionality moving into the new classes. I've renamed the createXml() and restoreFromXml() methods to draw attention to the slight difference in the way they're used, (and to make the names more consistent with other code) +- new class SettableTooltipClient, and made a lot of the existing widgets inherit from this, to make it easy to set tooltips for them +- new flag in the Justification class - horizontallyJustified, which spreads text out to align both its left and right margins +- tidied up the Uuid class and got rid of any platform-dependent libraries it was using +- the constructor for the Thread class now takes a name, and on windows this gets passed to the debugger to make it easy to see which thread is which. (Haven't got mac or linux implementations for this yet) +- some UI fixes for running under KDE on Linux +- added a File::areFileNamesCaseSensitive() method +- added a method to the MidiInputCallback class to handle incoming sections of a long sysex message. (This is only currently supported on the mac) +- the XML parser now loads extended UTF-8 characters correctly + +============================================================================== +Changelist for version 1.29 + +- moved the Juce demo app into the main Juce tree, to make it all easier to download +- added classes for FLAC and Ogg-Vorbis audio formats +- added support for native window title bars and borders +- moved the window style flag enum out of Component and into ComponentPeer, adding lots of new flags. +- changed some of the methods in ComponentBoundsConstrainer so it'd work with the new windowing stuff +- couple of minor fixes to named pipes on windows +- some Quicktime component fixes and optimisations +- changed the AudioFormat class to allow multiple file extensions, and added a method AudioFormatManager::getWildcardForAllFormats() to make it easy to show browsers for audio files +- on OSX, added a juce.xcconfig file to the XCode build, to make it easier to select whether to build for gcc3 or 4 +- made the TabBarButton class public to allow customised tab bar components +- changed the default font on OSX from Verdana to Lucida Grande, as Verdana isn't actually guaranteed to be installed on all systems + +============================================================================== +Changelist for version 1.28 + +- Cleaned up the audio device driver architecture, adding an AudioIODeviceType class to represent the different types, (e.g. DSound, ASIO, CoreAudio, ALSA, etc). The AudioIODevice class is now an abstract base class, and instances can only be created by using an AudioIODeviceType object. This means that user code no longer needs to care whether support for ASIO is enabled or not. +- Fixes to the ReadWriteLock class +- Couple of bugfixes to stop older VC7 compilers complaining +- Finally found a way of making the windows come to the front correctly under Gnome on Linux +- Fixed a linux mouse focus bug that messed up menus +- New class: Socket, which is.. you guessed it.. a socket. +- New class: NamedPipe, which is, unsurprisingly, a named pipe, for interprocess comms. +- new class: InterprocessConnection, which manages a simple two-way socket or pipe-based message passing connection to another process or machine on the network. +- Added a new interprocess comms page to the demo, to demonstrate InterprocessConnections. +- Improvements to repaint speed on win32 when there are complex repaint regions +- Fix for a mac windowing bug that stopped modal windows coming to the front correctly + +============================================================================== +Changelist for version 1.27 + +- lots of new file selector classes: DirectoryContentsList, FileListComponent, FileChooserDialogBox, FileBrowserComponent, FileFilter, etc. These can be used either as separate components or as a ready-made dialog box file chooser, which means that the Linux build finally has a file chooser! +- jazzed-up the colour selector to give more control over how it looks +- added a simple pattern match (for matching filenames, mainly) to the String class +- fixes to avoid problems with drifting clocks on the new dual-core intel cpus +- added UTF-8 conversion methods to the String class +- made PropertiesFile support unicode strings +- new class: BorderSize, which is used to represent the gaps around things - I've changed a few methods in classes like LookAndFeel, ResizableWindow, Component to use this instead of specifying the gaps manually, which was a bit messy. +- new class: AudioDataConverters, which contains methods for converting floating point audio to various integer formats +- new static_jassert macro for doing compile-time assertions +- fixes for mac MidiInput with certain drivers +- tidied up the MemoryBlock class and got rid of its virtual base class to make it quicker. Also dumped the AlignedMemoryBlock class: if anyone wants it back, let me know and I'll do a new version! +- optimised repainting for cases where there are a lot of deeply-nested components +- tweak to the broadcast message code on win32 to avoid deadlocks +- fixes for GCC4.0 optimised build under linux - the crashes here were due to strict aliasing in some numeric conversion functions. I've been through and made them more complient now. + +============================================================================== +Changelist for version 1.26 + +- Linux audio support using ALSA! This is a first stab at an implementation, so I've only had chance to try it on one soundcard - linux audio experts, please let me know what I've done wrong! +- Restructured the way components are housed in windows, getting rid of NativeDesktopWindow and instead having a ComponentPeer base class, of which there may be more than one implementation. (This won't make any difference to most people, only power-users) +- Graphics contexts now work with a RectangleList as their clip region, instead of just a single rectangle +- added some methods to Desktop to access a list of top-level desktop components +- fixes and improvements to TextEditor, improving its handling of word-wrapping +- added a QuickTime page and an audio input monitor to the demo app. + +============================================================================== +Changelist for version 1.25 + +- new class: TopLevelWindow to handle the concept of "active" windows +- new class: MidiMessageCollector helper for realtime midi input, and created a midi folder to tidy up the directory structure of the midi classes. +- added a JUCE_CATCH_UNHANDLED_EXCEPTIONS config to turn off the juce exception logging +- renamed JUCEApplication::getApplicationInstance() to JUCEApplication::getInstance(), for consistency with all the other singletons. Sorry for the hassle, but it's easy to find-and-replace it in your code. +- finished keyboard navigation for menu bars +- new class: Synthesiser, which is an abstract base class for multitimbral synths. Also added one of these to the audio page of the Juce demo +- TreeViews now have an extra item width parameter for each item, and horizontal scrollbars if items are too wide to fit on screen. + +============================================================================== +Changelist for version 1.24 + +- more flexible gradient control, allowing sequences of colours +- new class: DocumentWindow, which is a resizable window with a titlebar, nice-looking maximise/minimise/close buttons, a menubar, and lots of cool options. +- improved the ability for ResizableWindows to be used as child components as well as on the desktop, without them losing their drop-shadows +- eye-candy changes to ShinyLookAndFeel, adding glassy-looking buttons +- added a JUCE_VERSION macro to allow conditional builds against different juce versions +- added an option to PopupMenu that allows any component to be easily added as a custom component, rather than only ones derived from PopupMenuCustomComponent. +- made the win32 crt memory debugging overrides conditional with JUCE_CHECK_MEMORY_LEAKS macro in juce_Config.h +- new class: LassoComponent for easy lassoing of groups of UI objects +- additions to SelectedItemSet to improve the logic used when multi-selecting items that might be dragged. +- handy new method: File::replaceWithText() +- new class: RecentlyOpenedFilesList +- updated some crt function names for compatibility with the latest msvc pro +- misc fixes to glyph layout, text editor listener callbacks + lots of other things. +- new class: ComponentBoundsConstrainer for more flexible control over resizing and dragging components around. This replaces the ResizableBase class. +- popup menus now accept keyboard navigation (not done this for jumping between them on menubars yet, though) + +============================================================================== +Changelist for version 1.23 + +- new class AudioDeviceManager - this makes it super-easy for audio applications to manage the user's choice of audio and midi devices, and to save and load the user's audio settings. +- new class AudioDeviceSelectorComponent - goes with the AudioDeviceManager to make it easy to let the user change the audio settings. I've also updated the JuceDemo audio section to use these new features. +- fix to ProgressBar +- a few graphics rendering fixes, and some optimisations for pixel blending operations +- change to AudioIODeviceCallback class to add methods to tell the callback when the device starts and stops +- small tweak to AudioSourcePlayer now that it no longer needs to be told the sample rate and buffer size +- a few more tweaks for 64-bit compatibility on linux +- added a checkNewSize() method to ResizableBase and ResizableWindow to allow custom resize constraints. +- fix for a mac midi input bug that could freeze the system when malformed midi packets arrive +- optional drop-shadows on menus via the LookAndFeel class + +============================================================================== +Changelist for version 1.22 + +- new class: AudioFormatManager +- removed any dependencies on DSound.h or DSound.lib so Juce can be built with the latest Platform SDK without needing the DX SDK as well. +- fixed a mac drag-and-drop bug +- made drop-shadows optional for alert boxes + splash screens +- added some fixes for compiling on gcc4.0.2 in mandriva linux +- big restructuring of the graphics code to make it ready for adding OS or hardware-accelerated UI rendering. In its current state it should be pretty much the same speed as before, but I've moved all the software rendering into one class. Small changes to the Image class mean that you can no longer get a pointer to its pixels, you need to lock and unlock a section of the image, so that this will also work in future for images that aren't kept in main memory. + +============================================================================== +Changelist for version 1.21 + +- new class: MidiBuffer - an efficient array of midi messages for use in audio filters +- new class: MidiKeyboardComponent - a UI comp that shows a piano keyboard and has lots of groovy features +- additions to DragAndDropContainer to allow files to be dragged to external applications +- fix to Array::move() +- added a couple of accessor methods to TreeViewItem +- changed the colour selector component to make the alpha-channel optional +- fixed a layout bug with some tooltips +- fixes to the AIFF file format handler +- efficiency improvements to the Timer class +- add a Component::visibilityChanged() callback method +- added file and line info to the internal exception handling code +- linux window focus bugfix + +============================================================================== +Changelist for version 1.20 + +- changes to support the latest XCode 2.2 on the Mac, and some changes ready for Intel-based macs +- changes to support the latest version of VSExpress +- optimisations to DirectoryIterator - should make it much faster when scanning slow disks +- optimised the way Timers are triggered +- mac fixes for repainting transparent windows on 10.4 +- some tweaks necessary for AudioUnit support + +============================================================================== +Changelist for version 1.19 + +- added some more translation macros for various strings that were missing +- translation files can now contain escaped characters, e.g. "\t" or "\n" +- added a method to the QuickTimeMovieComponent to manually unload QT, as the automatic method it was using could interfere with other uses of QT in your app +- on the mac, minimising windows now animates and properly minimises them rather than just hiding them +- on the mac, hide/show application now works correctly +- small fix to ComboBox/FilenameComponent +- updated to include the latest versions of all 3rd party libraries - i.e. libjpeg, libpng and zlib, so lots of speed and security improvements there +- added ImageFileFormat::writeImageToStream() method, currently supporting writing of JPEG and PNG files +- fixed a bug in PopupMenus with a large number of items on them +- fixed a mac audio cd reading bug that could mix up the track order +- option for ComponentDragger to keep the entire thing on-screen + +============================================================================== +Changelist for version 1.18 + +- fixes to the audio resampler, and also to some looping bugs in the audio sources +- ComboBox::getSelectedId() was returning -1 if nothing was selected - changes this to be 0 instead, (it should always have been 0, as item IDs must be non-zero, but -1 is a valid ID) +- added a tryEnter() method to CriticalSection +- some tweaks to DirectSound support to allow the names of input devices to be used as well as those of output devices +- got rid of deprecated calls to strcpy +- a few fixes for gcc4.0 compatibility on linux +- new instructions for linking to the library in XCode + +============================================================================== +Changelist for version 1.17 + +- fixes for the Mac in string parsing and windowing +- fix for initial folder in the directory chooser on windows +- better unicode font name handling for winXP +- added some code for handling uncaught exceptions on the message thread +- made the DialogWindow::closeButtonPressed a pure virtual to force subclasses to handle it properly +- fixes for some keypresses that didn't work on foreign keyboards on the mac + +============================================================================== +Changelist for version 1.16 + +- added some methods to the ComboBox class to allow it to have disabled items in its drop-down list, and also to have separator lines and subheadings for different sections. +- new class: ToneGeneratorAudioSource +- more bugfixes for win98 support, XML, unicode, etc. +- on the mac, added DEBUG macros to the project, as these weren't being properly set up before and assertions were left in the release build +- on the mac, the project now creates two separate lib files for release and debug: libjuce.a and libjucedebug.a. Unfortunately there's no obvious way of making an app link to the correct one depending on whether you're doing a debug build, so you'll need to manually set the one you want in your project. +- on linux, fixed up a SUPPORT_AFFINITIES macro because some distros have obsolete APIs that won't compile the cpu affinity code +- methods to add XML elements to a PropertySet + +============================================================================== +Changelist for version 1.15 + +- got rid of the separate unicode/ansi builds, deleted juce_unicode.h and introduced a JUCE_STRINGS_USE_UNICODE macro which is defined in juce_Config.h. This is now turned on by default, so if there's some reason why you don't want your app to use unicode, you'll need to opt-out by disabling the macro. +- a bunch of unicode fixes and tweaks +- changed the method KeyPressMappingSet::isSafeToInvokeCallbacks() into isSafeToInvokeCommand() so it can choose whether particular commands are safe to run +- added an option to the ResizableBorderComponent and ResizableCornerComponent so that they can enforce a fixed aspect ratio +- new helper method for logging: FileLogger::createDefaultAppLogger() +- new class ResizableBase, as a base class for various resizable components +- various win98 fixes +- made the name of the juce namespace optional +- added methods Rectangle::toString() and fromString() to save/load rectangles easily +- fixed a stupid bug in FilenameComponent +- fixed mac file handling to fully support unicode filenames +- added drag-and-drop functionality to SimpleListBox, with helper methods in ListBox and also a few tweaks to DragAndDropContainer to help it deal with drag sources that are different from the component currently under the mouse. Also updated the demo drag-and-drop to use a listbox. +- various mac UI fixes, including some focus gain/loss improvements +- fixed the Dev-Cpp build, and added a Dev-Cpp project for building the demo app + +============================================================================== +Changelist for version 1.14 + +- tweaks to ComboBox to make it look and work better, and also to give control over the text justification +- buttons and menu items can now be linked to a command in a KeyPressMappingSet, to trigger commands automatically +- change to Buttons - rather than using an ActionListener, buttons now use a special ButtonListener to respond to callbacks. This allows for up/down messages as well as clicks, and provides a pointer to the button that triggered the event. You might have to alter a few of your classes to deal with this - sorry! but it's not too difficult to change and it does make your code neater and more readable. +- Rewrote BubbleComponent to now be a base class for drawing arbitrary graphics inside a speech bubble shape. Created BubbleMessageComponent as a subclass for showing a text message in a bubble (like the old BubbleComponent used to do). +- Sliders now have an optional pop-up bubble that shows you their current value while they're being dragged. This is handy for sliders which don't have a text box. See Slider::setPopupDisplayEnabled() +- Sliders can now have a suffix which they append to the text string that they display, to make it easy to show units without having to write a subclass +- cosmetic improvements to combo-boxes, menus, textboxes, sliders, and a few other bits + pieces +- mouse events now have a click counter to detect triple and quadruple clicks, and the TextEditor uses these to select the current paragraph or entire document +- added methods to the Desktop class to allow "global" MouseListeners to be registered, that will be told about all mouse events to all components +- new classes : MenuBarComponent and MenuBarModel for doing menu bars (obviously). This is a lightweight menu bar component, not yet an OS-specific menubar, which I'll eventually implement on the Mac, but the same model will apply to both. +- A few 64-bit compatibility tweaks, and the MessageCallbackFunction definition (used in MessageManager::callFunctionOnMessageThread()) now returns a void* instead of an int. This shouldn't affect many people. +- new class: FileBasedDocument - writing all the load/save/save-as logic for documents is pretty tedious, so this handy base-class takes care of all that stuff for you, doing all the file dialog boxes and asking whether to overwrite existing files, etc. +- on Windows, you can now build juce as a DLL, and your app can link to the DLL version by simply defining the JUCE_DLL macro before including the juce headers + +============================================================================== +Changelist for version 1.13 + +- tidied up the components directory, recategorising the components that were there and putting them into more appropriate folders +- new class: PreferencesPanel for doing mac-style prefs panels. +- improved the KeyMappingEditorComponent to use a treeview instead of a list, and to just look a bit nicer. +- added parameters to DrawableButton to allow it to show another set of images when used as a toggle button. +- changed DrawableText to use a GlyphArrangement. (Not sure why I didn't do that in the first place) +- new class: ColourGradient for specifying a colour gradient (obviously..) +- DrawablePath now uses a ColourGradient to specify its fill type +- tweaked DrawableButton to make it a bit more flexible +- slider thumb size can now be specified in the lookandfeel class +- sliders now hide the mouse when in velocity-sensitive mode +- completely all-new TabbedComponent class, bearing no resemblence to the old one. This one's much easier to use, has look-and-feel support and looks nicer. I've also split out a TabbedButtonBar class so you can just use the bar on its own, rather than using the TabbedComponent, which manages the whole panel. +- fixed a leak when using modal components +- added a new slider style: LinearBar, which is a left-right bar with the text label over the top +- new class: ProgressBar, and a demo of the ThreadWithProgressWindow class (in jucedemo, widgets page, click the "show a popup menu" and it's under "alert windows") +- more refactoring of the LookAndFeel class, in particular moving colours into the base class so you can create looks with customised colours without needing to override any functions +- added an extra clicked() method to buttons so you can handle right clicks and modifier keys +- added a text colour option to the TextButton +- on Linux, sorted out setting the mouse position and invisible mouse cursors + +============================================================================== +Changelist for version 1.12 + +- fixes to OpenGLComponent to make it work when parent components are moved +- added a flag to allow building of non-GUI apps under linux where UI libraries aren't present +- popup menus can now be positioned to align with a button or other component +- created some static initialiseJuce() functions in juce_Initialisation.h, to make it easy to embed juce in command-line apps or apps that use their own event-loop. +- new class: GroupComponent for drawing a line around a group of components +- new sliders! Completely revamped the Slider class so that it can now do vertical and rotary sliders, as well as allowing user-defined scaling and snapping. +- updated the Mac projects for XCode 2.1 and fixed the GCC4 problems. Apple have just changed the project format for this release, so if you're still on XCode 2.0, then sorry, you'll need to upgrade to build this release. +- a couple of changes to Path to clean up the elliptic-arc and pie-shape drawing methods +- added a Path::addStar() method for drawing star shapes and addBubble() for drawing speech bubble shapes +- new class: ComponentDragger to easily add logic for dragging components around +- new class: ResizableBorderComponent for adding windows-style resizable edges to components +- name change: ResizerComponent is now called ResizableCornerComponent to complement ResizableBorderComponent +- new class: ResizableWindow to make it easy to create top-level windows that are resizable/maximisable, and to make it easy to save/restore their position and state. DialogWindow has also now been changed to use this as its base class. +- renamed method: UndoManager::clear() becomes UndoManager::clearUndoHistory() (just to disambiguate when subclasses are used) +- Component::setInterceptsMouseClicks() can now optionally intercept clicks on child components +- fixed a bug in Array::move +- new set of classes: Drawables - these are used to build up a tree of graphic elements that can be drawn, forming a complex image. So far there are coloured shapes, images and text, but there may be more to add in future. They also have a persistence mechanism so can be saved/loaded and used as a vector graphics format. Although the classes are quite basic at the moment, I might expand these one day to form a way of rendering SVG. +- changes to Buttons - moved all the toggle-button logic into the base class so that all buttons can now have an on/off state and belong to button groups. TextButtons and DrawableButtons use this to draw themselves in an on/off state, and the old ToggleButton class is still there for a tickbox-style toggle button. +- new button type: DrawableButton which takes some Drawables as its image and has a few different styles. This button will ultimately take over from ImageButton and ShapeButton. +- moved isEnabled()/setEnabled() into the Component base class, so that it now applies hierarchically. (previously the different widgets all had their own separate enablement methods) +- fixes and tweaks to the windowing system on Linux to hopefully make it run more happily on Gnome + +============================================================================== +Changelist for version 1.11 + +- fix for some file methods that were failing to identify volume type correctly in OSX10.4 +- rearranged the OpenGL code to move it into the platform-specific folders. +- added openGL support for Linux +- replaced many of the win32 native calls with dual unicode/ansi implementations, so the same code will run on win98 but take advantage of unicode on win2000/XP +- reorganised the String::getHexValue() methods into 32 and 64 bit versions +- new class: SelectedObjectSet - for managing multiply-selected items +- fixed some maths bugs with rendering certain types of gradient brush +- buttons that auto-repeat can now be made to speed up the auto-repeat frequency the longer they're held down +- scrollbars can now have their buttons hidden +- implemented the MD5Checksum class +- new class: PropertySet, which now forms the base class for PropertiesFile +- each Component now has a set of named properties associated with it, which can be inherited from its parent component +- handy new method: DialogWindow::centreAroundComponent() +- finished implementing the Primes class +- finished the RSAKey class, to provide RSA public/private key cryptography +- beefed up the BitArray class, giving it a sign, so it can be used as a large number class, and added some new methods (mostly because they were needed for cryptography) +- implemented the BlowFish class, which is a symmetric-key encryption algorithm +- new layout classes: StretchableLayoutManager and StretchableLayoutResizerBar - these are for creating all kinds of sets of nested components that stretch to fill the available space, with vertical or horizontal divider bars to rescale them. I've added some code to the fonts page of the demo app to demonstrate how to use them +- better makefiles for Linux, generated using premake +- added xinerama support for Linux + +============================================================================== +Changelist for version 1.10 + +- initial rough release of the Linux build! This is only the first release, so there are still a lot of things missing (audio support, file browsers, etc) and it's bound to be a bit buggy, but the demo app works! +- new class: FilenameComponent +- new class: ReadWriteLock for allowing multiple-reader access to a critical section. +- new class: SplashScreen +- new class: LocalisedStrings, which lets you use a translation file in your app for multi-language support +- improved the sample-rate conversion algorithm in ResamplingAudioSource +- some tweaks to the win32 demo projects (rtti wasn't enabled) +- made the image loading code support Exif digital camera files +- some enhancements to TextEditor and ComboBox, to allow a message to be displayed when nothing is yet entered or selected +- fixed a bug in SubregionStream +- changes to make the code GCC 3.4 complient + +============================================================================== +Changelist for version 1.9 + +- OpenGL support with the OpenGLComponent class! +- fixed a bug with Array::addSorted that made list multi-selections go wrong +- added some methods to move array elements around +- added the TimeSliceThread class +- added the FileLogger class + +============================================================================== +Changelist for version 1.8 + +- added some convenience methods to the URL class to download and parse a URL as a string, xml, etc. +- rewrote the TreeView class completely - sorry if you were using the old version, but this one's better, honest! +- TextEditors can now be used for entering passwords with an option to obscure their content +- renamed KeyPressMappingManager to KeyPressMappingSet, and tweaked it slightly +- and a load of bugfixes suggested by users +- updated the i/o streams to use 64-bit read/write positions, (and also the audio reader and writer classes) +- added an option to compile using unicode Win32 calls (turned on in win32_headers.h). This is off by default because although it's better for win2k/XP, it stops apps running on win98. + +============================================================================== +Changelist for version 1.7 + +- new class: MouseHoverDetector +- new key-shortcut classes: KeyPressMappingManager and KeyMappingEditorComponent +- added QuickTime movie support via the QuickTimeMovieComponent class +- mouse-events are now time-stamped with the time the event occurred rather than using the time it was delivered (better for detecting double-clicks, etc)s +- getScreenX() now takes into account windows that are contained in non-juce parent windows (e.g. audio plugins) + +============================================================================== +Changelist for version 1.6 + +- added a MessageManagerLock class for allowing multi-threaded access to UI components +- new audio source classes: PositionableAudioSource, BufferingAudioSource, AudioSourcePlayer, etc to make playback more generic + +============================================================================== +Changelist for version 1.5 + +- added some workarounds to get it to build under the Borland C++ compiler +- added a VCExpress project, that should also (presumably) work in VC7 +- changes to Component::focusGained() and focusLost() to indicate the cause of the focus change - be sure to check your code and update any places you've used these methods! +- changed NativeDesktopWindow::setFullScreen() to restore the last known size when full-screening is turned off +- tweaks to win32 window minimisation because some people had mysterious non-repainting windows when building with certain libraries +- added semi-transparent window support on the mac, and some fixes so that windows with the "appearsOnTaskbar" flag set will appear properly in expose + +============================================================================== +Changelist for version 1.4 + +- made changes to the Mac event handling to allow Juce-based dynamic libraries to work correctly +- cleaned up a lot of warnings under newer MS compilers and got it to build under VC Express +- couple of minor midi bugfixes + +============================================================================== +Changelist for version 1.3 + +- cleaned up various aspects of the code so it'll build under Mingw +- created a DevC++ project to build the library +- added some AudioFormatReader methods to scan for audio levels +- added some more timecode methods to MidiMessage +- the tab/shift-tab key now moves the focus between components +- changes to the DirectSound support to allow easier addressing of the individual devices and pair up matching input/output devices +- better build settings in XCode on the Mac, so it puts the build products in the right folder + +============================================================================== +Changelist for version 1.2 + +- changed various bits of the message-handling code to allow it to work better when used to build DLLs on Windows + +============================================================================== +Changelist for version 1.1 + +- added a StringPairArray class and used it to tidy up some other bits of code +- fixed StringArray::addTokens, which was missing out empty tokens +- added metadata to the audio format readers and writers +- added support for BWAV chunks to WavAudioFormat +- finished some ImageBrush and GradientBrush methods that hadn't been implemented +- added an operator= for the Image class +- tightened up some copy constructors and operator= methods for classes that shouldn't be copied +- added an AudioSubsectionReader class +- added AudioFormatWriter::writeFromAudioReader() and writeFromAudioSource() methods +- added a format type name to AudioFormatReaders and writers +- fixed a small bug with mouse cursors when using modal windows +- added some methods to AudioCDReader to scan for indexes (PC only) +- added FloatElementComparator and IntegerElementComparator classes +- fixed a couple of layout bugettes in AlertWindow +- added the ThreadWithProgressWindow class to make it easy to show a dialog box while a background task completes +- fixed a bug with certain accented characters not displaying correctly on the Mac +- fixed the cursor position sometimes being wrong in TextEditors when undoing/redoing +- added a sample rate parameter to AudioSource::prepareToPlay + +============================================================================== +Changelist for version 1.0 - August 5th 2004 + +- initial release! + +============================================================================== diff --git a/docs/JUCE readme.html b/docs/JUCE readme.html new file mode 100644 index 0000000000..b84851f78c --- /dev/null +++ b/docs/JUCE readme.html @@ -0,0 +1,273 @@ + + + + + + + + + + +JUCE - installation and compiling + + + + +
+ + + +

Introduction - License - +Installation - +Building with VC2005 - +Building with VC Express - +Building with VC6 - +Building with VC7 - +Building with XCode - +Building with Dev-Cpp - +Building on Linux - +

+ +

JUCE

+ +

Introduction

+ +

JUCE is an all-encompassing C++ class +library for developing cross-platform applications.

+ +

A complete doxygen-created API guide is available here +as HTML, or can be downloaded as a precompiled Windows help file from the +downloads page.

+ +

For more help and information, please visit the JUCE website.

+

License

+ +

JUCE is released under the Gnu Public License, +which means it can be freely copied and distributed, and costs nothing to use in open-source applications.

+

If you'd like to release a closed-source application that uses JUCE, commercial licenses are available +for a fee - click here for more information on pricing and terms.

+ +

Installation

+ +

Installing the source code

+ +

The JUCE source code all lives in a folder called, unsurprisingly, juce, which you can unzip +and put somewhere on your system.

+ +

To compile the library, there is a subfolder juce/build that contains projects for different +operating systems and compilers.

+ +

Building the demo application

+ +

Inside the juce folder is a demo application that shows off a few of Juce's features. +The juce/extras/juce demo/build folder contains projects and workspaces for the various platforms and compilers.

+ +

Building your application with JUCE

+ +

Compiling with Microsoft Visual Studio 2005

+ +

The quickest way to get started is to try building the demo application - there's a Visual Studio +soluion in juce/extras/juce demo/build/win32_vc8/jucedemo.sln which contains both the juce +library project and the demo application project.

+

This should build and run with no extra set-up needed in Visual Studio. (If you're using VCExpress Edition +see below for the few extra steps needed).

+

The only thing to check if you're unfamiliar with Visual Studio is that the jucedemo +project needs to be selected as your "startup" project (right-click on the +jucedemo project in the solution explorer for this option). Also, the active configuration should be +set to "Debug" or "Release", (the first time you load a project, VS selects one of the configurations and +usually picks "Debug DLL" as its default, for reasons best known to itself).

+ +

To create your own application that links to Juce:

+
    +
  1. Either make a copy of the example project in juce/projects and rename/customise +it, or create a new application project as an 'empty' WIN32 application - avoid saying yes to +MFC or any of the other rubbish that Visual Studio might offer to pollute your application with.
  2. +
  3. Include the header file juce.h in all your source files (it's best to +put this in a precompiled header).
  4. +
  5. Ensure that the linker's search path for libraries includes the the juce/bin directory. +This path can be set globally, or can be added to your project's linker settings.
  6. +
  7. Choose to link to the "Multithreaded" or "Debug Multithreaded" run-time libraries, depending on +whether you're doing a debug or release build. On VC6, this is set in the Project Settings / C/C++ / Code +Generation options panel. In Visual Studio, it's in the project properties.
  8. +
  9. Make sure that your project has exception handling and run-time type information (RTTI) turned ON.
  10. +
  11. Have a look at the 'hello world' projects, demo projects, or the API documentation about the +JUCEApplication class to find out how to create the application launch code.
  12. +
+ +

Compiling with Microsoft Visual C++ Express edition

+ +

Although VCExpress is basically the same thing as Visual Studio 2005, it doesn't come +with all the Win32 library code pre-installed, so a couple of extra steps are required before JUCE +can be compiled with it:

+ +
    +
  1. Install the latest Platform SDK from Microsoft.
  2. +
  3. A few extra items need to be added to your include and library search paths. The first few +entries on your include path should look like this (obviously you might have things installed in +different places, but the order is important!): +
    C:\Program Files\Microsoft Platform SDK\include
    +C:\Program Files\Microsoft Platform SDK\include\crt
    +C:\Program Files\Microsoft Platform SDK\include\mfc
    +C:\mycode\juce
    +...
    +And the library search path should begin like this: +
    $(VSInstallDir)VC\lib
    +C:\Program Files\Microsoft Platform SDK\lib
    +C:\mycode\juce\bin
    +...
    +
  4. +
+ +

Then, you can follow the same instructions as for Visual Studio 2005 above.

+ +

Compiling with Microsoft Visual Studio 6

+ +

To compile the JUCE .lib files from the source code:

+ +
    +
  1. Install the latest Platform SDK from Microsoft.
  2. +
  3. Set up your include and library search paths. The first few items on your include path +should look like this (obviously you might have things installed in different places, but the +order is important!): +
    C:\Program Files\Microsoft Platform SDK\include
    +C:\Program Files\Microsoft Platform SDK\include\crt
    +C:\Program Files\Microsoft Platform SDK\include\mfc
    +C:\mycode\juce
    +...
    +And the library search path should begin like this: +
    C:\Program Files\Microsoft Visual Studio\VC98\LIB
    +C:\Program Files\Microsoft Platform SDK\lib
    +C:\mycode\juce\bin
    +...
    +
  4. +
  5. Open the juce.dsp project file in juce/build/win32/vc6
  6. +
  7. There are several configurations: debug, release, debug-unicode, and release-unicode. +You can build all or some of these, and the resultant .lib files should end up in the +"juce/bin" folder.
  8. +
+ +

Note that there's a rather lame bug in VC6 that causes an internal compiler error if you include +filenames that are too long. This can get triggered if you put the juce folder in a deeply-nested +directory (such as your user home directory). Unfortunately I think the only workaround for this +is to move the source tree to a shallower directory.

+ +

For info on how to create an application that uses Juce, see the VC2005 notes above.

+ +

Compiling with Microsoft Visual Studio 7

+ +

For VC7, you can import the VC6 projects and this should work ok. It's also possible to +tweak the version number in the VC8 projects so that they can be opened in VC7, but that's a +less reliable method!

+ +

Compiling with XCode on MacOSX

+ +

To compile the JUCE binaries from the source code:

+ +
    +
  1. Open the Juce.xcodeproj file in juce/build/macosx
  2. +
  3. This project has "debug" and "release" configurations, and the library files it creates +are libjuce.a (release) and libjucedebug.a (debug), which will appear +in the juce/bin directory.
  4. +
+ +

Then, to create and build an application:

+ +
    +
  1. Either make a copy of the example project in juce/extras/example projects and rename/customise it, or +create a new "Carbon Application" project.
  2. +
  3. Include the header file juce.h in all your source files.
  4. +
  5. Get rid of any main() functions that XCode might have generated for you, and instead use the +JUCEApplication class as your application launcher - see the API documentation for this +class for more details, or have a look at the example projects, or demos.
  6. +
  7. Drag-and-drop the juce.xcodeproj file into the project's "External Frameworks and Libraries" +list.
  8. +
  9. Expand this item in the treeview, and inside there'll be an item "libjuce.a" or "libjucedebug.a" - drag-and-drop +this into the "link binary with libraries" phase inside the xcode target. When you select either a debug +or release juce build these entries will (usually) update themselves to show the correct debug or release library +name. If you want your project to automatically rebuild Juce when you make changes to a juce file, you can +also add Juce to your target's "Direct Dependency" list (show information for the target, and this is on the +"general" tab).
    Alternative ways of linking to juce would be to add the libjuce.a or libjucedebug.a library to +your "External Frameworks and Libraries" list, or to add switch to the linker's command-line of either "-ljuce" +or "-ljucedebug".
  10. +
  11. You'll also need to add some of the following OSX frameworks to your "External Frameworks and Libraries" list, +depending on what features your application uses: +
    Carbon.framework
    +IOKit.framework
    +CoreAudio.framework
    +CoreMIDI.framework
    +QuickTime.framework
    +OpenGL.framework
    +AGL.framework
    +In future there may be other frameworks that you'll need to link with to support new JUCE features. +(It should be pretty obvious from the link-time error when one of these is missing). +
  12. +
+ +

Creating a JUCE application with Dev-C++

+
    +
  1. open \juce\build\win32\devcpp\juce.dev
  2. +
  3. You may need to install the Platform SDK from Microsoft, and add
    C:\Program Files\Microsoft Platform SDK\Include
    +at the end of your include path to get some of the more recent header files.
  4. +
  5. Compile! It should produce a library file called juce/bin/libjuce.a
  6. +
+ +

Then, to create and build an application:

+
    +
  1. Create a new project, as a "win32 GUI".
  2. +
  3. Remove main.cpp
  4. +
  5. Either copy the example main.cpp from the MSVC juce example project, or write your own based +around the JUCEApplication class
  6. +
  7. In your project settings (alt-P), you'll need to adjust the linker's options so that it links the following libraries: +
    libjuce.a (this will be in your juce/bin/ directory)
    +libwininet.a
    +libdsound.a
    +libole32.a
    +libwinmm.a
    +libgdi32.a
    +libuuid.a
    +libshell32.a
    +libvfw32.a
    +librpcrt4.a (these are all in the Dev-C++ libraries folder)
    +
  8. +
+ +

Creating a JUCE application on Linux with GCC

+ +
    +
  1. Most linux distros should come with the tools you need, although you might want to get hold of +premake, which is used to automatically generate the +juce makefile. (This isn't necessary if you're just going to use the makefile that's provided).
  2. +
  3. Get a command prompt and go into /juce/build/linux
  4. +
  5. To build the debug version, use "make CONFIG=Debug", or use "make CONFIG=Release" +to build the release version. You can also use "make clean" to delete the intermediate +files.
  6. +
+ +

Then, to create and build an application:

+
    +
  1. Building the library will have produced the library files /juce/bin/libjuce.a and +/juce/bin/libjuce_debug.a. You'll need to link to one of these in your app, and you'll +also need to link to these libraries: +
    freetype
    +pthread
    +X11
    +If you've set the JUCE_USE_XINERAMA flag in juce_Config.h, you'll also need to link to the +xinerama library. +And you'll need the GL and GLU libraries if you've enabled +JUCE_OPENGL +
  2. +
+ +
+

***

+
+
+

- Copyright 2005 Raw Material Software Ltd -

+
+
+ + + diff --git a/docs/gpl.txt b/docs/gpl.txt new file mode 100644 index 0000000000..45645b4b53 --- /dev/null +++ b/docs/gpl.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/docs/images/rms_logo.gif b/docs/images/rms_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..bef67a05b3512e278446c39c818c898734abfde3 GIT binary patch literal 3515 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 + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + + CFBundleGetInfoString + + CFBundleIconFile + + CFBundleIdentifier + com.rawmaterialsoftware.JuceAUDemo + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Juce Audio Unit Demo + CFBundlePackageType + BNDL + CFBundleShortVersionString + + CFBundleSignature + ???? + CFBundleVersion + 1.0.0 + + diff --git a/extras/audio plugins/demo/build/AudioUnit/JuceAU.exp b/extras/audio plugins/demo/build/AudioUnit/JuceAU.exp new file mode 100644 index 0000000000..60e62a5185 --- /dev/null +++ b/extras/audio plugins/demo/build/AudioUnit/JuceAU.exp @@ -0,0 +1,9 @@ +# +# This file must contain entries for the two AU entry points. +# +# Your JucePluginCharacteristics.h file must define the prefix used for these function names - for +# more info, see the comments in JucePluginCharacteristics.h +# + +_JuceDemoAUEntry +_JuceDemoAUViewEntry diff --git a/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj b/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..53b8035934 --- /dev/null +++ b/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj @@ -0,0 +1,609 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 3E8BF105079CA60300021B09 /* AUBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199ED03175E1E01CA2136 /* AUBase.h */; }; + 3E8BF106079CA60300021B09 /* AUDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199EF03175E1E01CA2136 /* AUDispatch.h */; }; + 3E8BF107079CA60300021B09 /* AUInputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199F103175E1E01CA2136 /* AUInputElement.h */; }; + 3E8BF108079CA60300021B09 /* AUOutputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199F303175E1E01CA2136 /* AUOutputElement.h */; }; + 3E8BF109079CA60300021B09 /* AUScopeElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199F603175E1E01CA2136 /* AUScopeElement.h */; }; + 3E8BF10A079CA60300021B09 /* ComponentBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199FA03175E1E01CA2136 /* ComponentBase.h */; }; + 3E8BF10B079CA60300021B09 /* AUEffectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199FF03175E1E01CA2136 /* AUEffectBase.h */; }; + 3E8BF10C079CA60300021B09 /* AUBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D19A0F03175E1E01CA2136 /* AUBuffer.h */; }; + 3E8BF10D079CA60300021B09 /* CAStreamBasicDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D19A6903175E8C01CA2136 /* CAStreamBasicDescription.h */; }; + 3E8BF10E079CA60300021B09 /* CAAudioChannelLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7967EF8C04D70E7C00C625F7 /* CAAudioChannelLayout.h */; }; + 3E8BF113079CA60300021B09 /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199EC03175E1E01CA2136 /* AUBase.cpp */; }; + 3E8BF114079CA60300021B09 /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199EE03175E1E01CA2136 /* AUDispatch.cpp */; }; + 3E8BF115079CA60300021B09 /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F003175E1E01CA2136 /* AUInputElement.cpp */; }; + 3E8BF116079CA60300021B09 /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F203175E1E01CA2136 /* AUOutputElement.cpp */; }; + 3E8BF117079CA60300021B09 /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F503175E1E01CA2136 /* AUScopeElement.cpp */; }; + 3E8BF118079CA60300021B09 /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F903175E1E01CA2136 /* ComponentBase.cpp */; }; + 3E8BF119079CA60300021B09 /* AUEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199FE03175E1E01CA2136 /* AUEffectBase.cpp */; }; + 3E8BF11A079CA60300021B09 /* AUBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D19A0E03175E1E01CA2136 /* AUBuffer.cpp */; }; + 3E8BF11B079CA60300021B09 /* CAAudioChannelLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7967EF8B04D70E7C00C625F7 /* CAAudioChannelLayout.cpp */; }; + 3E8BF11C079CA60300021B09 /* CAStreamBasicDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7967EF8D04D70E7C00C625F7 /* CAStreamBasicDescription.cpp */; }; + 3E8BF11F079CA60300021B09 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5AA9A2F0281AAB901C34293 /* CoreFoundation.framework */; }; + 3E8BF120079CA60300021B09 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5AA9A300281AAB901C34293 /* CoreServices.framework */; }; + 3E8BF121079CA60300021B09 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5DA37E702821D04014500A0 /* Carbon.framework */; }; + 3E8BF122079CA60300021B09 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5D19ABE0317606901CA2136 /* AudioUnit.framework */; }; + 845FAE5F0A5C0A6A008C94D8 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */; }; + 845FAEE10A5C2696008C94D8 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 845FAEE00A5C2696008C94D8 /* QuickTime.framework */; }; + 84CFAEFB090964560053C22C /* AUCarbonViewDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D19AAB03175F3201CA2136 /* AUCarbonViewDispatch.cpp */; }; + 84CFAEFC090964560053C22C /* AUCarbonViewControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D19AA903175F3201CA2136 /* AUCarbonViewControl.cpp */; }; + 84CFAEFD090964560053C22C /* AUCarbonViewBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D19AA703175F3201CA2136 /* AUCarbonViewBase.cpp */; }; + 84CFAF0E090965080053C22C /* CarbonEventHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D19AB003175F3201CA2136 /* CarbonEventHandler.cpp */; }; + 84CFAF10090965080053C22C /* CAAUParameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EF64FA42057BC39200D99563 /* CAAUParameter.cpp */; }; + 84CFAFEB0909666C0053C22C /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E8BF154079CA7A800021B09 /* AudioToolbox.framework */; }; + 84CFB029090968590053C22C /* DemoJuceAudioUnit.component in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3E8BF126079CA60300021B09 /* DemoJuceAudioUnit.component */; }; + 84EB400B090A4A2C008FAC1B /* juce_AudioUnitWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84EB4009090A4A2C008FAC1B /* juce_AudioUnitWrapper.cpp */; }; + 84EB400C090A4A2C008FAC1B /* juce_AudioUnitWrapper.r in Rez */ = {isa = PBXBuildFile; fileRef = 84EB400A090A4A2C008FAC1B /* juce_AudioUnitWrapper.r */; }; + 84EB4042090A4F5A008FAC1B /* CAVectorUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4E5DC280898301D00589A5A /* CAVectorUnit.cpp */; }; + 84EB404E090A5116008FAC1B /* JucePluginCharacteristics.h in Headers */ = {isa = PBXBuildFile; fileRef = 84EB404D090A5116008FAC1B /* JucePluginCharacteristics.h */; }; + 84F0521E090674BB00AEC8DB /* Info-JuceAU.plist in Resources */ = {isa = PBXBuildFile; fileRef = 84F05215090674BB00AEC8DB /* Info-JuceAU.plist */; }; + 84F05486090687BF00AEC8DB /* juce_AudioFilterBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F05482090687BF00AEC8DB /* juce_AudioFilterBase.cpp */; }; + 84F05487090687BF00AEC8DB /* juce_AudioFilterBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F05483090687BF00AEC8DB /* juce_AudioFilterBase.h */; }; + 84F05488090687BF00AEC8DB /* juce_AudioFilterEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F05484090687BF00AEC8DB /* juce_AudioFilterEditor.cpp */; }; + 84F05489090687BF00AEC8DB /* juce_AudioFilterEditor.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F05485090687BF00AEC8DB /* juce_AudioFilterEditor.h */; }; + 84F0548F090687F600AEC8DB /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F0548E090687F600AEC8DB /* CoreAudio.framework */; }; + 84F054E80906C8DD00AEC8DB /* AUMIDIBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F054E40906C8DD00AEC8DB /* AUMIDIBase.cpp */; }; + 84F054E90906C8DD00AEC8DB /* AUMIDIBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F054E50906C8DD00AEC8DB /* AUMIDIBase.h */; }; + 84F054EA0906C8DD00AEC8DB /* AUMIDIEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F054E60906C8DD00AEC8DB /* AUMIDIEffectBase.cpp */; }; + 84F054EB0906C8DD00AEC8DB /* AUMIDIEffectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F054E70906C8DD00AEC8DB /* AUMIDIEffectBase.h */; }; + 84F055010906E9EA00AEC8DB /* DemoEditorComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F054FD0906E9EA00AEC8DB /* DemoEditorComponent.cpp */; }; + 84F055020906E9EA00AEC8DB /* DemoEditorComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F054FE0906E9EA00AEC8DB /* DemoEditorComponent.h */; }; + 84F055030906E9EA00AEC8DB /* DemoJuceFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F054FF0906E9EA00AEC8DB /* DemoJuceFilter.cpp */; }; + 84F055040906E9EA00AEC8DB /* DemoJuceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F055000906E9EA00AEC8DB /* DemoJuceFilter.h */; }; + 84F055260906FBCF00AEC8DB /* AUSilentTimeout.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F055250906FBCF00AEC8DB /* AUSilentTimeout.h */; }; + 84F87963093B1EDC00225D65 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F87962093B1EDC00225D65 /* AGL.framework */; }; + 84FDAFE90C15B9E200CD0087 /* libjuce.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FDAFBD0C15B8F100CD0087 /* libjuce.a */; }; + A9E885EA0874B5BF00B2DFE8 /* CAThreadSafeList.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E885E90874B5BF00B2DFE8 /* CAThreadSafeList.h */; }; + F4E5DC2C0898301D00589A5A /* CAVectorUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E5DC290898301D00589A5A /* CAVectorUnit.h */; }; + F4E5DC2D0898301D00589A5A /* CAVectorUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E5DC2A0898301D00589A5A /* CAVectorUnitTypes.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 84FDAFBC0C15B8F100CD0087 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 84F0545A0906865D00AEC8DB /* Juce.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC046055464E500DB518D; + remoteInfo = Juce; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 84CFB0240909684B0053C22C /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "/Users/jules/Library/Audio/Plug-Ins/Components"; + dstSubfolderSpec = 0; + files = ( + 84CFB029090968590053C22C /* DemoJuceAudioUnit.component in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 3E3AAA740670E29D00C484A8 /* AUResources.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; path = AUResources.r; sourceTree = ""; }; + 3E8BF126079CA60300021B09 /* DemoJuceAudioUnit.component */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoJuceAudioUnit.component; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E8BF154079CA7A800021B09 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; + 7967EF8B04D70E7C00C625F7 /* CAAudioChannelLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAudioChannelLayout.cpp; sourceTree = ""; }; + 7967EF8C04D70E7C00C625F7 /* CAAudioChannelLayout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAudioChannelLayout.h; sourceTree = ""; }; + 7967EF8D04D70E7C00C625F7 /* CAStreamBasicDescription.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAStreamBasicDescription.cpp; sourceTree = ""; }; + 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; + 845FAEE00A5C2696008C94D8 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = QuickTime.framework; sourceTree = ""; }; + 84EB4009090A4A2C008FAC1B /* juce_AudioUnitWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioUnitWrapper.cpp; path = ../../../wrapper/formats/AudioUnit/juce_AudioUnitWrapper.cpp; sourceTree = SOURCE_ROOT; }; + 84EB400A090A4A2C008FAC1B /* juce_AudioUnitWrapper.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; name = juce_AudioUnitWrapper.r; path = ../../../wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r; sourceTree = SOURCE_ROOT; }; + 84EB404D090A5116008FAC1B /* JucePluginCharacteristics.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JucePluginCharacteristics.h; path = ../../src/JucePluginCharacteristics.h; sourceTree = SOURCE_ROOT; }; + 84F05215090674BB00AEC8DB /* Info-JuceAU.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = "Info-JuceAU.plist"; sourceTree = ""; }; + 84F05217090674BB00AEC8DB /* JuceAU.exp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.exports; path = JuceAU.exp; sourceTree = ""; }; + 84F0545A0906865D00AEC8DB /* Juce.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Juce.xcodeproj; path = ../../../../../build/macosx/Juce.xcodeproj; sourceTree = SOURCE_ROOT; }; + 84F05482090687BF00AEC8DB /* juce_AudioFilterBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFilterBase.cpp; path = ../../../wrapper/juce_AudioFilterBase.cpp; sourceTree = SOURCE_ROOT; }; + 84F05483090687BF00AEC8DB /* juce_AudioFilterBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFilterBase.h; path = ../../../wrapper/juce_AudioFilterBase.h; sourceTree = SOURCE_ROOT; }; + 84F05484090687BF00AEC8DB /* juce_AudioFilterEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFilterEditor.cpp; path = ../../../wrapper/juce_AudioFilterEditor.cpp; sourceTree = SOURCE_ROOT; }; + 84F05485090687BF00AEC8DB /* juce_AudioFilterEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFilterEditor.h; path = ../../../wrapper/juce_AudioFilterEditor.h; sourceTree = SOURCE_ROOT; }; + 84F0548E090687F600AEC8DB /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 84F054E40906C8DD00AEC8DB /* AUMIDIBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIBase.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp; sourceTree = ""; }; + 84F054E50906C8DD00AEC8DB /* AUMIDIBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AUMIDIBase.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h; sourceTree = ""; }; + 84F054E60906C8DD00AEC8DB /* AUMIDIEffectBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIEffectBase.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp; sourceTree = ""; }; + 84F054E70906C8DD00AEC8DB /* AUMIDIEffectBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AUMIDIEffectBase.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h; sourceTree = ""; }; + 84F054FD0906E9EA00AEC8DB /* DemoEditorComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DemoEditorComponent.cpp; path = ../../src/DemoEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84F054FE0906E9EA00AEC8DB /* DemoEditorComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DemoEditorComponent.h; path = ../../src/DemoEditorComponent.h; sourceTree = SOURCE_ROOT; }; + 84F054FF0906E9EA00AEC8DB /* DemoJuceFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DemoJuceFilter.cpp; path = ../../src/DemoJuceFilter.cpp; sourceTree = SOURCE_ROOT; }; + 84F055000906E9EA00AEC8DB /* DemoJuceFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DemoJuceFilter.h; path = ../../src/DemoJuceFilter.h; sourceTree = SOURCE_ROOT; }; + 84F055250906FBCF00AEC8DB /* AUSilentTimeout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AUSilentTimeout.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h; sourceTree = ""; }; + 84F87962093B1EDC00225D65 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + A3C2CC6105B4A4BE000F141E /* AUViewLocalizedStringKeys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUViewLocalizedStringKeys.h; sourceTree = ""; }; + A9E885E90874B5BF00B2DFE8 /* CAThreadSafeList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAThreadSafeList.h; sourceTree = ""; }; + EF64FA42057BC39200D99563 /* CAAUParameter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAUParameter.cpp; sourceTree = ""; }; + EF64FA43057BC39200D99563 /* CAAUParameter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAUParameter.h; sourceTree = ""; }; + F4E5DC280898301D00589A5A /* CAVectorUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAVectorUnit.cpp; sourceTree = ""; }; + F4E5DC290898301D00589A5A /* CAVectorUnit.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnit.h; sourceTree = ""; }; + F4E5DC2A0898301D00589A5A /* CAVectorUnitTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnitTypes.h; sourceTree = ""; }; + F5AA9A2F0281AAB901C34293 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CoreFoundation.framework; sourceTree = ""; }; + F5AA9A300281AAB901C34293 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CoreServices.framework; sourceTree = ""; }; + F5D199EC03175E1E01CA2136 /* AUBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUBase.cpp; sourceTree = ""; }; + F5D199ED03175E1E01CA2136 /* AUBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUBase.h; sourceTree = ""; }; + F5D199EE03175E1E01CA2136 /* AUDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUDispatch.cpp; sourceTree = ""; }; + F5D199EF03175E1E01CA2136 /* AUDispatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUDispatch.h; sourceTree = ""; }; + F5D199F003175E1E01CA2136 /* AUInputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUInputElement.cpp; sourceTree = ""; }; + F5D199F103175E1E01CA2136 /* AUInputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUInputElement.h; sourceTree = ""; }; + F5D199F203175E1E01CA2136 /* AUOutputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUOutputElement.cpp; sourceTree = ""; }; + F5D199F303175E1E01CA2136 /* AUOutputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUOutputElement.h; sourceTree = ""; }; + F5D199F503175E1E01CA2136 /* AUScopeElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUScopeElement.cpp; sourceTree = ""; }; + F5D199F603175E1E01CA2136 /* AUScopeElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUScopeElement.h; sourceTree = ""; }; + F5D199F903175E1E01CA2136 /* ComponentBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ComponentBase.cpp; sourceTree = ""; }; + F5D199FA03175E1E01CA2136 /* ComponentBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ComponentBase.h; sourceTree = ""; }; + F5D199FE03175E1E01CA2136 /* AUEffectBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUEffectBase.cpp; sourceTree = ""; }; + F5D199FF03175E1E01CA2136 /* AUEffectBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUEffectBase.h; sourceTree = ""; }; + F5D19A0E03175E1E01CA2136 /* AUBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUBuffer.cpp; sourceTree = ""; }; + F5D19A0F03175E1E01CA2136 /* AUBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUBuffer.h; sourceTree = ""; }; + F5D19A6903175E8C01CA2136 /* CAStreamBasicDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CAStreamBasicDescription.h; sourceTree = ""; }; + F5D19AA703175F3201CA2136 /* AUCarbonViewBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUCarbonViewBase.cpp; sourceTree = ""; }; + F5D19AA803175F3201CA2136 /* AUCarbonViewBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUCarbonViewBase.h; sourceTree = ""; }; + F5D19AA903175F3201CA2136 /* AUCarbonViewControl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUCarbonViewControl.cpp; sourceTree = ""; }; + F5D19AAA03175F3201CA2136 /* AUCarbonViewControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUCarbonViewControl.h; sourceTree = ""; }; + F5D19AAB03175F3201CA2136 /* AUCarbonViewDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUCarbonViewDispatch.cpp; sourceTree = ""; }; + F5D19AB003175F3201CA2136 /* CarbonEventHandler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CarbonEventHandler.cpp; sourceTree = ""; }; + F5D19AB103175F3201CA2136 /* CarbonEventHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CarbonEventHandler.h; sourceTree = ""; }; + F5D19ABE0317606901CA2136 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AudioUnit.framework; sourceTree = ""; }; + F5DA37E702821D04014500A0 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Carbon.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3E8BF11E079CA60300021B09 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84FDAFE90C15B9E200CD0087 /* libjuce.a in Frameworks */, + 84CFAFEB0909666C0053C22C /* AudioToolbox.framework in Frameworks */, + 3E8BF11F079CA60300021B09 /* CoreFoundation.framework in Frameworks */, + 3E8BF120079CA60300021B09 /* CoreServices.framework in Frameworks */, + 3E8BF121079CA60300021B09 /* Carbon.framework in Frameworks */, + 3E8BF122079CA60300021B09 /* AudioUnit.framework in Frameworks */, + 84F0548F090687F600AEC8DB /* CoreAudio.framework in Frameworks */, + 84F87963093B1EDC00225D65 /* AGL.framework in Frameworks */, + 845FAEE10A5C2696008C94D8 /* QuickTime.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 84EB403B090A4ED3008FAC1B /* AU specific */ = { + isa = PBXGroup; + children = ( + 84EB4009090A4A2C008FAC1B /* juce_AudioUnitWrapper.cpp */, + 84EB400A090A4A2C008FAC1B /* juce_AudioUnitWrapper.r */, + ); + name = "AU specific"; + sourceTree = ""; + }; + 84F0516D09066DB800AEC8DB /* Plugin Code */ = { + isa = PBXGroup; + children = ( + 84F054FD0906E9EA00AEC8DB /* DemoEditorComponent.cpp */, + 84F054FE0906E9EA00AEC8DB /* DemoEditorComponent.h */, + 84F054FF0906E9EA00AEC8DB /* DemoJuceFilter.cpp */, + 84F055000906E9EA00AEC8DB /* DemoJuceFilter.h */, + 84EB404D090A5116008FAC1B /* JucePluginCharacteristics.h */, + 84F05215090674BB00AEC8DB /* Info-JuceAU.plist */, + 84F05217090674BB00AEC8DB /* JuceAU.exp */, + ); + name = "Plugin Code"; + sourceTree = ""; + }; + 84F0516E09066DC900AEC8DB /* Wrapper Code */ = { + isa = PBXGroup; + children = ( + 84F05482090687BF00AEC8DB /* juce_AudioFilterBase.cpp */, + 84F05483090687BF00AEC8DB /* juce_AudioFilterBase.h */, + 84F05484090687BF00AEC8DB /* juce_AudioFilterEditor.cpp */, + 84F05485090687BF00AEC8DB /* juce_AudioFilterEditor.h */, + 84EB403B090A4ED3008FAC1B /* AU specific */, + F5AA99C50281A64501C34293 /* Apple AU Code */, + ); + name = "Wrapper Code"; + sourceTree = ""; + }; + 84FDAFB90C15B8F100CD0087 /* Products */ = { + isa = PBXGroup; + children = ( + 84FDAFBD0C15B8F100CD0087 /* libjuce.a */, + ); + name = Products; + sourceTree = ""; + }; + A3C2CC6005B4A4BE000F141E /* AUViewBase */ = { + isa = PBXGroup; + children = ( + A3C2CC6105B4A4BE000F141E /* AUViewLocalizedStringKeys.h */, + ); + path = AUViewBase; + sourceTree = ""; + }; + F5AA99B60281A61201C34293 = { + isa = PBXGroup; + children = ( + F5D199EA03175DB401CA2136 /* Source */, + 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */, + F5AA99C40281A62C01C34293 /* Products */, + F5AA9E890281AAC901C34293 /* Frameworks */, + ); + sourceTree = ""; + }; + F5AA99C40281A62C01C34293 /* Products */ = { + isa = PBXGroup; + children = ( + 3E8BF126079CA60300021B09 /* DemoJuceAudioUnit.component */, + ); + name = Products; + sourceTree = ""; + }; + F5AA99C50281A64501C34293 /* Apple AU Code */ = { + isa = PBXGroup; + children = ( + F5D199EB03175E1E01CA2136 /* AUBase */, + A3C2CC6005B4A4BE000F141E /* AUViewBase */, + F5D19AA603175F3201CA2136 /* AUCarbonViewBase */, + F5D199FD03175E1E01CA2136 /* OtherBases */, + F5D19A0C03175E1E01CA2136 /* Utility */, + F5D19A3603175E8C01CA2136 /* PublicUtility */, + ); + name = "Apple AU Code"; + path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic; + sourceTree = ""; + }; + F5AA9E890281AAC901C34293 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 84F0545A0906865D00AEC8DB /* Juce.xcodeproj */, + F5D19ABE0317606901CA2136 /* AudioUnit.framework */, + 3E8BF154079CA7A800021B09 /* AudioToolbox.framework */, + 84F0548E090687F600AEC8DB /* CoreAudio.framework */, + F5DA37E702821D04014500A0 /* Carbon.framework */, + F5AA9A2F0281AAB901C34293 /* CoreFoundation.framework */, + F5AA9A300281AAB901C34293 /* CoreServices.framework */, + 84F87962093B1EDC00225D65 /* AGL.framework */, + 845FAEE00A5C2696008C94D8 /* QuickTime.framework */, + ); + name = Frameworks; + path = /System/Library/Frameworks; + sourceTree = ""; + }; + F5D199EA03175DB401CA2136 /* Source */ = { + isa = PBXGroup; + children = ( + 84F0516D09066DB800AEC8DB /* Plugin Code */, + 84F0516E09066DC900AEC8DB /* Wrapper Code */, + ); + name = Source; + sourceTree = ""; + }; + F5D199EB03175E1E01CA2136 /* AUBase */ = { + isa = PBXGroup; + children = ( + 3E3AAA740670E29D00C484A8 /* AUResources.r */, + F5D199EC03175E1E01CA2136 /* AUBase.cpp */, + F5D199ED03175E1E01CA2136 /* AUBase.h */, + F5D199EE03175E1E01CA2136 /* AUDispatch.cpp */, + F5D199EF03175E1E01CA2136 /* AUDispatch.h */, + F5D199F003175E1E01CA2136 /* AUInputElement.cpp */, + F5D199F103175E1E01CA2136 /* AUInputElement.h */, + F5D199F203175E1E01CA2136 /* AUOutputElement.cpp */, + F5D199F303175E1E01CA2136 /* AUOutputElement.h */, + F5D199F503175E1E01CA2136 /* AUScopeElement.cpp */, + F5D199F603175E1E01CA2136 /* AUScopeElement.h */, + F5D199F903175E1E01CA2136 /* ComponentBase.cpp */, + F5D199FA03175E1E01CA2136 /* ComponentBase.h */, + ); + path = AUBase; + sourceTree = ""; + }; + F5D199FD03175E1E01CA2136 /* OtherBases */ = { + isa = PBXGroup; + children = ( + 84F054E40906C8DD00AEC8DB /* AUMIDIBase.cpp */, + 84F054E50906C8DD00AEC8DB /* AUMIDIBase.h */, + 84F054E60906C8DD00AEC8DB /* AUMIDIEffectBase.cpp */, + 84F054E70906C8DD00AEC8DB /* AUMIDIEffectBase.h */, + F5D199FE03175E1E01CA2136 /* AUEffectBase.cpp */, + F5D199FF03175E1E01CA2136 /* AUEffectBase.h */, + ); + path = OtherBases; + sourceTree = ""; + }; + F5D19A0C03175E1E01CA2136 /* Utility */ = { + isa = PBXGroup; + children = ( + F5D19A0E03175E1E01CA2136 /* AUBuffer.cpp */, + F5D19A0F03175E1E01CA2136 /* AUBuffer.h */, + 84F055250906FBCF00AEC8DB /* AUSilentTimeout.h */, + ); + path = Utility; + sourceTree = ""; + }; + F5D19A3603175E8C01CA2136 /* PublicUtility */ = { + isa = PBXGroup; + children = ( + F4E5DC280898301D00589A5A /* CAVectorUnit.cpp */, + F4E5DC290898301D00589A5A /* CAVectorUnit.h */, + F4E5DC2A0898301D00589A5A /* CAVectorUnitTypes.h */, + A9E885E90874B5BF00B2DFE8 /* CAThreadSafeList.h */, + 7967EF8C04D70E7C00C625F7 /* CAAudioChannelLayout.h */, + 7967EF8B04D70E7C00C625F7 /* CAAudioChannelLayout.cpp */, + F5D19A6903175E8C01CA2136 /* CAStreamBasicDescription.h */, + 7967EF8D04D70E7C00C625F7 /* CAStreamBasicDescription.cpp */, + EF64FA42057BC39200D99563 /* CAAUParameter.cpp */, + EF64FA43057BC39200D99563 /* CAAUParameter.h */, + ); + name = PublicUtility; + path = /Developer/Examples/CoreAudio/PublicUtility; + sourceTree = ""; + }; + F5D19AA603175F3201CA2136 /* AUCarbonViewBase */ = { + isa = PBXGroup; + children = ( + F5D19AA703175F3201CA2136 /* AUCarbonViewBase.cpp */, + F5D19AA803175F3201CA2136 /* AUCarbonViewBase.h */, + F5D19AA903175F3201CA2136 /* AUCarbonViewControl.cpp */, + F5D19AAA03175F3201CA2136 /* AUCarbonViewControl.h */, + F5D19AAB03175F3201CA2136 /* AUCarbonViewDispatch.cpp */, + F5D19AB003175F3201CA2136 /* CarbonEventHandler.cpp */, + F5D19AB103175F3201CA2136 /* CarbonEventHandler.h */, + ); + path = AUCarbonViewBase; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 3E8BF103079CA60300021B09 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E8BF105079CA60300021B09 /* AUBase.h in Headers */, + 3E8BF106079CA60300021B09 /* AUDispatch.h in Headers */, + 3E8BF107079CA60300021B09 /* AUInputElement.h in Headers */, + 3E8BF108079CA60300021B09 /* AUOutputElement.h in Headers */, + 3E8BF109079CA60300021B09 /* AUScopeElement.h in Headers */, + 3E8BF10A079CA60300021B09 /* ComponentBase.h in Headers */, + 3E8BF10B079CA60300021B09 /* AUEffectBase.h in Headers */, + 3E8BF10C079CA60300021B09 /* AUBuffer.h in Headers */, + 3E8BF10D079CA60300021B09 /* CAStreamBasicDescription.h in Headers */, + 3E8BF10E079CA60300021B09 /* CAAudioChannelLayout.h in Headers */, + A9E885EA0874B5BF00B2DFE8 /* CAThreadSafeList.h in Headers */, + F4E5DC2C0898301D00589A5A /* CAVectorUnit.h in Headers */, + F4E5DC2D0898301D00589A5A /* CAVectorUnitTypes.h in Headers */, + 84F05487090687BF00AEC8DB /* juce_AudioFilterBase.h in Headers */, + 84F05489090687BF00AEC8DB /* juce_AudioFilterEditor.h in Headers */, + 84F054E90906C8DD00AEC8DB /* AUMIDIBase.h in Headers */, + 84F054EB0906C8DD00AEC8DB /* AUMIDIEffectBase.h in Headers */, + 84F055020906E9EA00AEC8DB /* DemoEditorComponent.h in Headers */, + 84F055040906E9EA00AEC8DB /* DemoJuceFilter.h in Headers */, + 84F055260906FBCF00AEC8DB /* AUSilentTimeout.h in Headers */, + 84EB404E090A5116008FAC1B /* JucePluginCharacteristics.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 3E8BF102079CA60300021B09 /* JuceAU */ = { + isa = PBXNativeTarget; + buildConfigurationList = A9E884AD0874ABE600B2DFE8 /* Build configuration list for PBXNativeTarget "JuceAU" */; + buildPhases = ( + 3E8BF103079CA60300021B09 /* Headers */, + 3E8BF110079CA60300021B09 /* Resources */, + 3E8BF111079CA60300021B09 /* Sources */, + 3E8BF11E079CA60300021B09 /* Frameworks */, + 3E8BF123079CA60300021B09 /* Rez */, + 84CFB0240909684B0053C22C /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JuceAU; + productInstallPath = "$(USER_LIBRARY_DIR)/Bundles"; + productName = MultitapAU; + productReference = 3E8BF126079CA60300021B09 /* DemoJuceAudioUnit.component */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F5AA99BA0281A61201C34293 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = A9E884B90874ABE600B2DFE8 /* Build configuration list for PBXProject "JuceDemoAU" */; + hasScannedForEncodings = 1; + mainGroup = F5AA99B60281A61201C34293; + productRefGroup = F5AA99C40281A62C01C34293 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 84FDAFB90C15B8F100CD0087 /* Products */; + ProjectRef = 84F0545A0906865D00AEC8DB /* Juce.xcodeproj */; + }, + ); + targets = ( + 3E8BF102079CA60300021B09 /* JuceAU */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 84FDAFBD0C15B8F100CD0087 /* libjuce.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjuce.a; + remoteRef = 84FDAFBC0C15B8F100CD0087 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 3E8BF110079CA60300021B09 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84F0521E090674BB00AEC8DB /* Info-JuceAU.plist in Resources */, + 845FAE5F0A5C0A6A008C94D8 /* juce.xcconfig in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 3E8BF123079CA60300021B09 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + 84EB400C090A4A2C008FAC1B /* juce_AudioUnitWrapper.r in Rez */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3E8BF111079CA60300021B09 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E8BF115079CA60300021B09 /* AUInputElement.cpp in Sources */, + 3E8BF116079CA60300021B09 /* AUOutputElement.cpp in Sources */, + 3E8BF117079CA60300021B09 /* AUScopeElement.cpp in Sources */, + 3E8BF113079CA60300021B09 /* AUBase.cpp in Sources */, + 3E8BF119079CA60300021B09 /* AUEffectBase.cpp in Sources */, + 3E8BF114079CA60300021B09 /* AUDispatch.cpp in Sources */, + 3E8BF11C079CA60300021B09 /* CAStreamBasicDescription.cpp in Sources */, + 3E8BF11B079CA60300021B09 /* CAAudioChannelLayout.cpp in Sources */, + 84CFAF0E090965080053C22C /* CarbonEventHandler.cpp in Sources */, + 84CFAEFB090964560053C22C /* AUCarbonViewDispatch.cpp in Sources */, + 84CFAEFC090964560053C22C /* AUCarbonViewControl.cpp in Sources */, + 84CFAEFD090964560053C22C /* AUCarbonViewBase.cpp in Sources */, + 3E8BF118079CA60300021B09 /* ComponentBase.cpp in Sources */, + 84CFAF10090965080053C22C /* CAAUParameter.cpp in Sources */, + 3E8BF11A079CA60300021B09 /* AUBuffer.cpp in Sources */, + 84F05486090687BF00AEC8DB /* juce_AudioFilterBase.cpp in Sources */, + 84F05488090687BF00AEC8DB /* juce_AudioFilterEditor.cpp in Sources */, + 84F054E80906C8DD00AEC8DB /* AUMIDIBase.cpp in Sources */, + 84F054EA0906C8DD00AEC8DB /* AUMIDIEffectBase.cpp in Sources */, + 84F055010906E9EA00AEC8DB /* DemoEditorComponent.cpp in Sources */, + 84F055030906E9EA00AEC8DB /* DemoJuceFilter.cpp in Sources */, + 84EB400B090A4A2C008FAC1B /* juce_AudioUnitWrapper.cpp in Sources */, + 84EB4042090A4F5A008FAC1B /* CAVectorUnit.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A9E884AE0874ABE600B2DFE8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + EXPORTED_SYMBOLS_FILE = JuceAU.exp; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_USE_GCC3_PFE_SUPPORT = YES; + INFOPLIST_FILE = "Info-JuceAU.plist"; + INSTALL_PATH = "/Library/Audio/Plug-Ins/Components/"; + OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -I / -I /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers"; + PRODUCT_NAME = "$(AU_NAME)"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + "-Wno-non-virtual-dtor", + ); + WRAPPER_EXTENSION = component; + ZERO_LINK = NO; + }; + name = Debug; + }; + A9E884AF0874ABE600B2DFE8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + EXPORTED_SYMBOLS_FILE = JuceAU.exp; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_USE_GCC3_PFE_SUPPORT = YES; + INFOPLIST_FILE = "Info-JuceAU.plist"; + INSTALL_PATH = "/Library/Audio/Plug-Ins/Components/"; + OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -I / -I /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers"; + PRODUCT_NAME = "$(AU_NAME)"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + "-Wno-non-virtual-dtor", + ); + WRAPPER_EXTENSION = component; + ZERO_LINK = NO; + }; + name = Release; + }; + A9E884BA0874ABE600B2DFE8 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */; + buildSettings = { + AU_NAME = DemoJuceAudioUnit; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + HEADER_SEARCH_PATHS = ../../../../../; + LIBRARY_SEARCH_PATHS = ../../../../../bin; + }; + name = Debug; + }; + A9E884BB0874ABE600B2DFE8 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */; + buildSettings = { + AU_NAME = DemoJuceAudioUnit; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + HEADER_SEARCH_PATHS = ../../../../../; + LIBRARY_SEARCH_PATHS = ../../../../../bin; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A9E884AD0874ABE600B2DFE8 /* Build configuration list for PBXNativeTarget "JuceAU" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A9E884AE0874ABE600B2DFE8 /* Debug */, + A9E884AF0874ABE600B2DFE8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + A9E884B90874ABE600B2DFE8 /* Build configuration list for PBXProject "JuceDemoAU" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A9E884BA0874ABE600B2DFE8 /* Debug */, + A9E884BB0874ABE600B2DFE8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = F5AA99BA0281A61201C34293 /* Project object */; +} diff --git a/extras/audio plugins/demo/build/RTAS_Mac/Info.plist b/extras/audio plugins/demo/build/RTAS_Mac/Info.plist new file mode 100644 index 0000000000..fc2ac8d798 --- /dev/null +++ b/extras/audio plugins/demo/build/RTAS_Mac/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + EXECUTABLE_NAME + CFBundleGetInfoString + VERSION_STR + CFBundleIdentifier + com.rawmaterialsoftware.JuceDemo + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + PRODUCT_NAME + CFBundlePackageType + TDMw + CFBundleShortVersionString + VERSION_STR + CFBundleSignature + PTul + CFBundleVersion + VERSION_NUM + LSMultipleInstancesProhibited + true + LSPrefersCarbon + + NSAppleScriptEnabled + No + + diff --git a/extras/audio plugins/demo/build/RTAS_Mac/juce_RTASDemo.xcodeproj/project.pbxproj b/extras/audio plugins/demo/build/RTAS_Mac/juce_RTASDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..0571cfc70e --- /dev/null +++ b/extras/audio plugins/demo/build/RTAS_Mac/juce_RTASDemo.xcodeproj/project.pbxproj @@ -0,0 +1,414 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 5B521CB1088F264F009C75FE /* System.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B521CB0088F264F009C75FE /* System.framework */; }; + 841E07300AF9F015005E6FCC /* DemoEditorComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E072B0AF9F015005E6FCC /* DemoEditorComponent.cpp */; }; + 841E07310AF9F015005E6FCC /* DemoJuceFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E072D0AF9F015005E6FCC /* DemoJuceFilter.cpp */; }; + 841E07390AF9F055005E6FCC /* juce_AudioFilterBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E07350AF9F055005E6FCC /* juce_AudioFilterBase.cpp */; }; + 841E073A0AF9F055005E6FCC /* juce_AudioFilterEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E07370AF9F055005E6FCC /* juce_AudioFilterEditor.cpp */; }; + 841E073D0AF9F099005E6FCC /* juce_RTASUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E073B0AF9F099005E6FCC /* juce_RTASUtilities.cpp */; }; + 841E073E0AF9F099005E6FCC /* juce_RTASWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841E073C0AF9F099005E6FCC /* juce_RTASWrapper.cpp */; }; + 846444EF0AFA005B00E7B2BE /* juce_Wrapper_CEffectGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E20AFA005B00E7B2BE /* juce_Wrapper_CEffectGroup.cpp */; }; + 846444F00AFA005B00E7B2BE /* juce_Wrapper_CEffectGroupMIDI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E30AFA005B00E7B2BE /* juce_Wrapper_CEffectGroupMIDI.cpp */; }; + 846444F10AFA005B00E7B2BE /* juce_Wrapper_CEffectMIDIUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E40AFA005B00E7B2BE /* juce_Wrapper_CEffectMIDIUtils.cpp */; }; + 846444F20AFA005B00E7B2BE /* juce_Wrapper_CEffectProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E50AFA005B00E7B2BE /* juce_Wrapper_CEffectProcess.cpp */; }; + 846444F30AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessAS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E60AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessAS.cpp */; }; + 846444F40AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessMIDI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E70AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessMIDI.cpp */; }; + 846444F50AFA005B00E7B2BE /* juce_Wrapper_CEffectType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E80AFA005B00E7B2BE /* juce_Wrapper_CEffectType.cpp */; }; + 846444F60AFA005B00E7B2BE /* juce_Wrapper_CEffectTypeRTAS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444E90AFA005B00E7B2BE /* juce_Wrapper_CEffectTypeRTAS.cpp */; }; + 846444F70AFA005B00E7B2BE /* juce_Wrapper_ChunkDataParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444EA0AFA005B00E7B2BE /* juce_Wrapper_ChunkDataParser.cpp */; }; + 846444FA0AFA005B00E7B2BE /* juce_Wrapper_PlugInUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846444EE0AFA005B00E7B2BE /* juce_Wrapper_PlugInUtils.cpp */; }; + 846445020AFA00D800E7B2BE /* libPluginLibrary.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 841E066C0AF8E7A2005E6FCC /* libPluginLibrary.a */; }; + 846445060AFA010800E7B2BE /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846445040AFA010800E7B2BE /* AGL.framework */; }; + 846445070AFA010800E7B2BE /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846445050AFA010800E7B2BE /* CoreAudio.framework */; }; + 8464450A0AFA012100E7B2BE /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846445090AFA012100E7B2BE /* QuickTime.framework */; }; + 84C9D7FB0AFA3C9C00F1348E /* juce_Wrapper_Dispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C9D7F90AFA3C9C00F1348E /* juce_Wrapper_Dispatcher.cpp */; }; + 84C9D7FC0AFA3C9C00F1348E /* juce_Wrapper_PluginInitialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C9D7FA0AFA3C9C00F1348E /* juce_Wrapper_PluginInitialize.cpp */; }; + 84EEB4180AFB6679009655FF /* DummyResourceFile.r in Rez */ = {isa = PBXBuildFile; fileRef = 84EEB4170AFB6679009655FF /* DummyResourceFile.r */; }; + 84FDB0120C15BBCE00CD0087 /* libjuce.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FDB0100C15BBA500CD0087 /* libjuce.a */; }; + 8D01CCCE0486CAD60068D4B7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08EA7FFBFE8413EDC02AAC07 /* Carbon.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 841E066B0AF8E7A2005E6FCC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5B521CEB08916D36009C75FE /* PluginLibrary.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B65B09B30860FB0800FE2E6A; + remoteInfo = "Plugin Library"; + }; + 841E07590AF9F2E7005E6FCC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5B521CEB08916D36009C75FE /* PluginLibrary.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = B65B09B20860FB0800FE2E6A; + remoteInfo = "Plugin Library"; + }; + 84FDB00F0C15BBA500CD0087 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 846444D70AF9FFDB00E7B2BE /* Juce.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC046055464E500DB518D; + remoteInfo = Juce; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 08EA7FFBFE8413EDC02AAC07 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 5B521CB0088F264F009C75FE /* System.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = System.framework; path = /System/Library/Frameworks/System.framework; sourceTree = ""; }; + 5B521CEB08916D36009C75FE /* PluginLibrary.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PluginLibrary.xcodeproj; path = /Users/jules/stuff/PT_711_SDK/AlturaPorts/TDMPlugIns/PlugInLibrary/MacBuild/PluginLibrary.xcodeproj; sourceTree = ""; }; + 841E072B0AF9F015005E6FCC /* DemoEditorComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DemoEditorComponent.cpp; path = ../../src/DemoEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; + 841E072C0AF9F015005E6FCC /* DemoEditorComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DemoEditorComponent.h; path = ../../src/DemoEditorComponent.h; sourceTree = SOURCE_ROOT; }; + 841E072D0AF9F015005E6FCC /* DemoJuceFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DemoJuceFilter.cpp; path = ../../src/DemoJuceFilter.cpp; sourceTree = SOURCE_ROOT; }; + 841E072E0AF9F015005E6FCC /* DemoJuceFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DemoJuceFilter.h; path = ../../src/DemoJuceFilter.h; sourceTree = SOURCE_ROOT; }; + 841E072F0AF9F015005E6FCC /* JucePluginCharacteristics.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JucePluginCharacteristics.h; path = ../../src/JucePluginCharacteristics.h; sourceTree = SOURCE_ROOT; }; + 841E07350AF9F055005E6FCC /* juce_AudioFilterBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFilterBase.cpp; path = ../../../wrapper/juce_AudioFilterBase.cpp; sourceTree = SOURCE_ROOT; }; + 841E07360AF9F055005E6FCC /* juce_AudioFilterBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFilterBase.h; path = ../../../wrapper/juce_AudioFilterBase.h; sourceTree = SOURCE_ROOT; }; + 841E07370AF9F055005E6FCC /* juce_AudioFilterEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFilterEditor.cpp; path = ../../../wrapper/juce_AudioFilterEditor.cpp; sourceTree = SOURCE_ROOT; }; + 841E07380AF9F055005E6FCC /* juce_AudioFilterEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFilterEditor.h; path = ../../../wrapper/juce_AudioFilterEditor.h; sourceTree = SOURCE_ROOT; }; + 841E073B0AF9F099005E6FCC /* juce_RTASUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTASUtilities.cpp; path = ../../../wrapper/formats/RTAS/juce_RTASUtilities.cpp; sourceTree = SOURCE_ROOT; }; + 841E073C0AF9F099005E6FCC /* juce_RTASWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTASWrapper.cpp; path = ../../../wrapper/formats/RTAS/juce_RTASWrapper.cpp; sourceTree = SOURCE_ROOT; }; + 841E07420AF9F126005E6FCC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; }; + 846444D70AF9FFDB00E7B2BE /* Juce.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Juce.xcodeproj; path = ../../../../../build/macosx/Juce.xcodeproj; sourceTree = SOURCE_ROOT; }; + 846444E20AFA005B00E7B2BE /* juce_Wrapper_CEffectGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectGroup.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp; sourceTree = SOURCE_ROOT; }; + 846444E30AFA005B00E7B2BE /* juce_Wrapper_CEffectGroupMIDI.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectGroupMIDI.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp; sourceTree = SOURCE_ROOT; }; + 846444E40AFA005B00E7B2BE /* juce_Wrapper_CEffectMIDIUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectMIDIUtils.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp; sourceTree = SOURCE_ROOT; }; + 846444E50AFA005B00E7B2BE /* juce_Wrapper_CEffectProcess.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectProcess.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp; sourceTree = SOURCE_ROOT; }; + 846444E60AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessAS.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectProcessAS.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp; sourceTree = SOURCE_ROOT; }; + 846444E70AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessMIDI.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectProcessMIDI.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp; sourceTree = SOURCE_ROOT; }; + 846444E80AFA005B00E7B2BE /* juce_Wrapper_CEffectType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectType.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp; sourceTree = SOURCE_ROOT; }; + 846444E90AFA005B00E7B2BE /* juce_Wrapper_CEffectTypeRTAS.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_CEffectTypeRTAS.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp; sourceTree = SOURCE_ROOT; }; + 846444EA0AFA005B00E7B2BE /* juce_Wrapper_ChunkDataParser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_ChunkDataParser.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp; sourceTree = SOURCE_ROOT; }; + 846444ED0AFA005B00E7B2BE /* juce_Wrapper_Header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Wrapper_Header.h; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h; sourceTree = SOURCE_ROOT; }; + 846444EE0AFA005B00E7B2BE /* juce_Wrapper_PlugInUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_PlugInUtils.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp; sourceTree = SOURCE_ROOT; }; + 846445040AFA010800E7B2BE /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + 846445050AFA010800E7B2BE /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 846445090AFA012100E7B2BE /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + 84C442690B306D39003FCBFF /* CommonReleaseSettings.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = CommonReleaseSettings.xcconfig; path = /Users/jules/stuff/PT_711_SDK/AlturaPorts/TDMPlugIns/common/Mac/CommonReleaseSettings.xcconfig; sourceTree = ""; }; + 84C4426A0B306D39003FCBFF /* CommonDebugSettings.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = CommonDebugSettings.xcconfig; path = /Users/jules/stuff/PT_711_SDK/AlturaPorts/TDMPlugIns/common/Mac/CommonDebugSettings.xcconfig; sourceTree = ""; }; + 84C9D7F90AFA3C9C00F1348E /* juce_Wrapper_Dispatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_Dispatcher.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp; sourceTree = SOURCE_ROOT; }; + 84C9D7FA0AFA3C9C00F1348E /* juce_Wrapper_PluginInitialize.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Wrapper_PluginInitialize.cpp; path = ../../../wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp; sourceTree = SOURCE_ROOT; }; + 84EEB4170AFB6679009655FF /* DummyResourceFile.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; name = DummyResourceFile.r; path = ../../../wrapper/formats/RTAS/DummyResourceFile.r; sourceTree = SOURCE_ROOT; }; + 84F5CF5F0B1B705E00A2E279 /* juce_RTASCompileFlags.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_RTASCompileFlags.h; path = ../../../wrapper/formats/RTAS/juce_RTASCompileFlags.h; sourceTree = SOURCE_ROOT; }; + 8D01CCD20486CAD60068D4B7 /* JuceRTASDemo.dpm */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JuceRTASDemo.dpm; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D01CCCD0486CAD60068D4B7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84FDB0120C15BBCE00CD0087 /* libjuce.a in Frameworks */, + 846445020AFA00D800E7B2BE /* libPluginLibrary.a in Frameworks */, + 8D01CCCE0486CAD60068D4B7 /* Carbon.framework in Frameworks */, + 5B521CB1088F264F009C75FE /* System.framework in Frameworks */, + 846445060AFA010800E7B2BE /* AGL.framework in Frameworks */, + 846445070AFA010800E7B2BE /* CoreAudio.framework in Frameworks */, + 8464450A0AFA012100E7B2BE /* QuickTime.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 089C166AFE841209C02AAC07 /* ProjectTemplate */ = { + isa = PBXGroup; + children = ( + 84C442690B306D39003FCBFF /* CommonReleaseSettings.xcconfig */, + 84C4426A0B306D39003FCBFF /* CommonDebugSettings.xcconfig */, + 08FB77ADFE841716C02AAC07 /* Source */, + 089C167CFE841241C02AAC07 /* Resources */, + 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */, + 19C28FB4FE9D528D11CA2CBB /* Products */, + ); + name = ProjectTemplate; + sourceTree = ""; + }; + 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 846445040AFA010800E7B2BE /* AGL.framework */, + 846445050AFA010800E7B2BE /* CoreAudio.framework */, + 846445090AFA012100E7B2BE /* QuickTime.framework */, + 846444D70AF9FFDB00E7B2BE /* Juce.xcodeproj */, + 5B521CEB08916D36009C75FE /* PluginLibrary.xcodeproj */, + 5B521CB0088F264F009C75FE /* System.framework */, + 08EA7FFBFE8413EDC02AAC07 /* Carbon.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C167CFE841241C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 84EEB4170AFB6679009655FF /* DummyResourceFile.r */, + 841E07420AF9F126005E6FCC /* Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77ADFE841716C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 841E07270AF9EFE2005E6FCC /* filter */, + 841E072A0AF9EFEF005E6FCC /* wrapper */, + ); + name = Source; + sourceTree = ""; + }; + 19C28FB4FE9D528D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D01CCD20486CAD60068D4B7 /* JuceRTASDemo.dpm */, + ); + name = Products; + sourceTree = ""; + }; + 841E06680AF8E7A2005E6FCC /* Products */ = { + isa = PBXGroup; + children = ( + 841E066C0AF8E7A2005E6FCC /* libPluginLibrary.a */, + ); + name = Products; + sourceTree = ""; + }; + 841E07270AF9EFE2005E6FCC /* filter */ = { + isa = PBXGroup; + children = ( + 841E072B0AF9F015005E6FCC /* DemoEditorComponent.cpp */, + 841E072C0AF9F015005E6FCC /* DemoEditorComponent.h */, + 841E072D0AF9F015005E6FCC /* DemoJuceFilter.cpp */, + 841E072E0AF9F015005E6FCC /* DemoJuceFilter.h */, + 841E072F0AF9F015005E6FCC /* JucePluginCharacteristics.h */, + ); + name = filter; + sourceTree = ""; + }; + 841E072A0AF9EFEF005E6FCC /* wrapper */ = { + isa = PBXGroup; + children = ( + 841E07350AF9F055005E6FCC /* juce_AudioFilterBase.cpp */, + 841E07360AF9F055005E6FCC /* juce_AudioFilterBase.h */, + 841E07370AF9F055005E6FCC /* juce_AudioFilterEditor.cpp */, + 841E07380AF9F055005E6FCC /* juce_AudioFilterEditor.h */, + 841E07340AF9F02D005E6FCC /* rtas specific */, + ); + name = wrapper; + sourceTree = ""; + }; + 841E07340AF9F02D005E6FCC /* rtas specific */ = { + isa = PBXGroup; + children = ( + 846444E10AFA003B00E7B2BE /* Digi code wrappers */, + 841E073B0AF9F099005E6FCC /* juce_RTASUtilities.cpp */, + 841E073C0AF9F099005E6FCC /* juce_RTASWrapper.cpp */, + 84F5CF5F0B1B705E00A2E279 /* juce_RTASCompileFlags.h */, + ); + name = "rtas specific"; + sourceTree = ""; + }; + 846444E10AFA003B00E7B2BE /* Digi code wrappers */ = { + isa = PBXGroup; + children = ( + 84C9D7F90AFA3C9C00F1348E /* juce_Wrapper_Dispatcher.cpp */, + 84C9D7FA0AFA3C9C00F1348E /* juce_Wrapper_PluginInitialize.cpp */, + 846444E20AFA005B00E7B2BE /* juce_Wrapper_CEffectGroup.cpp */, + 846444E30AFA005B00E7B2BE /* juce_Wrapper_CEffectGroupMIDI.cpp */, + 846444E40AFA005B00E7B2BE /* juce_Wrapper_CEffectMIDIUtils.cpp */, + 846444E50AFA005B00E7B2BE /* juce_Wrapper_CEffectProcess.cpp */, + 846444E60AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessAS.cpp */, + 846444E70AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessMIDI.cpp */, + 846444E80AFA005B00E7B2BE /* juce_Wrapper_CEffectType.cpp */, + 846444E90AFA005B00E7B2BE /* juce_Wrapper_CEffectTypeRTAS.cpp */, + 846444EA0AFA005B00E7B2BE /* juce_Wrapper_ChunkDataParser.cpp */, + 846444ED0AFA005B00E7B2BE /* juce_Wrapper_Header.h */, + 846444EE0AFA005B00E7B2BE /* juce_Wrapper_PlugInUtils.cpp */, + ); + name = "Digi code wrappers"; + sourceTree = ""; + }; + 84FDB00C0C15BBA500CD0087 /* Products */ = { + isa = PBXGroup; + children = ( + 84FDB0100C15BBA500CD0087 /* libjuce.a */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D01CCC60486CAD60068D4B7 /* JuceRTASDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5B521C99088F2389009C75FE /* Build configuration list for PBXNativeTarget "JuceRTASDemo" */; + buildPhases = ( + 8D01CCCB0486CAD60068D4B7 /* Sources */, + 8D01CCCD0486CAD60068D4B7 /* Frameworks */, + 5B521D370891748B009C75FE /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + 841E075A0AF9F2E7005E6FCC /* PBXTargetDependency */, + ); + name = JuceRTASDemo; + productInstallPath = "$(HOME)/Library/Bundles"; + productName = ProjectTemplate; + productReference = 8D01CCD20486CAD60068D4B7 /* JuceRTASDemo.dpm */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 089C1669FE841209C02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 5B521C9D088F2389009C75FE /* Build configuration list for PBXProject "juce_RTASDemo" */; + hasScannedForEncodings = 1; + mainGroup = 089C166AFE841209C02AAC07 /* ProjectTemplate */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 84FDB00C0C15BBA500CD0087 /* Products */; + ProjectRef = 846444D70AF9FFDB00E7B2BE /* Juce.xcodeproj */; + }, + { + ProductGroup = 841E06680AF8E7A2005E6FCC /* Products */; + ProjectRef = 5B521CEB08916D36009C75FE /* PluginLibrary.xcodeproj */; + }, + ); + targets = ( + 8D01CCC60486CAD60068D4B7 /* JuceRTASDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 841E066C0AF8E7A2005E6FCC /* libPluginLibrary.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libPluginLibrary.a; + remoteRef = 841E066B0AF8E7A2005E6FCC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 84FDB0100C15BBA500CD0087 /* libjuce.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjuce.a; + remoteRef = 84FDB00F0C15BBA500CD0087 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXRezBuildPhase section */ + 5B521D370891748B009C75FE /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + 84EEB4180AFB6679009655FF /* DummyResourceFile.r in Rez */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D01CCCB0486CAD60068D4B7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 841E07300AF9F015005E6FCC /* DemoEditorComponent.cpp in Sources */, + 841E07310AF9F015005E6FCC /* DemoJuceFilter.cpp in Sources */, + 841E07390AF9F055005E6FCC /* juce_AudioFilterBase.cpp in Sources */, + 841E073A0AF9F055005E6FCC /* juce_AudioFilterEditor.cpp in Sources */, + 841E073D0AF9F099005E6FCC /* juce_RTASUtilities.cpp in Sources */, + 841E073E0AF9F099005E6FCC /* juce_RTASWrapper.cpp in Sources */, + 846444EF0AFA005B00E7B2BE /* juce_Wrapper_CEffectGroup.cpp in Sources */, + 846444F00AFA005B00E7B2BE /* juce_Wrapper_CEffectGroupMIDI.cpp in Sources */, + 846444F10AFA005B00E7B2BE /* juce_Wrapper_CEffectMIDIUtils.cpp in Sources */, + 846444F20AFA005B00E7B2BE /* juce_Wrapper_CEffectProcess.cpp in Sources */, + 846444F30AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessAS.cpp in Sources */, + 846444F40AFA005B00E7B2BE /* juce_Wrapper_CEffectProcessMIDI.cpp in Sources */, + 846444F50AFA005B00E7B2BE /* juce_Wrapper_CEffectType.cpp in Sources */, + 846444F60AFA005B00E7B2BE /* juce_Wrapper_CEffectTypeRTAS.cpp in Sources */, + 846444F70AFA005B00E7B2BE /* juce_Wrapper_ChunkDataParser.cpp in Sources */, + 846444FA0AFA005B00E7B2BE /* juce_Wrapper_PlugInUtils.cpp in Sources */, + 84C9D7FB0AFA3C9C00F1348E /* juce_Wrapper_Dispatcher.cpp in Sources */, + 84C9D7FC0AFA3C9C00F1348E /* juce_Wrapper_PluginInitialize.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 841E075A0AF9F2E7005E6FCC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Plugin Library"; + targetProxy = 841E07590AF9F2E7005E6FCC /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 5B521C9A088F2389009C75FE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 5B521C9E088F2389009C75FE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 84C4426A0B306D39003FCBFF /* CommonDebugSettings.xcconfig */; + buildSettings = { + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + MacBag = /Users/jules/stuff/PT_711_SDK/MacBag; + PRODUCT_NAME = JuceRTASDemo; + USER_HEADER_SEARCH_PATHS = "/Users/jules/code/juce $(inherited)"; + }; + name = Debug; + }; + 5BEA73AA09E4370600964A97 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; + 5BEA73AB09E4370600964A97 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 84C442690B306D39003FCBFF /* CommonReleaseSettings.xcconfig */; + buildSettings = { + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + MacBag = /Users/jules/stuff/PT_711_SDK/MacBag; + PRODUCT_NAME = JuceRTASDemo; + USER_HEADER_SEARCH_PATHS = "/Users/jules/code/juce $(inherited)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5B521C99088F2389009C75FE /* Build configuration list for PBXNativeTarget "JuceRTASDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B521C9A088F2389009C75FE /* Debug */, + 5BEA73AA09E4370600964A97 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 5B521C9D088F2389009C75FE /* Build configuration list for PBXProject "juce_RTASDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B521C9E088F2389009C75FE /* Debug */, + 5BEA73AB09E4370600964A97 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 089C1669FE841209C02AAC07 /* Project object */; +} diff --git a/extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.sln b/extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.sln new file mode 100644 index 0000000000..3c50d69e64 --- /dev/null +++ b/extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "juce_RTAS", "juce_RTAS.vcproj", "{2EB09DDD-CF48-45ED-9698-6C5ADF123C98}" + ProjectSection(ProjectDependencies) = postProject + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} = {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JUCE", "..\..\..\..\..\build\win32\vc8\JUCE.vcproj", "{AE232C11-D91C-4CA1-B24E-8B11A52EFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug DLL|Win32 = Debug DLL|Win32 + Debug|Win32 = Debug|Win32 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Release|Win32 = DLL Release|Win32 + Release DLL|Win32 = Release DLL|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Debug DLL|Win32.ActiveCfg = Debug|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Debug DLL|Win32.Build.0 = Debug|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Debug|Win32.ActiveCfg = Debug|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Debug|Win32.Build.0 = Debug|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.DLL Debug|Win32.Build.0 = Debug|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.DLL Release|Win32.ActiveCfg = Release|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.DLL Release|Win32.Build.0 = Release|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Release DLL|Win32.ActiveCfg = Release|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Release DLL|Win32.Build.0 = Release|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Release|Win32.ActiveCfg = Release|Win32 + {2EB09DDD-CF48-45ED-9698-6C5ADF123C98}.Release|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug DLL|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug DLL|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release DLL|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release DLL|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.vcproj b/extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.vcproj new file mode 100644 index 0000000000..f782ce1c17 --- /dev/null +++ b/extras/audio plugins/demo/build/RTAS_Win32/juce_RTAS.vcproj @@ -0,0 +1,649 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/audio plugins/demo/build/RTAS_Win32/juce_RTASDemo.rc b/extras/audio plugins/demo/build/RTAS_Win32/juce_RTASDemo.rc new file mode 100644 index 0000000000..086a710a53 --- /dev/null +++ b/extras/audio plugins/demo/build/RTAS_Win32/juce_RTASDemo.rc @@ -0,0 +1,112 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.K.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904b0" + BEGIN + VALUE "FileDescription", "Juce Audio Plugin RTAS Demo" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "Juce RTAS Demo" + VALUE "LegalCopyright", "Copyright (C) 2006" + VALUE "ProductName", "Juce RTAS Demo" + VALUE "ProductVersion", "1, 0, 0, 1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1200 + END +END + +#endif // English (U.K.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/extras/audio plugins/demo/build/RTAS_Win32/resource.h b/extras/audio plugins/demo/build/RTAS_Win32/resource.h new file mode 100644 index 0000000000..184fcb49e8 --- /dev/null +++ b/extras/audio plugins/demo/build/RTAS_Win32/resource.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by juce_RTASDemo.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/extras/audio plugins/demo/build/VST_Mac/Info.plist b/extras/audio plugins/demo/build/VST_Mac/Info.plist new file mode 100644 index 0000000000..c5b8c15fef --- /dev/null +++ b/extras/audio plugins/demo/build/VST_Mac/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + JuceVST + CFBundleGetInfoString + Juce VST Demo plugin + CFBundleIconFile + + CFBundleIdentifier + com.rawmaterialsoftware.JuceVSTDemo + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + JuceVST + CFBundlePackageType + BNDL + CFBundleShortVersionString + + CFBundleSignature + JUCE + CFBundleVersion + 0.0.1 + + diff --git a/extras/audio plugins/demo/build/VST_Mac/JuceVST-Info.plist b/extras/audio plugins/demo/build/VST_Mac/JuceVST-Info.plist new file mode 100644 index 0000000000..688e659fa4 --- /dev/null +++ b/extras/audio plugins/demo/build/VST_Mac/JuceVST-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + JuceVST + CFBundleIdentifier + com.rawmaterialsoftware.JuceVST + CFBundleInfoDictionaryVersion + 1.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + yes + + diff --git a/extras/audio plugins/demo/build/VST_Mac/JuceVST.xcodeproj/project.pbxproj b/extras/audio plugins/demo/build/VST_Mac/JuceVST.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..15940cedcd --- /dev/null +++ b/extras/audio plugins/demo/build/VST_Mac/JuceVST.xcodeproj/project.pbxproj @@ -0,0 +1,301 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 8456E9D008A29AE60087C412 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8456E9CF08A29AE60087C412 /* CoreServices.framework */; }; + 845FAE4C0A5C09FA008C94D8 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 845FAE4B0A5C09FA008C94D8 /* juce.xcconfig */; }; + 84BACBD20987847C0073300C /* juce_VstWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84BACBD10987847C0073300C /* juce_VstWrapper.cpp */; }; + 84E1AE51089EBAAA00E85E4F /* DemoEditorComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84E1AE4D089EBAAA00E85E4F /* DemoEditorComponent.cpp */; }; + 84E1AE52089EBAAA00E85E4F /* DemoJuceFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84E1AE4F089EBAAA00E85E4F /* DemoJuceFilter.cpp */; }; + 84E1AE59089EBAEA00E85E4F /* juce_AudioFilterBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84E1AE55089EBAEA00E85E4F /* juce_AudioFilterBase.cpp */; }; + 84E1AE5A089EBAEA00E85E4F /* juce_AudioFilterEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84E1AE57089EBAEA00E85E4F /* juce_AudioFilterEditor.cpp */; }; + 84E1AF2B089EBE4C00E85E4F /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E1AF2A089EBE4C00E85E4F /* Carbon.framework */; }; + 84E1AF30089EBE5A00E85E4F /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E1AF2F089EBE5A00E85E4F /* QuickTime.framework */; }; + 84E1AF34089EBE6C00E85E4F /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E1AF33089EBE6C00E85E4F /* AGL.framework */; }; + 84E1AF38089EBF1300E85E4F /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E1AF37089EBF1300E85E4F /* CoreAudio.framework */; }; + 84E1AF42089EBFD900E85E4F /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 84E1AF41089EBFD900E85E4F /* Info.plist */; }; + 84F5CF040B1B66B100A2E279 /* How to use this framework.txt in Resources */ = {isa = PBXBuildFile; fileRef = 84F5CF030B1B66B100A2E279 /* How to use this framework.txt */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 84551AA009BDB8F3009C9F3E /* JucePluginCharacteristics.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JucePluginCharacteristics.h; path = ../../src/JucePluginCharacteristics.h; sourceTree = SOURCE_ROOT; }; + 8456E9CF08A29AE60087C412 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; + 845FAE4B0A5C09FA008C94D8 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; + 84BACBD10987847C0073300C /* juce_VstWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VstWrapper.cpp; path = ../../../wrapper/formats/VST/juce_VstWrapper.cpp; sourceTree = SOURCE_ROOT; }; + 84E1AE47089EBA6A00E85E4F /* JuceVST.vst */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JuceVST.vst; sourceTree = BUILT_PRODUCTS_DIR; }; + 84E1AE4D089EBAAA00E85E4F /* DemoEditorComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DemoEditorComponent.cpp; path = ../../src/DemoEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; + 84E1AE4E089EBAAA00E85E4F /* DemoEditorComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DemoEditorComponent.h; path = ../../src/DemoEditorComponent.h; sourceTree = SOURCE_ROOT; }; + 84E1AE4F089EBAAA00E85E4F /* DemoJuceFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DemoJuceFilter.cpp; path = ../../src/DemoJuceFilter.cpp; sourceTree = SOURCE_ROOT; }; + 84E1AE50089EBAAA00E85E4F /* DemoJuceFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DemoJuceFilter.h; path = ../../src/DemoJuceFilter.h; sourceTree = SOURCE_ROOT; }; + 84E1AE55089EBAEA00E85E4F /* juce_AudioFilterBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFilterBase.cpp; path = ../../../wrapper/juce_AudioFilterBase.cpp; sourceTree = SOURCE_ROOT; }; + 84E1AE56089EBAEA00E85E4F /* juce_AudioFilterBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFilterBase.h; path = ../../../wrapper/juce_AudioFilterBase.h; sourceTree = SOURCE_ROOT; }; + 84E1AE57089EBAEA00E85E4F /* juce_AudioFilterEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFilterEditor.cpp; path = ../../../wrapper/juce_AudioFilterEditor.cpp; sourceTree = SOURCE_ROOT; }; + 84E1AE58089EBAEA00E85E4F /* juce_AudioFilterEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_AudioFilterEditor.h; path = ../../../wrapper/juce_AudioFilterEditor.h; sourceTree = SOURCE_ROOT; }; + 84E1AF2A089EBE4C00E85E4F /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 84E1AF2F089EBE5A00E85E4F /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + 84E1AF33089EBE6C00E85E4F /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + 84E1AF37089EBF1300E85E4F /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 84E1AF41089EBFD900E85E4F /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; + 84F5CF030B1B66B100A2E279 /* How to use this framework.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "How to use this framework.txt"; path = "../../../How to use this framework.txt"; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84E1AE45089EBA6A00E85E4F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84E1AF2B089EBE4C00E85E4F /* Carbon.framework in Frameworks */, + 84E1AF30089EBE5A00E85E4F /* QuickTime.framework in Frameworks */, + 84E1AF34089EBE6C00E85E4F /* AGL.framework in Frameworks */, + 84E1AF38089EBF1300E85E4F /* CoreAudio.framework in Frameworks */, + 8456E9D008A29AE60087C412 /* CoreServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 089C166AFE841209C02AAC07 /* JuceVST */ = { + isa = PBXGroup; + children = ( + 08FB77ADFE841716C02AAC07 /* Source */, + 84F5CF030B1B66B100A2E279 /* How to use this framework.txt */, + 089C167CFE841241C02AAC07 /* Resources */, + 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */, + 19C28FB4FE9D528D11CA2CBB /* Products */, + ); + name = JuceVST; + sourceTree = ""; + }; + 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 84E1AF2A089EBE4C00E85E4F /* Carbon.framework */, + 8456E9CF08A29AE60087C412 /* CoreServices.framework */, + 84E1AF37089EBF1300E85E4F /* CoreAudio.framework */, + 84E1AF33089EBE6C00E85E4F /* AGL.framework */, + 84E1AF2F089EBE5A00E85E4F /* QuickTime.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C167CFE841241C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 84E1AF41089EBFD900E85E4F /* Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77ADFE841716C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 84E1AE4C089EBA9300E85E4F /* filter */, + 84E1AE53089EBACA00E85E4F /* wrapper code */, + 845FAE4B0A5C09FA008C94D8 /* juce.xcconfig */, + ); + name = Source; + sourceTree = ""; + }; + 19C28FB4FE9D528D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 84E1AE47089EBA6A00E85E4F /* JuceVST.vst */, + ); + name = Products; + sourceTree = ""; + }; + 84E1AE4C089EBA9300E85E4F /* filter */ = { + isa = PBXGroup; + children = ( + 84E1AE4D089EBAAA00E85E4F /* DemoEditorComponent.cpp */, + 84E1AE4E089EBAAA00E85E4F /* DemoEditorComponent.h */, + 84E1AE4F089EBAAA00E85E4F /* DemoJuceFilter.cpp */, + 84E1AE50089EBAAA00E85E4F /* DemoJuceFilter.h */, + 84551AA009BDB8F3009C9F3E /* JucePluginCharacteristics.h */, + ); + name = filter; + sourceTree = ""; + }; + 84E1AE53089EBACA00E85E4F /* wrapper code */ = { + isa = PBXGroup; + children = ( + 84E1AE55089EBAEA00E85E4F /* juce_AudioFilterBase.cpp */, + 84E1AE56089EBAEA00E85E4F /* juce_AudioFilterBase.h */, + 84E1AE57089EBAEA00E85E4F /* juce_AudioFilterEditor.cpp */, + 84E1AE58089EBAEA00E85E4F /* juce_AudioFilterEditor.h */, + 84E1AE54089EBAD200E85E4F /* VST specific */, + ); + name = "wrapper code"; + sourceTree = ""; + }; + 84E1AE54089EBAD200E85E4F /* VST specific */ = { + isa = PBXGroup; + children = ( + 84BACBD10987847C0073300C /* juce_VstWrapper.cpp */, + ); + name = "VST specific"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 84E1AE46089EBA6A00E85E4F /* JuceVST */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84E1AE48089EBA8900E85E4F /* Build configuration list for PBXNativeTarget "JuceVST" */; + buildPhases = ( + 84E1AE43089EBA6A00E85E4F /* Resources */, + 84E1AE44089EBA6A00E85E4F /* Sources */, + 84E1AE45089EBA6A00E85E4F /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JuceVST; + productName = JuceVST; + productReference = 84E1AE47089EBA6A00E85E4F /* JuceVST.vst */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 089C1669FE841209C02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 84E1ADD2089EB1BA00E85E4F /* Build configuration list for PBXProject "JuceVST" */; + hasScannedForEncodings = 1; + mainGroup = 089C166AFE841209C02AAC07 /* JuceVST */; + projectDirPath = ""; + targets = ( + 84E1AE46089EBA6A00E85E4F /* JuceVST */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 84E1AE43089EBA6A00E85E4F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84E1AF42089EBFD900E85E4F /* Info.plist in Resources */, + 845FAE4C0A5C09FA008C94D8 /* juce.xcconfig in Resources */, + 84F5CF040B1B66B100A2E279 /* How to use this framework.txt in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 84E1AE44089EBA6A00E85E4F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84E1AE51089EBAAA00E85E4F /* DemoEditorComponent.cpp in Sources */, + 84E1AE52089EBAAA00E85E4F /* DemoJuceFilter.cpp in Sources */, + 84E1AE59089EBAEA00E85E4F /* juce_AudioFilterBase.cpp in Sources */, + 84E1AE5A089EBAEA00E85E4F /* juce_AudioFilterEditor.cpp in Sources */, + 84BACBD20987847C0073300C /* juce_VstWrapper.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 84E1ADD3089EB1BA00E85E4F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 845FAE4B0A5C09FA008C94D8 /* juce.xcconfig */; + buildSettings = { + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = DEBUG; + HEADER_SEARCH_PATHS = ( + ../../../../.., + "~/stuff/vstsdk2.4/", + ); + LIBRARY_SEARCH_PATHS = ../../../../../bin; + OTHER_LDFLAGS = "-ljucedebug"; + }; + name = Debug; + }; + 84E1ADD4089EB1BA00E85E4F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 845FAE4B0A5C09FA008C94D8 /* juce.xcconfig */; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; + HEADER_SEARCH_PATHS = ( + ../../../../.., + "~/stuff/vstsdk2.4/", + ); + LIBRARY_SEARCH_PATHS = ../../../../../bin; + OTHER_LDFLAGS = "-ljuce"; + }; + name = Release; + }; + 84E1AE49089EBA8900E85E4F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GENERATE_PKGINFO_FILE = YES; + INFOPLIST_FILE = info.plist; + PRODUCT_NAME = JuceVST; + SYMROOT = "$(HOME)/Library/Audio/Plug-Ins/VST"; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = vst; + }; + name = Debug; + }; + 84E1AE4A089EBA8900E85E4F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GENERATE_PKGINFO_FILE = YES; + INFOPLIST_FILE = info.plist; + PRODUCT_NAME = JuceVST; + SYMROOT = "$(HOME)/Library/Audio/Plug-Ins/VST"; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = vst; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84E1ADD2089EB1BA00E85E4F /* Build configuration list for PBXProject "JuceVST" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84E1ADD3089EB1BA00E85E4F /* Debug */, + 84E1ADD4089EB1BA00E85E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 84E1AE48089EBA8900E85E4F /* Build configuration list for PBXNativeTarget "JuceVST" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84E1AE49089EBA8900E85E4F /* Debug */, + 84E1AE4A089EBA8900E85E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 089C1669FE841209C02AAC07 /* Project object */; +} diff --git a/extras/audio plugins/demo/build/VST_Mac/version.plist b/extras/audio plugins/demo/build/VST_Mac/version.plist new file mode 100644 index 0000000000..169b5fae84 --- /dev/null +++ b/extras/audio plugins/demo/build/VST_Mac/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 38 + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + ProjectName + CarbonProjectTemplates + SourceVersion + 140000 + + diff --git a/extras/audio plugins/demo/build/VST_Win32/juce_vst.sln b/extras/audio plugins/demo/build/VST_Win32/juce_vst.sln new file mode 100644 index 0000000000..d87b0d4a00 --- /dev/null +++ b/extras/audio plugins/demo/build/VST_Win32/juce_vst.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JuceAudioPlugin Demo", "juce_vst.vcproj", "{6F0F1E35-EAF8-431A-83D9-F0340921E560}" + ProjectSection(ProjectDependencies) = postProject + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} = {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JUCE", "..\..\..\..\..\build\win32\vc8\JUCE.vcproj", "{AE232C11-D91C-4CA1-B24E-8B11A52EFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Release|Win32 = DLL Release|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.Debug|Win32.ActiveCfg = Debug|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.Debug|Win32.Build.0 = Debug|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.DLL Debug|Win32.Build.0 = Debug|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.DLL Release|Win32.ActiveCfg = Release|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.DLL Release|Win32.Build.0 = Release|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.Release|Win32.ActiveCfg = Release|Win32 + {6F0F1E35-EAF8-431A-83D9-F0340921E560}.Release|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extras/audio plugins/demo/build/VST_Win32/juce_vst.vcproj b/extras/audio plugins/demo/build/VST_Win32/juce_vst.vcproj new file mode 100644 index 0000000000..e4d70350dd --- /dev/null +++ b/extras/audio plugins/demo/build/VST_Win32/juce_vst.vcproj @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/audio plugins/demo/src/DemoEditorComponent.cpp b/extras/audio plugins/demo/src/DemoEditorComponent.cpp new file mode 100644 index 0000000000..3dcd9fd0b4 --- /dev/null +++ b/extras/audio plugins/demo/src/DemoEditorComponent.cpp @@ -0,0 +1,210 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "DemoEditorComponent.h" + +//============================================================================== +// quick-and-dirty function to format a timecode string +static const String timeToTimecodeString (const double seconds) +{ + const double absSecs = fabs (seconds); + const tchar* const sign = (seconds < 0) ? T("-") : T(""); + + const int hours = (int) (absSecs / (60.0 * 60.0)); + const int mins = ((int) (absSecs / 60.0)) % 60; + const int secs = ((int) absSecs) % 60; + + return String::formatted (T("%s%02d:%02d:%02d:%03d"), + sign, hours, mins, secs, + roundDoubleToInt (absSecs * 1000) % 1000); +} + +// quick-and-dirty function to format a bars/beats string +static const String ppqToBarsBeatsString (const double ppq, + const double lastBarPPQ, + const int numerator, + const int denominator) +{ + if (numerator == 0 || denominator == 0) + return T("1|1|0"); + + const int ppqPerBar = (numerator * 4 / denominator); + const double beats = (fmod (ppq, ppqPerBar) / ppqPerBar) * numerator; + + const int bar = ((int) ppq) / ppqPerBar + 1; + const int beat = ((int) beats) + 1; + const int ticks = ((int) (fmod (beats, 1.0) * 960.0)); + + String s; + s << bar << T('|') << beat << T('|') << ticks; + return s; +} + +//============================================================================== +// just a quick way of using a single static look and feel object without +// it getting leaked when the plugin is deleted.. +class AutoDeletedLookAndFeel : public ShinyLookAndFeel, + public DeletedAtShutdown +{ +public: + AutoDeletedLookAndFeel() {} +}; + +//============================================================================== +DemoEditorComponent::DemoEditorComponent (DemoJuceFilter* const ownerFilter) + : AudioFilterEditor (ownerFilter) +{ + static ShinyLookAndFeel* shinyLook = 0; + + if (shinyLook == 0) + shinyLook = new AutoDeletedLookAndFeel(); + + LookAndFeel::setDefaultLookAndFeel (shinyLook); + + // create our gain slider.. + addAndMakeVisible (gainSlider = new Slider (T("gain"))); + gainSlider->addListener (this); + gainSlider->setRange (0.0, 1.0, 0.01); + gainSlider->setTooltip (T("changes the volume of the audio that runs through the plugin..")); + + // get the gain parameter from the filter and use it to set up our slider + gainSlider->setValue (ownerFilter->getParameter (0), false); + + // create and add the midi keyboard component.. + addAndMakeVisible (midiKeyboard + = new MidiKeyboardComponent (ownerFilter->keyboardState, + MidiKeyboardComponent::horizontalKeyboard)); + + // add a label that will display the current timecode and status.. + addAndMakeVisible (infoLabel = new Label (String::empty, String::empty)); + + // add the triangular resizer component for the bottom-right of the UI + addAndMakeVisible (resizer = new ResizableCornerComponent (this, &resizeLimits)); + resizeLimits.setSizeLimits (150, 150, 800, 300); + + // set our component's initial size to be the last one that was stored in the filter's settings + setSize (ownerFilter->lastUIWidth, + ownerFilter->lastUIHeight); + + // register ourselves with the filter - it will use its ChangeBroadcaster base + // class to tell us when something has changed, and this will call our changeListenerCallback() + // method. + ownerFilter->addChangeListener (this); +} + +DemoEditorComponent::~DemoEditorComponent() +{ + getFilter()->removeChangeListener (this); + + deleteAllChildren(); +} + +//============================================================================== +void DemoEditorComponent::paint (Graphics& g) +{ + // just clear the window + g.fillAll (Colour::greyLevel (0.9f)); +} + +void DemoEditorComponent::resized() +{ + gainSlider->setBounds (10, 10, 200, 22); + infoLabel->setBounds (10, 35, 450, 20); + + const int keyboardHeight = 70; + midiKeyboard->setBounds (4, getHeight() - keyboardHeight - 4, + getWidth() - 8, keyboardHeight); + + resizer->setBounds (getWidth() - 16, getHeight() - 16, 16, 16); + + // if we've been resized, tell the filter so that it can store the new size + // in its settings + getFilter()->lastUIWidth = getWidth(); + getFilter()->lastUIHeight = getHeight(); +} + +//============================================================================== +void DemoEditorComponent::changeListenerCallback (void* source) +{ + // this is the filter telling us that it's changed, so we'll update our + // display of the time, midi message, etc. + updateParametersFromFilter(); +} + +void DemoEditorComponent::sliderValueChanged (Slider*) +{ + getFilter()->setParameterNotifyingHost (0, (float) gainSlider->getValue()); +} + +//============================================================================== +void DemoEditorComponent::updateParametersFromFilter() +{ + DemoJuceFilter* const filter = getFilter(); + + // we use this lock to make sure the processBlock() method isn't writing to the + // lastMidiMessage variable while we're trying to read it, but be extra-careful to + // only hold the lock for a minimum amount of time.. + filter->getCallbackLock().enter(); + + // take a local copy of the info we need while we've got the lock.. + const AudioFilterBase::CurrentPositionInfo positionInfo (filter->lastPosInfo); + const float newGain = filter->getParameter (0); + + // ..release the lock ASAP + filter->getCallbackLock().exit(); + + + // ..and after releasing the lock, we're free to do the time-consuming UI stuff.. + String infoText; + infoText << String (positionInfo.bpm, 2) << T(" bpm, ") + << positionInfo.timeSigNumerator << T("/") << positionInfo.timeSigDenominator + << T(" - ") << timeToTimecodeString (positionInfo.timeInSeconds) + << T(" - ") << ppqToBarsBeatsString (positionInfo.ppqPosition, + positionInfo.ppqPositionOfLastBarStart, + positionInfo.timeSigNumerator, + positionInfo.timeSigDenominator); + + if (positionInfo.isPlaying) + infoText << T(" (playing)"); + + infoLabel->setText (infoText, false); + + /* Update our slider. + + (note that it's important here to tell the slider not to send a change + message, because that would cause it to call the filter with a parameter + change message again, and the values would drift out. + */ + gainSlider->setValue (newGain, false); + + setSize (filter->lastUIWidth, + filter->lastUIHeight); +} diff --git a/extras/audio plugins/demo/src/DemoEditorComponent.h b/extras/audio plugins/demo/src/DemoEditorComponent.h new file mode 100644 index 0000000000..50ad1bda24 --- /dev/null +++ b/extras/audio plugins/demo/src/DemoEditorComponent.h @@ -0,0 +1,99 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef DEMOJUCEPLUGINEDITOR_H +#define DEMOJUCEPLUGINEDITOR_H + +#include "DemoJuceFilter.h" + + +//============================================================================== +/** + This is the Component that our filter will use as its UI. + + One or more of these is created by the DemoJuceFilter::createEditor() method, + and they will be deleted at some later time by the wrapper code. + + To demonstrate the correct way of connecting a filter to its UI, this + class is a ChangeListener, and our demo filter is a ChangeBroadcaster. The + editor component registers with the filter when it's created and deregisters + when it's destroyed. When the filter's parameters are changed, it broadcasts + a message and this editor responds by updating its display. +*/ +class DemoEditorComponent : public AudioFilterEditor, + public ChangeListener, + public SliderListener +{ +public: + /** Constructor. + + When created, this will register itself with the filter for changes. It's + safe to assume that the filter won't be deleted before this object is. + */ + DemoEditorComponent (DemoJuceFilter* const ownerFilter); + + /** Destructor. */ + ~DemoEditorComponent(); + + //============================================================================== + /** Our demo filter is a ChangeBroadcaster, and will call us back when one of + its parameters changes. + */ + void changeListenerCallback (void* source); + + void sliderValueChanged (Slider*); + + //============================================================================== + /** Standard Juce paint callback. */ + void paint (Graphics& g); + + /** Standard Juce resize callback. */ + void resized(); + + +private: + //============================================================================== + Slider* gainSlider; + MidiKeyboardComponent* midiKeyboard; + Label* infoLabel; + ResizableCornerComponent* resizer; + ComponentBoundsConstrainer resizeLimits; + TooltipWindow tooltipWindow; + + void updateParametersFromFilter(); + + // handy wrapper method to avoid having to cast the filter to a DemoJuceFilter + // every time we need it.. + DemoJuceFilter* getFilter() const throw() { return (DemoJuceFilter*) getOwnerFilter(); } +}; + + +#endif diff --git a/extras/audio plugins/demo/src/DemoJuceFilter.cpp b/extras/audio plugins/demo/src/DemoJuceFilter.cpp new file mode 100644 index 0000000000..c275a13613 --- /dev/null +++ b/extras/audio plugins/demo/src/DemoJuceFilter.cpp @@ -0,0 +1,254 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "DemoJuceFilter.h" +#include "DemoEditorComponent.h" + + +//============================================================================== +/** + This function must be implemented to create the actual plugin object that + you want to use. +*/ +AudioFilterBase* createPluginFilter() +{ + return new DemoJuceFilter(); +} + +//============================================================================== +DemoJuceFilter::DemoJuceFilter() +{ + gain = 1.0f; + lastUIWidth = 400; + lastUIHeight = 140; + + zeromem (&lastPosInfo, sizeof (lastPosInfo)); + lastPosInfo.timeSigNumerator = 4; + lastPosInfo.timeSigDenominator = 4; + lastPosInfo.bpm = 120; +} + +DemoJuceFilter::~DemoJuceFilter() +{ +} + +//============================================================================== +int DemoJuceFilter::getNumParameters() +{ + return 1; +} + +float DemoJuceFilter::getParameter (int index) +{ + return (index == 0) ? gain + : 0.0f; +} + +void DemoJuceFilter::setParameter (int index, float newValue) +{ + if (index == 0) + { + if (gain != newValue) + { + gain = newValue; + + // if this is changing the gain, broadcast a change message which + // our editor will pick up. + sendChangeMessage (this); + } + } +} + +const String DemoJuceFilter::getParameterName (int index) +{ + if (index == 0) + return T("gain"); + + return String::empty; +} + +const String DemoJuceFilter::getParameterText (int index) +{ + if (index == 0) + return String (gain, 2); + + return String::empty; +} + +//============================================================================== +void DemoJuceFilter::prepareToPlay (double sampleRate, int samplesPerBlock) +{ + // do your pre-playback setup stuff here.. + keyboardState.reset(); +} + +void DemoJuceFilter::releaseResources() +{ + // when playback stops, you can use this as an opportunity to free up any + // spare memory, etc. +} + +void DemoJuceFilter::processBlock (const AudioSampleBuffer& input, + AudioSampleBuffer& output, + const bool accumulateOutput, + MidiBuffer& midiMessages) +{ + if (accumulateOutput) + { + // if we're accumulating, we should add our results to the existing contents of the + // output buffer.. + + if (input.getNumChannels() > 0) + { + for (int channel = 0; channel < output.getNumChannels(); ++channel) + { + // for each output channel, add the contents of the corresponding + // input channel (or if there are more outputs than inputs, just + // keep using the last input channel) + output.addFrom (channel, + 0, + input, + jmin (channel, input.getNumChannels() - 1), + 0, + input.getNumSamples(), + gain); + } + } + } + else + { + // if we're not accumulating, the output buffer's contents are undefined + // (don't assume they're zero!) and we should overwrite it. + + if (input.getNumChannels() > 0) + { + for (int channel = 0; channel < output.getNumChannels(); ++channel) + { + // for each output channel, copy the contents of the corresponding + // input channel (or if there are more outputs than inputs, just + // keep using the last input channel) + output.copyFrom (channel, + 0, + input, + jmin (channel, input.getNumChannels() - 1), + 0, + input.getNumSamples()); + } + + output.applyGain (0, output.getNumSamples(), gain); + } + else + { + // when not accumulating, you always have to put something into + // the output buffer, even if in this case we have no inputs to copy. + output.clear(); + } + } + + // if any midi messages come in, use them to update the keyboard state object. This + // object sends notification to the UI component about key up/down changes + keyboardState.processNextMidiBuffer (midiMessages, + 0, output.getNumSamples(), + true); + + // have a go at getting the current time from the host, and if it's changed, tell + // our UI to update itself. + CurrentPositionInfo pos; + + if (getCurrentPositionInfo (pos)) + { + if (memcmp (&pos, &lastPosInfo, sizeof (pos)) != 0) + { + lastPosInfo = pos; + sendChangeMessage (this); + } + } + else + { + zeromem (&lastPosInfo, sizeof (lastPosInfo)); + lastPosInfo.timeSigNumerator = 4; + lastPosInfo.timeSigDenominator = 4; + lastPosInfo.bpm = 120; + } +} + +//============================================================================== +AudioFilterEditor* DemoJuceFilter::createEditor() +{ + return new DemoEditorComponent (this); +} + +//============================================================================== +void DemoJuceFilter::getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData) +{ + // you can store your parameters as binary data if you want to or if you've got + // a load of binary to put in there, but if you're not doing anything too heavy, + // XML is a much cleaner way of doing it - here's an example of how to store your + // params as XML.. + + // create an outer XML element.. + XmlElement xmlState (T("MYPLUGINSETTINGS")); + + // add some attributes to it.. + xmlState.setAttribute (T("pluginVersion"), 1); + xmlState.setAttribute (T("gainLevel"), gain); + xmlState.setAttribute (T("uiWidth"), lastUIWidth); + xmlState.setAttribute (T("uiHeight"), lastUIHeight); + + // you could also add as many child elements as you need to here.. + + + // then use this helper function to stuff it into the binary blob and return it.. + copyXmlToBinary (xmlState, destData); +} + +void DemoJuceFilter::setStateInformation (const void* data, int sizeInBytes) +{ + // use this helper function to get the XML from this binary blob.. + XmlElement* const xmlState = getXmlFromBinary (data, sizeInBytes); + + if (xmlState != 0) + { + // check that it's the right type of xml.. + if (xmlState->hasTagName (T("MYPLUGINSETTINGS"))) + { + // ok, now pull out our parameters.. + gain = (float) xmlState->getDoubleAttribute (T("gainLevel"), gain); + + lastUIWidth = xmlState->getIntAttribute (T("uiWidth"), lastUIWidth); + lastUIHeight = xmlState->getIntAttribute (T("uiHeight"), lastUIHeight); + + sendChangeMessage (this); + } + + delete xmlState; + } +} diff --git a/extras/audio plugins/demo/src/DemoJuceFilter.h b/extras/audio plugins/demo/src/DemoJuceFilter.h new file mode 100644 index 0000000000..842f05ff41 --- /dev/null +++ b/extras/audio plugins/demo/src/DemoJuceFilter.h @@ -0,0 +1,111 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef DEMOJUCEPLUGINFILTER_H +#define DEMOJUCEPLUGINFILTER_H + +#include "../../wrapper/juce_AudioFilterBase.h" + + +//============================================================================== +/** + A simple plugin filter that just applies a gain change to the audio + passing through it. + +*/ +class DemoJuceFilter : public AudioFilterBase, + public ChangeBroadcaster +{ +public: + //============================================================================== + DemoJuceFilter(); + ~DemoJuceFilter(); + + //============================================================================== + void JUCE_CALLTYPE prepareToPlay (double sampleRate, int samplesPerBlock); + void JUCE_CALLTYPE releaseResources(); + + void JUCE_CALLTYPE processBlock (const AudioSampleBuffer& input, + AudioSampleBuffer& output, + const bool accumulateOutput, + MidiBuffer& midiMessages); + + //============================================================================== + AudioFilterEditor* JUCE_CALLTYPE createEditor(); + + //============================================================================== + int JUCE_CALLTYPE getNumParameters(); + + float JUCE_CALLTYPE getParameter (int index); + void JUCE_CALLTYPE setParameter (int index, float newValue); + + const String JUCE_CALLTYPE getParameterName (int index); + const String JUCE_CALLTYPE getParameterText (int index); + + //============================================================================== + int JUCE_CALLTYPE getNumPrograms() { return 0; } + int JUCE_CALLTYPE getCurrentProgram() { return 0; } + void JUCE_CALLTYPE setCurrentProgram (int index) { } + const String JUCE_CALLTYPE getProgramName (int index) { return String::empty; } + void JUCE_CALLTYPE changeProgramName (int index, const String& newName) { } + + //============================================================================== + void JUCE_CALLTYPE getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData); + void JUCE_CALLTYPE setStateInformation (const void* data, int sizeInBytes); + + //============================================================================== + // These properties are public so that our editor component can access them + // - a bit of a hacky way to do it, but it's only a demo! + + // this is kept up to date with the midi messages that arrive, and the UI component + // registers with it so it can represent the incoming messages + MidiKeyboardState keyboardState; + + // this keeps a copy of the last set of time info that was acquired during an audio + // callback - the UI component will read this and display it. + AudioFilterBase::CurrentPositionInfo lastPosInfo; + + // these are used to persist the UI's size - the values are stored along with the + // filter's other parameters, and the UI component will update them when it gets + // resized. + int lastUIWidth, lastUIHeight; + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + // this is our gain - the UI and the host can access this by getting/setting + // parameter 0. + float gain; +}; + + +#endif diff --git a/extras/audio plugins/demo/src/JucePluginCharacteristics.h b/extras/audio plugins/demo/src/JucePluginCharacteristics.h new file mode 100644 index 0000000000..b11fa299f4 --- /dev/null +++ b/extras/audio plugins/demo/src/JucePluginCharacteristics.h @@ -0,0 +1,274 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_PLUGIN_CHARACTERISTICS_H__ +#define __JUCE_PLUGIN_CHARACTERISTICS_H__ + + +//============================================================================== +/* All of the following settings need to be defined for your plugin. + + Go through each of these definitions and check that it's correctly + set-up before trying to do a build. +*/ + +//============================================================================== +/* Generic settings */ + +/** The name of your plugin. (Try to keep this as short as possible) +*/ +#define JucePlugin_Name "Juce Demo Plugin" + +/** A longer decription of your plugin. +*/ +#define JucePlugin_Desc "A Demo Plugin demonstrating Juce" + +/** The name of your company. (Try to keep this as short as possible) +*/ +#define JucePlugin_Manufacturer "Raw Material Software" + +/** A four-character code for your company. + Use single quotes - this isn't a string! +*/ +#define JucePlugin_ManufacturerCode 'RawM' + +/** A unique four-character code for your plugin. + Use single quotes - this isn't a string! + + Note that for AU compatibility, this must contain at least one + upper-case letter. +*/ +#define JucePlugin_PluginCode 'JcDm' + +//============================================================================== +/** The maximum number of channels of audio input that the plugin can handle. + + The actual number of channels supplied may be less than this, depending on the host. + For VSTs, you specify a maximum number of channels, for AUs and RTAS a set + of channel configurations is specified in JucePlugin_PreferredChannelConfigurations + and the host will choose one of these, but you should still set the max number of + channels correctly. + + As soon as a plugin's prepareToPlay() method is called, you can find out the actual + number of channels that will be used with the AudioFilterBase::getNumInputChannels() + method. +*/ +#define JucePlugin_MaxNumInputChannels 2 + +/** The maximum number of channels of audio output that the plugin can handle. + + The actual number of channels supplied may be less than this, depending on the host. + For VSTs, you specify a maximum number of channels, for AUs and RTAS a set + of channel configurations is specified in JucePlugin_PreferredChannelConfigurations + and the host will choose one of these, but you should still set the max number of + channels correctly. + + As soon as a plugin's prepareToPlay() method is called, you can find out the actual + number of channels that will be used with the AudioFilterBase::getNumOutputChannels() + method. +*/ +#define JucePlugin_MaxNumOutputChannels 2 + +/** This allows the plugin to specify the configurations of input/output channels that + they can support. + + AU and RTAS hosts will use this information, although VSTs only have a concept of + a maximum number of channels. + + The list is a set of pairs of values in the form { numInputs, numOutputs }, and each + pair indicates a valid configuration that the plugin can handle. + + So for example, {1, 1}, {2, 2} means that the plugin can be used in just two + configurations: either with 1 input and 1 output, or with 2 inputs and 2 outputs. If + you used this in Pro-Tools, the plugin could be placed on a mono or stereo track. + If the list was just {1, 1}, then Pro-Tools would only allow it to be used as a mono + plugin. + + As soon as a plugin's prepareToPlay() method is called, you can find out the actual + number of channels that the host has connected to the plugin by using the + AudioFilterBase::getNumOutputChannels() and AudioFilterBase::getNumInputChannels() + methods. +*/ +#define JucePlugin_PreferredChannelConfigurations { 1, 1 }, { 2, 2 } + +//============================================================================== +/** The plugin's internal latency, as a number of samples. +*/ +#define JucePlugin_Latency 0 + +/** Set this value to 1 if your plugin is a synth, or 0 if it isn't. +*/ +#define JucePlugin_IsSynth 1 + +/** Set this to 1 if your plugin needs to receive midi messages, or 0 if + it doesn't. +*/ +#define JucePlugin_WantsMidiInput 1 + +/** Set this to 1 if your plugin wants to output midi messages, or 0 if + it doesn't. +*/ +#define JucePlugin_ProducesMidiOutput 1 + +/** If this is 1, it means that when the plugins input buffers are + silent, it's output will be too. + + Some hosts may use this to avoid calling the plugin when no audio + would be produced. +*/ +#define JucePlugin_SilenceInProducesSilenceOut 0 + +/** If set to 1, this hints that the host should ignore any keys that are pressed + when the plugin has keyboard focus. If 0, then the host should still execute + any shortcut keys that are pressed, even if the plugin does have focus. + + Various hosts/platforms may deal with this differently, or ignore it. +*/ +#define JucePlugin_EditorRequiresKeyboardFocus 1 + + +//============================================================================== +/** A version number +*/ +#define JucePlugin_VersionCode 0x00010100 + +#define JucePlugin_VersionString "1.1" + + +//============================================================================== +/* VST settings */ + +/** For VSTs, if you're compiling against the V2.3 SDK, set this to zero. If + you're using V2.4 or later, make sure it's set to 1. +*/ +#define JUCE_USE_VSTSDK_2_4 1 + +/** Defines a UID for your VST plugin. + The default setting here is probably fine, unless you specifically need + a custom value. It's passed to the setUniqueID() method of the plugin class. +*/ +#define JucePlugin_VSTUniqueID JucePlugin_PluginCode + +/** Defines the type of plugin. For most pursposes, you don't need to change this + setting. +*/ +#if JucePlugin_IsSynth + #define JucePlugin_VSTCategory kPlugCategSynth +#else + #define JucePlugin_VSTCategory kPlugCategEffect +#endif + +//============================================================================== +/* AudioUnit settings */ + +/** Defines the major type of plugin - see AUComponent.h for the available options. + If it's an effect, you should use kAudioUnitType_Effect. For a synth, you'll + need to use kAudioUnitType_MusicEffect or kAudioUnitType_MusicDevice. +*/ +#if JucePlugin_IsSynth + #define JucePlugin_AUMainType kAudioUnitType_MusicEffect +#else + #define JucePlugin_AUMainType kAudioUnitType_Effect +#endif + +/** A 4-character plugin ID code that should be unique. + + You can leave this using the generic value JucePlugin_PluginCode, or + override it if necessary. + + Note that for AU, this must contain at least one upper-case letter. +*/ +#define JucePlugin_AUSubType JucePlugin_PluginCode + +/** A prefix for the names of exported entry-point functions that the component exposes. + + It's very important that your plugin's .exp file contains two entries that correspond to + this name. So for example if you set the prefix to "abc" then your exports + file must contain: + + _abcEntry + _abcViewEntry +*/ +#define JucePlugin_AUExportPrefix JuceDemoAU + +/** This is the same as JucePlugin_AUExportPrefix, but in quotes + (needed for the resource compiler...) +*/ +#define JucePlugin_AUExportPrefixQuoted "JuceDemoAU" + +/** A 4-character manufacturer code - this is your company name. + You can leave this using the generic value JucePlugin_ManufacturerCode, or + override it if necessary. +*/ +#define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode + +/** If you define this value to be the same as the CFBundleIdentifier in your + plugin's plist, it allows the plugin to work out its own path, which is + needed if you want to use File::getSpecialLocation (currentExecutableFile) +*/ +#define JucePlugin_CFBundleIdentifier "com.rawmaterialsoftware.JuceDemo" + +//============================================================================== +/* RTAS settings */ + +/** How to categorise this plugin. + + For a synth you probably want to set this to ePlugInCategory_SWGenerators. + For an effect, you could choose one of: + ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, + ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, + ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, + ePlugInCategory_Dither, ePlugInCategory_SoundField + + (All values are listed in FicPluginEnums.h) +*/ +#if JucePlugin_IsSynth + #define JucePlugin_RTASCategory ePlugInCategory_SWGenerators +#else + #define JucePlugin_RTASCategory ePlugInCategory_None +#endif + +/** A 4-character manufacturer code - this is your company name. + You can leave this using the generic value JucePlugin_ManufacturerCode, or + override it if necessary. +*/ +#define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode + +/** A 4-character plugin ID code that should be unique. + You can leave this using the generic value JucePlugin_PluginCode, or + override it if necessary. +*/ +#define JucePlugin_RTASProductId JucePlugin_PluginCode + + +//============================================================================== + +#endif diff --git a/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.cpp b/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.cpp new file mode 100644 index 0000000000..00bc8dd090 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.cpp @@ -0,0 +1,827 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include +#include "AUMIDIEffectBase.h" +#include "AUCarbonViewBase.h" +#include "../../juce_AudioFilterBase.h" +#include "../../juce_IncludeCharacteristics.h" + + +//============================================================================== +#define juceFilterObjectPropertyID 0x1a45ffe9 +static VoidArray activePlugins; + +static const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; +static const int numChannelConfigs = numElementsInArray (channelConfigs); + +BEGIN_JUCE_NAMESPACE +extern void juce_setCurrentExecutableFileNameFromBundleId (const String& bundleId); +END_JUCE_NAMESPACE + + +//============================================================================== +class JuceAU : public AUMIDIEffectBase, + public AudioFilterBase::FilterNativeCallbacks +{ +public: + //============================================================================== + JuceAU (AudioUnit component) + : AUMIDIEffectBase (component), + juceFilter (0), + bufferSpace (2, 16), + prepared (false) + { + CreateElements(); + + if (activePlugins.size() == 0) + { + initialiseJuce_GUI(); + +#ifdef JucePlugin_CFBundleIdentifier + juce_setCurrentExecutableFileNameFromBundleId (JucePlugin_CFBundleIdentifier); +#endif + + MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (0); + } + + juceFilter = createPluginFilter(); + juceFilter->initialiseInternal (this); + + jassert (juceFilter != 0); + Globals()->UseIndexedParameters (juceFilter->getNumParameters()); + + activePlugins.add (this); + } + + ~JuceAU() + { + delete juceFilter; + juceFilter = 0; + + jassert (activePlugins.contains (this)); + activePlugins.removeValue (this); + + if (activePlugins.size() == 0) + shutdownJuce_GUI(); + } + + //============================================================================== + ComponentResult GetPropertyInfo (AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement, + UInt32& outDataSize, + Boolean& outWritable) + { + if (inScope == kAudioUnitScope_Global) + { + if (inID == juceFilterObjectPropertyID) + { + outWritable = false; + outDataSize = sizeof (void*); + return noErr; + } + } + + return AUMIDIEffectBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable); + } + + ComponentResult GetProperty (AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement, + void* outData) + { + if (inScope == kAudioUnitScope_Global) + { + if (inID == juceFilterObjectPropertyID) + { + *((void**) outData) = (void*) juceFilter; + return noErr; + } + } + + return AUMIDIEffectBase::GetProperty (inID, inScope, inElement, outData); + } + + ComponentResult SaveState (CFPropertyListRef* outData) + { + ComponentResult err = AUMIDIEffectBase::SaveState (outData); + + if (err != noErr) + return err; + + jassert (CFGetTypeID (*outData) == CFDictionaryGetTypeID()); + + CFMutableDictionaryRef dict = (CFMutableDictionaryRef) *outData; + + if (juceFilter != 0) + { + JUCE_NAMESPACE::MemoryBlock state; + juceFilter->getStateInformation (state); + + if (state.getSize() > 0) + { + CFDataRef ourState = CFDataCreate (kCFAllocatorDefault, (const uint8*) state, state.getSize()); + CFDictionarySetValue (dict, CFSTR("jucePluginState"), ourState); + CFRelease (ourState); + } + } + + return noErr; + } + + ComponentResult RestoreState (CFPropertyListRef inData) + { + ComponentResult err = AUMIDIEffectBase::RestoreState (inData); + + if (err != noErr) + return err; + + if (juceFilter != 0) + { + CFDictionaryRef dict = (CFDictionaryRef) inData; + CFDataRef data = 0; + + if (CFDictionaryGetValueIfPresent (dict, CFSTR("jucePluginState"), + (const void**) &data)) + { + if (data != 0) + { + const int numBytes = (int) CFDataGetLength (data); + const uint8* const rawBytes = CFDataGetBytePtr (data); + + if (numBytes > 0) + juceFilter->setStateInformation (rawBytes, numBytes); + } + } + } + + return noErr; + } + + UInt32 SupportedNumChannels (const AUChannelInfo** outInfo) + { + if (juceFilter == 0) + return 0; + + // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations + // value in your JucePluginCharacteristics.h file.. + jassert (numChannelConfigs > 0); + + if (outInfo != 0) + { + for (int i = 0; i < numChannelConfigs; ++i) + { + channelInfo[i].inChannels = channelConfigs[i][0]; + channelInfo[i].outChannels = channelConfigs[i][1]; + + outInfo[i] = channelInfo + i; + } + } + + return numChannelConfigs; + } + + //============================================================================== + ComponentResult GetParameterInfo (AudioUnitScope inScope, + AudioUnitParameterID inParameterID, + AudioUnitParameterInfo& outParameterInfo) + { + if (inScope == kAudioUnitScope_Global && juceFilter != 0) + { + outParameterInfo.flags = kAudioUnitParameterFlag_IsWritable + | kAudioUnitParameterFlag_IsReadable + | kAudioUnitParameterFlag_HasCFNameString; + + outParameterInfo.name[0] = 0; + outParameterInfo.cfNameString = PlatformUtilities::juceStringToCFString (juceFilter->getParameterName ((int) inParameterID)); + outParameterInfo.minValue = 0.0f; + outParameterInfo.maxValue = 1.0f; + outParameterInfo.defaultValue = 0.0f; + outParameterInfo.unit = kAudioUnitParameterUnit_Generic; + + return noErr; + } + else + { + return kAudioUnitErr_InvalidParameter; + } + } + + ComponentResult GetParameter (AudioUnitParameterID inID, + AudioUnitScope inScope, + AudioUnitElement inElement, + Float32& outValue) + { + if (inScope == kAudioUnitScope_Global && juceFilter != 0) + { + outValue = juceFilter->getParameter ((int) inID); + return noErr; + } + + return AUBase::GetParameter (inID, inScope, inElement, outValue); + } + + ComponentResult SetParameter (AudioUnitParameterID inID, + AudioUnitScope inScope, + AudioUnitElement inElement, + Float32 inValue, + UInt32 inBufferOffsetInFrames) + { + if (inScope == kAudioUnitScope_Global && juceFilter != 0) + { + juceFilter->setParameter ((int) inID, inValue); + return noErr; + } + + return AUBase::SetParameter (inID, inScope, inElement, inValue, inBufferOffsetInFrames); + } + + //============================================================================== + ComponentResult Version() { return JucePlugin_VersionCode; } + + bool SupportsTail() { return true; } + Float64 GetTailTime() { return 0; } + + Float64 GetLatency() + { + jassert (GetSampleRate() > 0); + + if (GetSampleRate() <= 0) + return 0.0; + + return (JucePlugin_Latency) / GetSampleRate(); + } + + //============================================================================== + int GetNumCustomUIComponents() { return 1; } + + void GetUIComponentDescs (ComponentDescription* inDescArray) + { + inDescArray[0].componentType = kAudioUnitCarbonViewComponentType; + inDescArray[0].componentSubType = JucePlugin_AUSubType; + inDescArray[0].componentManufacturer = JucePlugin_AUManufacturerCode; + inDescArray[0].componentFlags = 0; + inDescArray[0].componentFlagsMask = 0; + } + + //============================================================================== + bool getCurrentPositionInfo (AudioFilterBase::CurrentPositionInfo& info) + { + info.timeSigNumerator = 0; + info.timeSigDenominator = 0; + info.timeInSeconds = 0; + info.editOriginTime = 0; + info.ppqPositionOfLastBarStart = 0; + info.isPlaying = false; + info.isRecording = false; + + switch (lastSMPTETime.mType) + { + case kSMPTETimeType24: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps24; + break; + + case kSMPTETimeType25: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps25; + break; + + case kSMPTETimeType30Drop: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps30drop; + break; + + case kSMPTETimeType30: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps30; + break; + + case kSMPTETimeType2997: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps2997; + break; + + case kSMPTETimeType2997Drop: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps2997drop; + break; + + //case kSMPTETimeType60: + //case kSMPTETimeType5994: + default: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fpsUnknown; + break; + } + + if (CallHostBeatAndTempo (&info.ppqPosition, &info.bpm) != noErr) + { + info.ppqPosition = 0; + info.bpm = 0; + } + + UInt32 outDeltaSampleOffsetToNextBeat; + double outCurrentMeasureDownBeat; + float num; + UInt32 den; + + if (CallHostMusicalTimeLocation (&outDeltaSampleOffsetToNextBeat, &num, &den, + &outCurrentMeasureDownBeat) == noErr) + { + info.timeSigNumerator = (int) num; + info.timeSigDenominator = den; + info.ppqPositionOfLastBarStart = outCurrentMeasureDownBeat; + } + + double outCurrentSampleInTimeLine, outCycleStartBeat, outCycleEndBeat; + Boolean playing, playchanged, looping; + + if (CallHostTransportState (&playing, + &playchanged, + &outCurrentSampleInTimeLine, + &looping, + &outCycleStartBeat, + &outCycleEndBeat) == noErr) + { + info.isPlaying = playing; + info.timeInSeconds = outCurrentSampleInTimeLine / GetSampleRate(); + } + + return true; + } + + void informHostOfParameterChange (int index, float newValue) + { + if (juceFilter != 0) + { + juceFilter->setParameter (index, newValue); + + if (AUEventListenerNotify != 0) + { + AudioUnitEvent e; + e.mEventType = kAudioUnitEvent_ParameterValueChange; + e.mArgument.mParameter.mAudioUnit = GetComponentInstance(); + e.mArgument.mParameter.mParameterID = (AudioUnitParameterID) index; + e.mArgument.mParameter.mScope = kAudioUnitScope_Global; + e.mArgument.mParameter.mElement = 0; + AUEventListenerNotify (0, 0, &e); + } + } + } + + //============================================================================== + ComponentResult Initialize() + { + AUMIDIEffectBase::Initialize(); + prepareToPlay(); + return noErr; + } + + void Cleanup() + { + AUMIDIEffectBase::Cleanup(); + + if (juceFilter != 0) + juceFilter->releaseResources(); + + bufferSpace.setSize (2, 16); + midiEvents.clear(); + prepared = false; + } + + ComponentResult Reset (AudioUnitScope inScope, AudioUnitElement inElement) + { + if (! prepared) + prepareToPlay(); + + return AUMIDIEffectBase::Reset (inScope, inElement); + } + + void prepareToPlay() + { + if (juceFilter != 0) + { + juceFilter->numInputChannels = GetInput(0)->GetStreamFormat().mChannelsPerFrame; + juceFilter->numOutputChannels = GetOutput(0)->GetStreamFormat().mChannelsPerFrame; + + bufferSpace.setSize (juceFilter->numInputChannels + juceFilter->numOutputChannels, + GetMaxFramesPerSlice() + 32); + + juceFilter->prepareToPlay (GetSampleRate(), + GetMaxFramesPerSlice()); + + midiEvents.clear(); + + prepared = true; + } + } + + ComponentResult Render (AudioUnitRenderActionFlags &ioActionFlags, + const AudioTimeStamp& inTimeStamp, + UInt32 nFrames) + { + lastSMPTETime = inTimeStamp.mSMPTETime; + + return AUMIDIEffectBase::Render (ioActionFlags, inTimeStamp, nFrames); + } + + + OSStatus ProcessBufferLists (AudioUnitRenderActionFlags& ioActionFlags, + const AudioBufferList& inBuffer, + AudioBufferList& outBuffer, + UInt32 inFramesToProcess) + { + if (juceFilter != 0) + { + jassert (prepared); + + float* inChans [64]; + int numInChans = 0; + float* outChans [64]; + int numOutChans = 0; + int nextSpareBufferChan = 0; + bool needToReinterleave = false; + + unsigned int i; + for (i = 0; i < inBuffer.mNumberBuffers; ++i) + { + const AudioBuffer& buf = inBuffer.mBuffers[i]; + + if (buf.mNumberChannels == 1) + { + inChans [numInChans++] = (float*) buf.mData; + } + else + { + // need to de-interleave.. + for (unsigned int subChan = 0; subChan < buf.mNumberChannels; ++subChan) + { + float* dest = bufferSpace.getSampleData (nextSpareBufferChan++); + inChans [numInChans++] = dest; + + const float* src = ((const float*) buf.mData) + subChan; + + for (int j = inFramesToProcess; --j >= 0;) + { + *dest++ = *src; + src += buf.mNumberChannels; + } + } + } + + if (numInChans >= juceFilter->numInputChannels) + break; + } + + const int firstBufferedOutChan = nextSpareBufferChan; + + for (i = 0; i < outBuffer.mNumberBuffers; ++i) + { + AudioBuffer& buf = outBuffer.mBuffers[i]; + + if (buf.mNumberChannels == 1) + { + outChans [numOutChans++] = (float*) buf.mData; + } + else + { + needToReinterleave = true; + + for (unsigned int subChan = 0; subChan < buf.mNumberChannels; ++subChan) + { + float* dest = bufferSpace.getSampleData (nextSpareBufferChan++); + outChans [numOutChans++] = dest; + } + } + + if (numOutChans >= juceFilter->numOutputChannels) + break; + } + + const bool accumulate = false; + + { + const AudioSampleBuffer input (inChans, numInChans, inFramesToProcess); + AudioSampleBuffer output (outChans, numOutChans, inFramesToProcess); + + const ScopedLock sl (juceFilter->getCallbackLock()); + + if (juceFilter->suspended) + output.clear(); + else + juceFilter->processBlock (input, output, accumulate, midiEvents); + } + + if (! midiEvents.isEmpty()) + { +#if JucePlugin_ProducesMidiOutput + const uint8* midiEventData; + int midiEventSize, midiEventPosition; + MidiBuffer::Iterator i (midiEvents); + + while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) + { + jassert (midiEventPosition >= 0 && midiEventPosition < (int) inFramesToProcess); + + + + //xxx + } +#else + // if your plugin creates midi messages, you'll need to set + // the JucePlugin_ProducesMidiOutput macro to 1 in your + // JucePluginCharacteristics.h file + //jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); +#endif + midiEvents.clear(); + } + + if (needToReinterleave) + { + nextSpareBufferChan = firstBufferedOutChan; + + for (i = 0; i < outBuffer.mNumberBuffers; ++i) + { + AudioBuffer& buf = outBuffer.mBuffers[i]; + + if (buf.mNumberChannels > 1) + { + for (unsigned int subChan = 0; subChan < buf.mNumberChannels; ++subChan) + { + const float* src = bufferSpace.getSampleData (nextSpareBufferChan++); + float* dest = ((float*) buf.mData) + subChan; + + for (int j = inFramesToProcess; --j >= 0;) + { + *dest = *src++; + dest += buf.mNumberChannels; + } + } + } + } + } + +#if ! JucePlugin_SilenceInProducesSilenceOut + ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence; +#endif + } + + return noErr; + } + +protected: + OSStatus HandleMidiEvent (UInt8 nStatus, + UInt8 inChannel, + UInt8 inData1, + UInt8 inData2, + long inStartFrame) + { +#if JucePlugin_WantsMidiInput + uint8 data [4]; + data[0] = nStatus | inChannel; + data[1] = inData1; + data[2] = inData2; + + midiEvents.addEvent (data, 3, inStartFrame); +#endif + + return noErr; + } + + //============================================================================== +private: + AudioFilterBase* juceFilter; + AudioSampleBuffer bufferSpace; + MidiBuffer midiEvents; + bool prepared; + SMPTETime lastSMPTETime; + AUChannelInfo channelInfo [numChannelConfigs]; +}; + + +//============================================================================== +class JuceAUComponentHolder : public Component +{ +public: + JuceAUComponentHolder (Component* const editorComp) + { + addAndMakeVisible (editorComp); + setOpaque (true); + setVisible (true); + setBroughtToFrontOnMouseClick (true); + +#if ! JucePlugin_EditorRequiresKeyboardFocus + setWantsKeyboardFocus (false); +#endif + } + + ~JuceAUComponentHolder() + { + } + + void resized() + { + if (getNumChildComponents() > 0) + getChildComponent (0)->setBounds (0, 0, getWidth(), getHeight()); + } + + void paint (Graphics& g) + { + } +}; + +//============================================================================== +class JuceAUView : public AUCarbonViewBase, + public ComponentListener, + public MouseListener, + public Timer +{ + AudioFilterBase* juceFilter; + AudioFilterEditor* editorComp; + Component* windowComp; + bool recursive; + int mx, my; + +public: + JuceAUView (AudioUnitCarbonView auview) + : AUCarbonViewBase (auview), + juceFilter (0), + editorComp (0), + windowComp (0), + recursive (false), + mx (0), + my (0) + { + } + + ~JuceAUView() + { + deleteUI(); + } + + ComponentResult CreateUI (Float32 inXOffset, Float32 inYOffset) + { + if (juceFilter == 0) + { + UInt32 propertySize = sizeof (&juceFilter); + + AudioUnitGetProperty (GetEditAudioUnit(), + juceFilterObjectPropertyID, + kAudioUnitScope_Global, + 0, + &juceFilter, + &propertySize); + } + + if (juceFilter != 0) + { + deleteUI(); + + editorComp = juceFilter->createEditorIfNeeded(); + + const int w = editorComp->getWidth(); + const int h = editorComp->getHeight(); + + editorComp->setOpaque (true); + editorComp->setVisible (true); + + windowComp = new JuceAUComponentHolder (editorComp); + windowComp->setBounds ((int) inXOffset, (int) inYOffset, w, h); + + windowComp->addToDesktop (0, (void*) mCarbonPane); + SizeControl (mCarbonPane, w, h); + + editorComp->addComponentListener (this); + windowComp->addMouseListener (this, true); + + startTimer (20); + } + else + { + jassertfalse // can't get a pointer to our effect + } + + return noErr; + } + + void componentMovedOrResized (Component& component, + bool wasMoved, + bool wasResized) + { + if (! recursive) + { + recursive = true; + + if (editorComp != 0 && wasResized) + { + const int w = jmax (32, editorComp->getWidth()); + const int h = jmax (32, editorComp->getHeight()); + + SizeControl (mCarbonPane, w, h); + + if (windowComp->getWidth() != w + || windowComp->getHeight() != h) + { + windowComp->setSize (w, h); + } + + editorComp->repaint(); + } + + recursive = false; + } + } + + void timerCallback() + { + // for some stupid Apple-related reason, mouse move events just don't seem to get sent + // to the windows in an AU, so we have to bodge it here and simulate them with a + // timer.. + if (false && editorComp != 0) + { + int x, y; + Desktop::getInstance().getMousePosition (x, y); + + if (x != mx || y != my) + { + mx = x; + my = y; + + if (! ModifierKeys::getCurrentModifiers().isAnyMouseButtonDown()) + { + for (int i = ComponentPeer::getNumPeers(); --i >= 0;) + { + ComponentPeer* const peer = ComponentPeer::getPeer (i); + + const int rx = x - peer->getComponent()->getX(); + const int ry = y - peer->getComponent()->getY(); + + if (peer->contains (rx, ry, false) && peer->getComponent()->isShowing()) + { + peer->handleMouseMove (rx, ry, Time::currentTimeMillis()); + break; + } + } + } + } + } + } + + void mouseMove (const MouseEvent& e) + { + Desktop::getInstance().getMousePosition (mx, my); + startTimer (20); + } + +private: + void deleteUI() + { + PopupMenu::dismissAllActiveMenus(); + + // there's some kind of component currently modal, but the host + // is trying to delete our plugin.. + jassert (Component::getCurrentlyModalComponent() == 0); + + if (editorComp != 0) + juceFilter->editorBeingDeleted (editorComp); + + deleteAndZero (editorComp); + deleteAndZero (windowComp); + } +}; + +//============================================================================== +#define JUCE_COMPONENT_ENTRYX(Class, Name, Suffix) \ +extern "C" __attribute__((visibility("default"))) ComponentResult Name ## Suffix (ComponentParameters* params, Class* obj); \ +extern "C" __attribute__((visibility("default"))) ComponentResult Name ## Suffix (ComponentParameters* params, Class* obj) \ +{ \ + return ComponentEntryPoint::Dispatch(params, obj); \ +} + +#define JUCE_COMPONENT_ENTRY(Class, Name, Suffix) JUCE_COMPONENT_ENTRYX(Class, Name, Suffix) + +JUCE_COMPONENT_ENTRY (JuceAU, JucePlugin_AUExportPrefix, Entry) +JUCE_COMPONENT_ENTRY (JuceAUView, JucePlugin_AUExportPrefix, ViewEntry) diff --git a/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r b/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r new file mode 100644 index 0000000000..5d32214260 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r @@ -0,0 +1,70 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include +#include + +//============================================================================== +/* The JucePluginCharacteristics.h file is supposed to live in your plugin-specific + project directory, and has to contain info describing its name, type, etc. For + more info, see the JucePluginCharacteristics.h that is included in the demo plugin. + + You may need to adjust the include path of your project to make sure it can be + found by this include statement. (Don't hack this file to change the include path) +*/ +#include "JucePluginCharacteristics.h" + + +//============================================================================== +// component resources for Audio Unit +#define RES_ID 1000 +#define COMP_TYPE JucePlugin_AUMainType +#define COMP_SUBTYPE JucePlugin_AUSubType +#define COMP_MANUF JucePlugin_AUManufacturerCode +#define VERSION JucePlugin_VersionCode +#define NAME JucePlugin_Manufacturer ": " JucePlugin_Name +#define DESCRIPTION JucePlugin_Desc +#define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" + +#include "/Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r" + +//============================================================================== +// component resources for Audio Unit Carbon View +#define RES_ID 2000 +#define COMP_TYPE kAudioUnitCarbonViewComponentType +#define COMP_SUBTYPE JucePlugin_AUSubType +#define COMP_MANUF JucePlugin_AUManufacturerCode +#define VERSION JucePlugin_VersionCode +#define NAME JucePlugin_Manufacturer ": " JucePlugin_Name " View" +#define DESCRIPTION NAME +#define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "ViewEntry" + +#include "/Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r" diff --git a/extras/audio plugins/wrapper/formats/RTAS/DefaultResourceFile b/extras/audio plugins/wrapper/formats/RTAS/DefaultResourceFile new file mode 100644 index 0000000000000000000000000000000000000000..d8bfb4a1c8594d8faf551d09f1b3c7a07f875fce GIT binary patch literal 3198 zcmd^BO>7%Q6ngjND65S;QOf{;QW6h$pb6cQS#C@9$Lbdh6Qc7Dhy zD;gxYRN|UTZwNSY$_eNd#SN#3i(|L+=-8I3G+le`;k}t1k9V7-;=qY#@4olG_dm0< zHh=*D&kX^b#>>F#e@9nNy}&vFI^XOc=pXp%^~m5mE$J2Z)4<^1Td!VoP@sP$?1E19661?$Idb2lD*`S_G=+Ndr3JcbIB2Q z4=%OYm1nyh>quB})c%#-OVAeXk3VD(Uw+4PP|XGFx8X_*#4EVP19rJEEo)%Dr}if& zJ90i{P#o*{>MLCFfL+5{67hOFz0Nh@v+KE(gTKDEwG@6a$$Zhf(9)u$a z?PP0JbX>nH+7YR>$mMlKP$Nqd51q#9ytco;@7Czc-Flm*m z;I)H;1Gh$B-aHV!VMCNd5>@jETxG^8n*99(oCpHB(3X#OLwO%nLObzze1R|_NIgzE z;_-!w@RvG)Qs2Pfdxw4NcyLvN(RB8CPpi+e{ir)2Lw2Newe132D&s`{RzDLx6?qWGy zEOv7)3bUb#SDIh`G z1t4yoKOJ1*bV$5DLMR>X@5`rBiNa6hbL#p`kW|;tx|ph2mxqqm-MR}do+9Zl+&FM? ztkkNYie!6F{oS10xtqS3Am#|l9pWfr#Ha5?#_ujl?8@6%t&U)|WIosg82)wrT&H0*YImm^bpQm@( z+0n62r;r<$CqKL_O4_3zj9rit;UslTjeNW!Ajn7rt{D@MFupr^V*H9Q^uPreH*S49 zId#LzvSl-qwNgozinG}WLm-t*tg_{~gcW07n2Rf>nPjsAY%UpNvzPkWM8cfQnrtZ@ zn_D#5YHBINqN((%499<8&A%li7sobxyAe8Tya*v04&^Vsby~KfiMLVz8u=T@Z&}eS z=^MyN{{cCz=P&P%ja)_ktGD8Rcq_g$GCD>0{o$*Vv=ilMJTs5H2Dp<91wl5a$8KE9 z#wS`nbxq41*R}lY=WX)eTJC&F$l})dQ5#NuK+g=->J&M9W+04mPWa%90p&v1#R=#h cUrCx7mNB!qSy8iVIGtuw)`A&h<4cSG0Paa_uK)l5 literal 0 HcmV?d00001 diff --git a/extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r b/extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r new file mode 100644 index 0000000000..b607d8d1be --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r @@ -0,0 +1,4 @@ + +// This dummy file is added to the resources section of the project to +// force XCode to create some resources for the dpm. If there aren't any +// resources, PT would refuse to load the plugin.. \ No newline at end of file diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h b/extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h new file mode 100644 index 0000000000..7be23e105b --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h @@ -0,0 +1,63 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_RTASCOMPILEFLAGS_JUCEHEADER__ +#define __JUCE_RTASCOMPILEFLAGS_JUCEHEADER__ + +#ifdef _MSC_VER + + #define kCompileAsCodeResource 0 + #define kBuildStandAlone 0 + #define kNoDSP 0 + #define kNoDAE 0 + #define kNoSDS 0 + #define kNoViews 0 + #define kUseDSPCodeDecode 0 + + #define WINDOWS_VERSION 1 + #define PLUGIN_SDK_BUILD 1 + #define PLUGIN_SDK_DIRECTMIDI 1 + +#else + + #define kCompileAsCodeResource 0 + #define kNoDSP 1 + #define kNoDAE 0 + #define kNoSDS 0 + #define kNoViews 0 + #define kUseDSPCodeDecode 0 + + #define PLUGIN_SDK_BUILD 1 + #define PLUGIN_SDK_DIRECTMIDI 1 + +#endif + +#endif // __JUCE_RTASCOMPILEFLAGS_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp b/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp new file mode 100644 index 0000000000..105077a272 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp @@ -0,0 +1,131 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#if _MSC_VER + +// (these functions are in a separate file because of problems including windows.h +// at the same time as the Digi headers) + +#include +#include "../../juce_AudioFilterBase.h" +#include "../../juce_AudioFilterEditor.h" + + +//============================================================================== +void JUCE_CALLTYPE attachSubWindow (void* hostWindow, + int& titleW, int& titleH, + Component* comp) +{ + RECT clientRect; + GetClientRect ((HWND) hostWindow, &clientRect); + + titleW = clientRect.right - clientRect.left; + titleH = jmax (0, (clientRect.bottom - clientRect.top) - comp->getHeight()); + comp->setTopLeftPosition (0, titleH); + + comp->addToDesktop (0); + + HWND plugWnd = (HWND) comp->getWindowHandle(); + SetParent (plugWnd, (HWND) hostWindow); + + DWORD val = GetWindowLong (plugWnd, GWL_STYLE); + val = (val & ~WS_POPUP) | WS_CHILD; + SetWindowLong (plugWnd, GWL_STYLE, val); +} + +void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, + int& titleW, int& titleH, + Component* comp) +{ + RECT clientRect, windowRect; + GetClientRect ((HWND) hostWindow, &clientRect); + GetWindowRect ((HWND) hostWindow, &windowRect); + const int borderW = (windowRect.right - windowRect.left) - (clientRect.right - clientRect.left); + const int borderH = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top); + + SetWindowPos ((HWND) hostWindow, 0, 0, 0, + borderW + jmax (titleW, comp->getWidth()), + borderH + comp->getHeight() + titleH, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); +} + +#if ! JucePlugin_EditorRequiresKeyboardFocus + +static HWND findMDIParentOf (HWND w) +{ + const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); + + while (w != 0) + { + HWND parent = GetParent (w); + + if (parent == 0) + break; + + TCHAR windowType [32]; + zeromem (windowType, sizeof (windowType)); + GetClassName (parent, windowType, 31); + + if (String (windowType).equalsIgnoreCase (T("MDIClient"))) + { + w = parent; + break; + } + + RECT windowPos; + GetWindowRect (w, &windowPos); + + RECT parentPos; + GetWindowRect (parent, &parentPos); + + int dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); + int dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); + + if (dw > 100 || dh > 100) + break; + + w = parent; + + if (dw == 2 * frameThickness) + break; + } + + return w; +} + +void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow) +{ + SetFocus (findMDIParentOf ((HWND) hostWindow)); +} + +#endif + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp b/extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp new file mode 100644 index 0000000000..3a040f58a0 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp @@ -0,0 +1,1011 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_RTASCompileFlags.h" + +#ifdef _MSC_VER + // the Digidesign projects all use a struct alignment of 2.. + #pragma pack (2) + #pragma warning (disable: 4267) + + #include "ForcedInclude.h" + #include "Mac2Win.H" +#endif + +/* Note about include paths + ------------------------ + + To be able to include all the Digidesign headers correctly, you'll need to add this + lot to your include path: + + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\common + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\common\Platform + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugIns\DSPManager\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\SADriver\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\DigiPublic\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\Fic\Interfaces\DAEClient + c:\yourdirectory\PT_711_SDK\AlturaPorts\NewFileLibs\Cmn + c:\yourdirectory\PT_711_SDK\AlturaPorts\NewFileLibs\DOA + c:\yourdirectory\PT_711_SDK\AlturaPorts\AlturaSource\PPC_H + c:\yourdirectory\PT_711_SDK\AlturaPorts\AlturaSource\AppSupport +*/ + +#include "CEffectGroupMIDI.h" +#include "CEffectProcessMIDI.h" +#include "CEffectProcessRTAS.h" +#include "CCustomView.h" +#include "CEffectTypeRTAS.h" +#include "CPluginControl.h" +#include "CPluginControl_OnOff.h" + +//============================================================================== +#include "../../juce_AudioFilterBase.h" +#include "../../juce_AudioFilterEditor.h" +#include "../../juce_IncludeCharacteristics.h" +#undef Component + +//============================================================================== +#if JUCE_WIN32 + extern void JUCE_CALLTYPE attachSubWindow (void* hostWindow, int& titleW, int& titleH, juce::Component* comp); + extern void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, int& titleW, int& titleH, juce::Component* comp); + #if ! JucePlugin_EditorRequiresKeyboardFocus + extern void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow); + #endif +#endif + +const int midiBufferSize = 1024; +const OSType juceChunkType = 'juce'; +static const int bypassControlIndex = 1; + +//============================================================================== +static float longToFloat (const long n) throw() +{ + return (float) ((((double) n) + (double) 0x80000000) / (double) 0xffffffff); +} + +static long floatToLong (const float n) throw() +{ + return roundDoubleToInt (jlimit (-(double) 0x80000000, + (double) 0x7fffffff, + n * (double) 0xffffffff - (double) 0x80000000)); +} + +//============================================================================== +class JucePlugInProcess : public CEffectProcessMIDI, + public CEffectProcessRTAS, + public AudioFilterBase::FilterNativeCallbacks, + public AsyncUpdater +{ +public: + //============================================================================== + JucePlugInProcess() + : prepared (false), + midiBufferNode (0), + midiTransport (0), + sampleRate (44100.0) + { + juceFilter = createPluginFilter(); + jassert (juceFilter != 0); + + AddChunk (juceChunkType, "Juce Audio Plugin Data"); + } + + ~JucePlugInProcess() + { + if (mLoggedIn) + MIDILogOut(); + + deleteAndZero (midiBufferNode); + deleteAndZero (midiTransport); + + if (prepared) + juceFilter->releaseResources(); + + delete juceFilter; + } + + //============================================================================== + class JuceCustomUIView : public CCustomView + { + public: + //============================================================================== + JuceCustomUIView (AudioFilterBase* const filter_) + : filter (filter_), + editorComp (0), + wrapper (0) + { + // setting the size in here crashes PT for some reason, so keep it simple.. + } + + ~JuceCustomUIView() + { + deleteEditorComp(); + } + + //============================================================================== + void updateSize() + { + if (editorComp == 0) + { + editorComp = filter->createEditorIfNeeded(); + jassert (editorComp != 0); + } + + Rect r; + r.left = 0; + r.top = 0; + r.right = editorComp->getWidth(); + r.bottom = editorComp->getHeight(); + SetRect (&r); + } + + void attachToWindow (GrafPtr port) + { + if (port != 0) + { + updateSize(); + +#if JUCE_WIN32 + void* const hostWindow = (void*) ASI_GethWnd ((WindowPtr) port); +#else + void* const hostWindow = (void*) GetWindowFromPort (port); +#endif + deleteAndZero (wrapper); + + wrapper = new EditorCompWrapper (hostWindow, editorComp, this); + } + else + { + deleteEditorComp(); + } + } + + void DrawContents (Rect* r) + { + if (wrapper != 0) + { + ComponentPeer* const peer = wrapper->getPeer(); + + if (peer != 0) + { +#if JUCE_WIN32 + // (seems to be required in PT6.4, but not in 7.x) + peer->repaint (0, 0, wrapper->getWidth(), wrapper->getHeight()); + +#elif JUCE_PPC + // This crap is needed because if you resize a window, PT doesn't + // update its clip region, so only part of your new window gets drawn. + // This overrides the clipping region that's being passed into the Draw + // method. + Rect visible; + GetVisibleRect (&visible); + + RestoreFocus(); + Focus (&visible); +#endif + peer->performAnyPendingRepaintsNow(); + } + } + } + + void DrawBackground (Rect* r) + { + } + + //============================================================================== + private: + AudioFilterBase* const filter; + juce::Component* wrapper; + AudioFilterEditor* editorComp; + + void deleteEditorComp() + { + if (editorComp != 0) + { + PopupMenu::dismissAllActiveMenus(); + + filter->editorBeingDeleted (editorComp); + deleteAndZero (editorComp); + deleteAndZero (wrapper); + } + } + + //============================================================================== + // A component to hold the AudioFilterEditor, and cope with some housekeeping + // chores when it changes or repaints. + class EditorCompWrapper : public juce::Component, +#if JUCE_MAC + public Timer +#else + public FocusChangeListener +#endif + { + public: + EditorCompWrapper (void* const hostWindow_, + AudioFilterEditor* const editorComp, + JuceCustomUIView* const owner_) + : hostWindow (hostWindow_), + owner (owner_), + titleW (0), + titleH (0) +#if JUCE_MAC + , forcedRepaintTimer (0) +#endif + { +#if ! JucePlugin_EditorRequiresKeyboardFocus + setWantsKeyboardFocus (false); +#endif + setOpaque (true); + setBroughtToFrontOnMouseClick (true); + setBounds (editorComp->getBounds()); + editorComp->setTopLeftPosition (0, 0); + addAndMakeVisible (editorComp); + +#if JUCE_WIN32 + attachSubWindow (hostWindow, titleW, titleH, this); + setVisible (true); +#else + SetAutomaticControlDragTrackingEnabledForWindow ((WindowRef) hostWindow_, true); + + WindowAttributes attributes; + GetWindowAttributes ((WindowRef) hostWindow_, &attributes); + + parentView = 0; + + if ((attributes & kWindowCompositingAttribute) != 0) + { + HIViewRef root = HIViewGetRoot ((WindowRef) hostWindow_); + HIViewFindByID (root, kHIViewWindowContentID, &parentView); + + if (parentView == 0) + parentView = root; + } + else + { + GetRootControl ((WindowRef) hostWindow_, (ControlRef*) &parentView); + + if (parentView == 0) + CreateRootControl ((WindowRef) hostWindow_, (ControlRef*) &parentView); + } + + jassert (parentView != 0); + Rect clientRect; + GetWindowBounds ((WindowRef) hostWindow, kWindowContentRgn, &clientRect); + + titleW = clientRect.right - clientRect.left; + titleH = jmax (0, (clientRect.bottom - clientRect.top) - getHeight()); + setTopLeftPosition (0, 0); + + HIViewSetNeedsDisplay (parentView, true); + + setVisible (true); + addToDesktop (ComponentPeer::windowRepaintedExplictly, (void*) parentView); + + HIViewRef pluginView = HIViewGetFirstSubview (parentView); + + #if ! JucePlugin_EditorRequiresKeyboardFocus + HIViewSetActivated (pluginView, false); + #endif + /* This is a convoluted and desperate workaround for a Digi (or maybe Apple) + layout bug. Until the parent control gets some kind of mouse-move + event, then our plugin's HIView remains stuck at (0, 0) in the + window (despite drawing correctly), which blocks mouse events from + getting to the widgets above it. + + After days of frustration the only hack I can find that works + is to use this arcane function to redirect mouse events to + the parent, while running a timer to spot the moment when our + view mysteriously snaps back to its correct location. + + If anyone at Digi or Apple is reading this and they realise that it's + their fault, could they please give me back the week of my life that + they made me waste on this rubbish. Thankyou. + */ + SetControlSupervisor (pluginView, parentView); + startTimer (150); +#endif + +#if JUCE_WIN32 && ! JucePlugin_EditorRequiresKeyboardFocus + Desktop::getInstance().addFocusChangeListener (this); +#endif + } + + ~EditorCompWrapper() + { +#if JUCE_WIN32 && ! JucePlugin_EditorRequiresKeyboardFocus + Desktop::getInstance().removeFocusChangeListener (this); +#endif + +#if JUCE_MAC + delete forcedRepaintTimer; +#endif + } + + void paint (Graphics& g) + { +#if JUCE_MAC + forcedRepaintTimer->stopTimer(); +#endif + } + + void resized() + { + Component* const c = getChildComponent (0); + + if (c != 0) + c->setBounds (0, 0, getWidth(), getHeight()); + + repaint(); + } + +#if JUCE_MAC + void timerCallback() + { + // Wait for the moment when PT deigns to allow our view to + // take up its actual location (see rant above) + HIViewRef content = 0; + HIViewFindByID (HIViewGetRoot ((WindowRef) hostWindow), kHIViewWindowContentID, &content); + HIPoint p = { 0.0f, 0.0f }; + + HIViewRef v = HIViewGetFirstSubview (parentView); + HIViewConvertPoint (&p, v, content); + + if (p.y > 12) + { + HIViewRef v = HIViewGetFirstSubview (parentView); + SetControlSupervisor (v, 0); + stopTimer(); + + forcedRepaintTimer = new RepaintCheckTimer (*this); + } + } +#endif + +#if JUCE_WIN32 + void globalFocusChanged (Component*) + { + #if ! JucePlugin_EditorRequiresKeyboardFocus + if (hasKeyboardFocus (true)) + passFocusToHostWindow (hostWindow); + #endif + } +#endif + + void childBoundsChanged (Component* child) + { + setSize (child->getWidth(), child->getHeight()); + child->setTopLeftPosition (0, 0); + +#if JUCE_WIN32 + resizeHostWindow (hostWindow, titleW, titleH, this); +#else + Rect r; + GetWindowBounds ((WindowRef) hostWindow, kWindowContentRgn, &r); + + HIRect p; + zerostruct (p); + HIViewConvertRect (&p, parentView, 0); // find the X position of our view in case there's space to the left of it + + r.right = r.left + jmax (titleW, ((int) p.origin.x) + getWidth()); + r.bottom = r.top + getHeight() + titleH; + + SetWindowBounds ((WindowRef) hostWindow, kWindowContentRgn, &r); + + owner->updateSize(); + owner->Invalidate(); +#endif + } + + //============================================================================== + juce_UseDebuggingNewOperator + +#if JUCE_MAC + protected: + void internalRepaint (int x, int y, int w, int h) + { + Component::internalRepaint (x, y, w, h); + owner->Invalidate(); + + if (forcedRepaintTimer != 0 && ! forcedRepaintTimer->isTimerRunning()) + forcedRepaintTimer->startTimer (1000 / 25); + } + + HIViewRef parentView; +#endif + + private: + void* const hostWindow; + JuceCustomUIView* const owner; + int titleW, titleH; + +#if JUCE_MAC + // if PT makes us wait too long for a redraw after we've + // asked for one, this should kick in and force one to happen + class RepaintCheckTimer : public Timer + { + public: + RepaintCheckTimer (EditorCompWrapper& owner_) + : owner (owner_) + { + } + + void timerCallback() + { + stopTimer(); + ComponentPeer* const peer = owner.getPeer(); + + if (peer != 0) + peer->performAnyPendingRepaintsNow(); + } + + EditorCompWrapper& owner; + }; + + RepaintCheckTimer* forcedRepaintTimer; +#endif + }; + }; + + JuceCustomUIView* getView() const + { + return dynamic_cast (fOurPlugInView); + } + + void GetViewRect (Rect* size) + { + if (getView() != 0) + getView()->updateSize(); + + CEffectProcessRTAS::GetViewRect (size); + } + + CPlugInView* CreateCPlugInView() + { + return new JuceCustomUIView (juceFilter); + } + + void SetViewPort (GrafPtr port) + { + CEffectProcessRTAS::SetViewPort (port); + + if (getView() != 0) + getView()->attachToWindow (port); + } + + //============================================================================== +protected: + ComponentResult GetDelaySamplesLong (long* aNumSamples) + { + *aNumSamples = JucePlugin_Latency; + return noErr; + } + + //============================================================================== + void EffectInit() + { + SFicPlugInStemFormats stems; + GetProcessType()->GetStemFormats (&stems); + + juceFilter->numInputChannels = fNumInputs; + juceFilter->numOutputChannels = fNumOutputs; + + AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); + DefineMasterBypassControlIndex (bypassControlIndex); + + for (int i = 0; i < juceFilter->getNumParameters(); ++i) + AddControl (new JucePluginControl (juceFilter, i)); + + // we need to do this midi log-in to get timecode, regardless of whether + // the plugin actually uses midi... + if (MIDILogIn() == noErr) + { +#if JucePlugin_WantsMidiInput + CEffectType* const type = dynamic_cast (this->GetProcessType()); + + if (type != 0) + { + char nodeName [64]; + type->GetProcessTypeName (63, nodeName); + p2cstrcpy (nodeName, reinterpret_cast (nodeName)); + + midiBufferNode = new CEffectMIDIOtherBufferedNode (&mMIDIWorld, + 8192, + eLocalNode, + nodeName, + midiBuffer); + + midiBufferNode->Initialize (1, true); + } +#endif + } + + midiTransport = new CEffectMIDITransport (&mMIDIWorld); + + juceFilter->initialiseInternal (this); + } + + void handleAsyncUpdate() + { + if (! prepared) + { + sampleRate = gProcessGroup->GetSampleRate(); + jassert (sampleRate > 0); + + juceFilter->prepareToPlay (sampleRate, + mRTGlobals->mHWBufferSizeInSamples); + + prepared = true; + } + } + + void RenderAudio (float** inputs, float** outputs, long numSamples) + { + if (! prepared) + { + triggerAsyncUpdate(); + bypassBuffers (inputs, outputs, numSamples); + return; + } + + if (mBypassed) + { + bypassBuffers (inputs, outputs, numSamples); + return; + } + +#if JucePlugin_WantsMidiInput + midiEvents.clear(); + + const Cmn_UInt32 bufferSize = mRTGlobals->mHWBufferSizeInSamples; + + if (midiBufferNode->GetAdvanceScheduleTime() != bufferSize) + midiBufferNode->SetAdvanceScheduleTime (bufferSize); + + if (midiBufferNode->FillMIDIBuffer (mRTGlobals->mRunningTime, numSamples) == noErr) + { + jassert (midiBufferNode->GetBufferPtr() != 0); + const int numMidiEvents = midiBufferNode->GetBufferSize(); + + for (int i = 0; i < numMidiEvents; ++i) + { + const DirectMidiPacket& m = midiBuffer[i]; + + jassert ((int) m.mTimestamp < numSamples); + + midiEvents.addEvent (m.mData, m.mLength, + jlimit (0, (int) numSamples - 1, (int) m.mTimestamp)); + } + } +#endif + +#if defined (JUCE_DEBUG) || JUCE_LOG_ASSERTIONS + const int numMidiEventsComingIn = midiEvents.getNumEvents(); +#endif + + { + const AudioSampleBuffer input (inputs, juceFilter->numInputChannels, numSamples); + AudioSampleBuffer output (outputs, juceFilter->numOutputChannels, numSamples); + + const ScopedLock sl (juceFilter->getCallbackLock()); + + if (juceFilter->suspended) + bypassBuffers (inputs, outputs, numSamples); + else + juceFilter->processBlock (input, output, false, midiEvents); + } + + if (! midiEvents.isEmpty()) + { +#if JucePlugin_ProducesMidiOutput + const uint8* midiEventData; + int midiEventSize, midiEventPosition; + MidiBuffer::Iterator i (midiEvents); + + while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) + { +// jassert (midiEventPosition >= 0 && midiEventPosition < (int) numSamples); + + //xxx + } +#else + // if your plugin creates midi messages, you'll need to set + // the JucePlugin_ProducesMidiOutput macro to 1 in your + // JucePluginCharacteristics.h file + jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); +#endif + + midiEvents.clear(); + } + } + + //============================================================================== + ComponentResult GetChunkSize (OSType chunkID, long* size) + { + if (chunkID == juceChunkType) + { + tempFilterData.setSize (0); + juceFilter->getStateInformation (tempFilterData); + + *size = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); + return noErr; + } + else + { + return CEffectProcessMIDI::GetChunkSize (chunkID, size); + } + } + + ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) + { + if (chunkID == juceChunkType) + { + if (tempFilterData.getSize() == 0) + juceFilter->getStateInformation (tempFilterData); + + chunk->fSize = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); + tempFilterData.copyTo ((void*) chunk->fData, 0, tempFilterData.getSize()); + + tempFilterData.setSize (0); + + return noErr; + } + else + { + return CEffectProcessMIDI::GetChunk (chunkID, chunk); + } + } + + ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) + { + if (chunkID == juceChunkType) + { + tempFilterData.setSize (0); + + if (chunk->fSize - sizeof (SFicPlugInChunkHeader) > 0) + { + juceFilter->setStateInformation ((void*) chunk->fData, + chunk->fSize - sizeof (SFicPlugInChunkHeader)); + } + + return noErr; + } + + return CEffectProcessMIDI::SetChunk (chunkID, chunk); + } + + //============================================================================== + ComponentResult UpdateControlValue (long controlIndex, long value) + { + if (controlIndex != bypassControlIndex) + juceFilter->setParameter (controlIndex - 2, longToFloat (value)); + else + mBypassed = (value > 0); + + return CProcess::UpdateControlValue (controlIndex, value); + } + + //============================================================================== + bool JUCE_CALLTYPE getCurrentPositionInfo (AudioFilterBase::CurrentPositionInfo& info) + { + // this method can only be called while the plugin is running + jassert (prepared); + + Cmn_Float64 bpm = 120.0; + Cmn_Int32 num = 4, denom = 4; + Cmn_Int64 ticks = 0; + Cmn_Bool isPlaying = false; + + if (midiTransport != 0) + { + midiTransport->GetCurrentTempo (&bpm); + midiTransport->IsTransportPlaying (&isPlaying); + midiTransport->GetCurrentMeter (&num, &denom); + midiTransport->GetCurrentTickPosition (&ticks); + } + + info.bpm = bpm; + info.timeSigNumerator = num; + info.timeSigDenominator = denom; + info.isPlaying = isPlaying; + info.isRecording = false; + info.ppqPosition = ticks / 960000.0; + info.ppqPositionOfLastBarStart = 0; //xxx no idea how to get this correctly.. + + // xxx incorrect if there are tempo changes, but there's no + // other way of getting this info.. + info.timeInSeconds = ticks * (60.0 / 960000.0) / bpm; + + double framesPerSec = 24.0; + + switch (fTimeCodeInfo.mFrameRate) + { + case ficFrameRate_24Frame: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps24; + break; + + case ficFrameRate_25Frame: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps25; + framesPerSec = 25.0; + break; + + case ficFrameRate_2997NonDrop: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps2997; + framesPerSec = 29.97002997; + break; + + case ficFrameRate_2997DropFrame: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps2997drop; + framesPerSec = 29.97002997; + break; + + case ficFrameRate_30NonDrop: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps30; + framesPerSec = 30.0; + break; + + case ficFrameRate_30DropFrame: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps30drop; + framesPerSec = 30.0; + break; + + case ficFrameRate_23976: + // xxx not strictly true.. + info.frameRate = AudioFilterBase::CurrentPositionInfo::fps24; + framesPerSec = 23.976; + break; + + default: + info.frameRate = AudioFilterBase::CurrentPositionInfo::fpsUnknown; + break; + } + + info.editOriginTime = fTimeCodeInfo.mFrameOffset * framesPerSec; + + return true; + } + + void JUCE_CALLTYPE informHostOfParameterChange (int index, float newValue) + { + SetControlValue (index + 2, floatToLong (newValue)); + } + + //============================================================================== +private: + AudioFilterBase* juceFilter; + MidiBuffer midiEvents; + CEffectMIDIOtherBufferedNode* midiBufferNode; + CEffectMIDITransport* midiTransport; + DirectMidiPacket midiBuffer [midiBufferSize]; + + juce::MemoryBlock tempFilterData; + bool prepared; + double sampleRate; + + void bypassBuffers (float** const inputs, float** const outputs, const long numSamples) const + { + for (int i = fNumOutputs; --i >= 0;) + { + if (i < fNumInputs) + memcpy (outputs[i], inputs[i], numSamples * sizeof (float)); + else + zeromem (outputs[i], numSamples * sizeof (float)); + } + } + + //============================================================================== + class JucePluginControl : public CPluginControl + { + public: + //============================================================================== + JucePluginControl (AudioFilterBase* const juceFilter_, const int index_) + : juceFilter (juceFilter_), + index (index_) + { + } + + ~JucePluginControl() + { + } + + //============================================================================== + OSType GetID() const { return index + 1; } + long GetDefaultValue() const { return floatToLong (0); } + void SetDefaultValue (long) {} + long GetNumSteps() const { return 0xffffffff; } + + long ConvertStringToValue (const char* valueString) const + { + return floatToLong (String (valueString).getFloatValue()); + } + + Cmn_Bool IsKeyValid(long key) const { return true; } + + void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const + { + juceFilter->getParameterName (index).copyToBuffer (name, maxLength); + } + + long GetPriority() const { return kFicCooperativeTaskPriority; } + + long GetOrientation() const + { + return kDAE_LeftMinRightMax | kDAE_BottomMinTopMax + | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; + } + + long GetControlType() const { return kDAE_ContinuousValues; } + + void GetValueString (char* valueString, int maxLength, long value) const + { + juceFilter->getParameterText (index).copyToBuffer (valueString, maxLength); + } + + Cmn_Bool IsAutomatable() const { return true; } + + private: + //============================================================================== + AudioFilterBase* const juceFilter; + const int index; + + JucePluginControl (const JucePluginControl&); + const JucePluginControl& operator= (const JucePluginControl&); + }; +}; + + +//============================================================================== +class JucePlugInGroup : public CEffectGroupMIDI +{ +public: + //============================================================================== + JucePlugInGroup() + { + DefineManufacturerNamesAndID (JucePlugin_Manufacturer, JucePlugin_RTASManufacturerCode); + DefinePlugInNamesAndVersion (createRTASName(), JucePlugin_VersionCode); + +#ifndef JUCE_DEBUG + AddGestalt (pluginGestalt_IsCacheable); +#endif + } + + ~JucePlugInGroup() + { + shutdownJuce_GUI(); + } + + //============================================================================== + void CreateEffectTypes() + { + const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; + const int numConfigs = numElementsInArray (channelConfigs); + + // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations + // value in your JucePluginCharacteristics.h file.. + jassert (numConfigs > 0); + + for (int i = 0; i < numConfigs; ++i) + { + CEffectType* const type + = new CEffectTypeRTAS ('jcaa' + i, + JucePlugin_RTASProductId, + JucePlugin_RTASCategory); + + type->DefineTypeNames (createRTASName()); + type->DefineSampleRateSupport (eSupports48kAnd96kAnd192k); + + type->DefineStemFormats (getFormatForChans (channelConfigs [i][0]), + getFormatForChans (channelConfigs [i][1])); + + type->AddGestalt (pluginGestalt_CanBypass); + type->AddGestalt (pluginGestalt_SupportsVariableQuanta); + type->AttachEffectProcessCreator (createNewProcess); + + AddEffectType (type); + } + } + + void Initialize() + { + CEffectGroupMIDI::Initialize(); + } + + //============================================================================== +private: + static CEffectProcess* createNewProcess() + { + // Juce setup +#if JUCE_WIN32 + PlatformUtilities::setCurrentModuleInstanceHandle (gThisModule); +#endif + initialiseJuce_GUI(); + + return new JucePlugInProcess(); + } + + static const String createRTASName() + { + return String (JucePlugin_Name) + T("\n") + + String (JucePlugin_Name).substring (0, 4); + } + + static EPlugIn_StemFormat getFormatForChans (const int numChans) throw() + { + switch (numChans) + { + case 1: + return ePlugIn_StemFormat_Mono; + + case 2: + return ePlugIn_StemFormat_Stereo; + + case 3: + return ePlugIn_StemFormat_LCR; + + case 4: + return ePlugIn_StemFormat_Quad; + + case 5: + return ePlugIn_StemFormat_5dot0; + + case 6: + return ePlugIn_StemFormat_5dot1; + + case 7: + return ePlugIn_StemFormat_6dot1; + + case 8: + return ePlugIn_StemFormat_7dot1; + + default: + jassertfalse // hmm - not a valid number of chans for RTAS.. + break; + } + + return ePlugIn_StemFormat_Generic; + } +}; + +CProcessGroupInterface* CProcessGroup::CreateProcessGroup() +{ + return new JucePlugInGroup(); +} diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTAS_dlldefs.def b/extras/audio plugins/wrapper/formats/RTAS/juce_RTAS_dlldefs.def new file mode 100644 index 0000000000..709ecd9f07 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/juce_RTAS_dlldefs.def @@ -0,0 +1,5 @@ +EXPORTS + NewPlugIn @1 + _PI_GetRoutineDescriptor @2 + + diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp new file mode 100644 index 0000000000..d5e50a2b1a --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectGroup.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp new file mode 100644 index 0000000000..556d894d7a --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectGroupMIDI.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp new file mode 100644 index 0000000000..f96e37c28c --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectMIDIUtils.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp new file mode 100644 index 0000000000..9bb0967e92 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectProcess.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp new file mode 100644 index 0000000000..e3189ee266 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectProcessAS.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp new file mode 100644 index 0000000000..06235d8f61 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectProcessMIDI.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp new file mode 100644 index 0000000000..b3d718d9ca --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectType.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp new file mode 100644 index 0000000000..13c58db6fa --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "CEffectTypeRTAS.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp new file mode 100644 index 0000000000..61ad544fe3 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "ChunkDataParser.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp new file mode 100644 index 0000000000..f9b6ca7b44 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp @@ -0,0 +1,46 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#if WINDOWS_VERSION + #include "DLLMain.cpp" +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp new file mode 100644 index 0000000000..807c3600f0 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp @@ -0,0 +1,46 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#if WINDOWS_VERSION + #include "DefaultSwap.cpp" +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp new file mode 100644 index 0000000000..2df7f9e89b --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp @@ -0,0 +1,40 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +/* This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. +*/ + +#include "juce_Wrapper_Header.h" +#if ! WINDOWS_VERSION + #include "Dispatcher.cpp" +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h new file mode 100644 index 0000000000..d779f72d0d --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h @@ -0,0 +1,45 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_WRAPPER_HEADER_JUCEHEADER__ +#define __JUCE_WRAPPER_HEADER_JUCEHEADER__ + +#include "../juce_RTASCompileFlags.h" + +#ifdef _MSC_VER + // the Digidesign projects all use a struct alignment of 2.. + #pragma pack (2) + #pragma warning (disable: 4267 4996 4311 4312 4103) + + #include "ForcedInclude.h" +#endif + +#endif // __JUCE_WRAPPER_HEADER_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp new file mode 100644 index 0000000000..e8adbba2b4 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp @@ -0,0 +1,44 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_Wrapper_Header.h" + +/* + This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. + + Note about include paths + + If you get an error including this file, check your paths - there's a full list of + Digidesign paths in juce_RTASWrapper.cpp +*/ +#include "PlugInUtils.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp new file mode 100644 index 0000000000..4659b6692d --- /dev/null +++ b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp @@ -0,0 +1,40 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +/* This file is used to include and build a digidesign CPP file without your project needing to + reference the file directly. Because the file will be located via the include path, this means + that the project doesn't have to change to cope with people's SDKs being in different locations. +*/ + +#include "juce_Wrapper_Header.h" +#if ! WINDOWS_VERSION + #include "PlugInInitialize.cpp" +#endif diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.cpp b/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.cpp new file mode 100644 index 0000000000..d0b622d7c1 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.cpp @@ -0,0 +1,179 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_AudioFilterStreamer.h" +#include "../../juce_IncludeCharacteristics.h" + + +//============================================================================== +AudioFilterStreamer::AudioFilterStreamer (AudioFilterBase& filterToUse) + : filter (filterToUse), + isPlaying (false), + sampleRate (0), + emptyBuffer (1, 32) +{ + filter.numInputChannels = JucePlugin_MaxNumInputChannels; + filter.numOutputChannels = JucePlugin_MaxNumOutputChannels; + + filter.initialiseInternal (this); +} + +AudioFilterStreamer::~AudioFilterStreamer() +{ + audioDeviceStopped(); +} + +void AudioFilterStreamer::audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) +{ + MidiBuffer midiBuffer; + midiCollector.removeNextBlockOfMessages (midiBuffer, numSamples); + + int i, numActiveInChans = 0, numActiveOutChans = 0; + int numOutsWanted = filter.getNumOutputChannels(); + const int numInsWanted = filter.getNumInputChannels(); + + for (i = 0; i < totalNumInputChannels; ++i) + if (inputChannelData[i] != 0) + inChans [numActiveInChans++] = (float*) inputChannelData[i]; + + while (numActiveInChans < numInsWanted) + inChans [numActiveInChans++] = emptyBuffer.getSampleData (0, 0); + + for (i = 0; i < totalNumOutputChannels; ++i) + if (outputChannelData[i] != 0) + outChans [numActiveOutChans++] = outputChannelData[i]; + + i = 0; + while (numActiveOutChans < numOutsWanted) + outChans [numActiveOutChans++] = emptyBuffer.getSampleData (++i, 0); + + AudioSampleBuffer input (inChans, jmin (numInsWanted, numActiveInChans), numSamples); + AudioSampleBuffer output (outChans, jmin (numOutsWanted, numActiveOutChans), numSamples); + + { + const ScopedLock sl (filter.getCallbackLock()); + + if (filter.suspended) + output.clear(); + else + filter.processBlock (input, output, false, midiBuffer); + } + + while (numOutsWanted < numActiveOutChans) + zeromem (outChans[numOutsWanted++], sizeof (float) * numSamples); +} + +void AudioFilterStreamer::audioDeviceAboutToStart (double sampleRate_, + int numSamplesPerBlock) +{ + sampleRate = sampleRate_; + + if (! isPlaying) + { + isPlaying = true; + + emptyBuffer.setSize (1 + filter.getNumOutputChannels(), + jmax (2048, numSamplesPerBlock * 2)); + emptyBuffer.clear(); + + midiCollector.reset (sampleRate); + + filter.prepareToPlay (sampleRate, numSamplesPerBlock); + } +} + +void AudioFilterStreamer::audioDeviceStopped() +{ + if (isPlaying) + { + isPlaying = false; + filter.releaseResources(); + midiCollector.reset (sampleRate); + emptyBuffer.setSize (1, 32); + } +} + +void AudioFilterStreamer::handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) +{ +#if JucePlugin_WantsMidiInput + midiCollector.addMessageToQueue (message); +#endif +} + +bool AudioFilterStreamer::getCurrentPositionInfo (AudioFilterBase::CurrentPositionInfo& info) +{ + return false; +} + +void AudioFilterStreamer::informHostOfParameterChange (int index, float newValue) +{ + filter.setParameter (index, newValue); +} + + + +//============================================================================== +AudioFilterStreamingDeviceManager::AudioFilterStreamingDeviceManager() + : streamer (0) +{ +} + +AudioFilterStreamingDeviceManager::~AudioFilterStreamingDeviceManager() +{ + setFilter (0); + clearSingletonInstance(); +} + +void AudioFilterStreamingDeviceManager::setFilter (AudioFilterBase* filterToStream) +{ + if (streamer != 0) + { + removeMidiInputCallback (streamer); + setAudioCallback (0); + + delete streamer; + streamer = 0; + } + + if (filterToStream != 0) + { + streamer = new AudioFilterStreamer (*filterToStream); + + setAudioCallback (streamer); + addMidiInputCallback (String::empty, streamer); + } +} + +juce_ImplementSingleton (AudioFilterStreamingDeviceManager); diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h b/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h new file mode 100644 index 0000000000..82a32150ff --- /dev/null +++ b/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h @@ -0,0 +1,129 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_AUDIOFILTERSTREAMER_JUCEHEADER__ +#define __JUCE_AUDIOFILTERSTREAMER_JUCEHEADER__ + +#include "../../juce_AudioFilterBase.h" + + +//============================================================================== +/** + A class that wraps an AudioFilterBase as an AudioIODeviceCallback, so its + output can be streamed directly to/from some audio and midi inputs and outputs. + + To use it, just create an instance of this for your filter, and register it + as the callback with an AudioIODevice or AudioDeviceManager object. + + To receive midi input in your filter, you should also register it as a + MidiInputCallback with a suitable MidiInput or an AudioDeviceManager. + + And for an even easier way of doing a standalone plugin, see the + AudioFilterStreamingDeviceManager class... +*/ +class AudioFilterStreamer : public AudioIODeviceCallback, + public MidiInputCallback, + public AudioFilterBase::FilterNativeCallbacks +{ +public: + //============================================================================== + AudioFilterStreamer (AudioFilterBase& filterToUse); + ~AudioFilterStreamer(); + + + //============================================================================== + void audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples); + + void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock); + void audioDeviceStopped(); + + void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message); + + bool JUCE_CALLTYPE getCurrentPositionInfo (AudioFilterBase::CurrentPositionInfo& info); + void JUCE_CALLTYPE informHostOfParameterChange (int index, float newValue); + + juce_UseDebuggingNewOperator + +private: + //============================================================================== + AudioFilterBase& filter; + bool isPlaying; + double sampleRate; + MidiMessageCollector midiCollector; + + float* outChans [128]; + float* inChans [128]; + AudioSampleBuffer emptyBuffer; +}; + +//============================================================================== +/** + Wraps an AudioFilterStreamer in an AudioDeviceManager to make it easy to + create a standalone filter. + + This simply acts as a singleton AudioDeviceManager, which continuously + streams audio from the filter you give it with the setFilter() method. + + To use it, simply create an instance of it (or use getInstance() if you're + using it as a singleton), initialise it like you would a normal + AudioDeviceManager, and call setFilter() to start it running your plugin. + +*/ +class AudioFilterStreamingDeviceManager : public AudioDeviceManager +{ +public: + //============================================================================== + AudioFilterStreamingDeviceManager(); + ~AudioFilterStreamingDeviceManager(); + + juce_DeclareSingleton (AudioFilterStreamingDeviceManager, true); + + //============================================================================== + /** Tells the device which filter to stream audio through. + + Pass in 0 to deselect the current filter. + */ + void setFilter (AudioFilterBase* filterToStream); + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + AudioFilterStreamer* streamer; +}; + + +#endif // __JUCE_AUDIOFILTERSTREAMER_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp b/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp new file mode 100644 index 0000000000..97b95de0d9 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp @@ -0,0 +1,295 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_StandaloneFilterWindow.h" +#include "../../juce_IncludeCharacteristics.h" + + +//============================================================================== +StandaloneFilterWindow::StandaloneFilterWindow (const String& title, + const Colour& backgroundColour) + : DocumentWindow (title, backgroundColour, + DocumentWindow::minimiseButton + | DocumentWindow::closeButton), + filter (0), + deviceManager (0), + optionsButton (0) +{ + setTitleBarButtonsRequired (DocumentWindow::minimiseButton | DocumentWindow::closeButton, false); + + PropertySet* const globalSettings = getGlobalSettings(); + + optionsButton = new TextButton (T("options")); + Component::addAndMakeVisible (optionsButton); + optionsButton->addButtonListener (this); + optionsButton->setTriggeredOnMouseDown (true); + + JUCE_TRY + { + filter = createPluginFilter(); + + if (filter != 0) + { + deviceManager = new AudioFilterStreamingDeviceManager(); + deviceManager->setFilter (filter); + + XmlElement* savedState = 0; + + if (globalSettings != 0) + savedState = globalSettings->getXmlValue (T("audioSetup")); + + deviceManager->initialise (filter->getNumInputChannels(), + filter->getNumOutputChannels(), + savedState, + true); + + delete savedState; + + if (globalSettings != 0) + { + juce::MemoryBlock data; + + if (data.fromBase64Encoding (globalSettings->getValue (T("filterState"))) + && data.getSize() > 0) + { + filter->setStateInformation (data.getData(), data.getSize()); + } + } + + setContentComponent (filter->createEditorIfNeeded(), true, true); + + const int x = globalSettings->getIntValue (T("windowX"), -100); + const int y = globalSettings->getIntValue (T("windowY"), -100); + + if (x != -100 && y != -100) + setBoundsConstrained (x, y, getWidth(), getHeight()); + else + centreWithSize (getWidth(), getHeight()); + } + } + JUCE_CATCH_ALL + + if (deviceManager == 0) + { + jassertfalse // Your filter didn't create correctly! In a standalone app that's not too great. + JUCEApplication::quit(); + } +} + +StandaloneFilterWindow::~StandaloneFilterWindow() +{ + PropertySet* const globalSettings = getGlobalSettings(); + + globalSettings->setValue (T("windowX"), getX()); + globalSettings->setValue (T("windowY"), getY()); + + deleteAndZero (optionsButton); + + if (globalSettings != 0 && deviceManager != 0) + { + XmlElement* const xml = deviceManager->createStateXml(); + globalSettings->setValue (T("audioSetup"), xml); + delete xml; + } + + deleteAndZero (deviceManager); + + if (globalSettings != 0 && filter != 0) + { + juce::MemoryBlock data; + filter->getStateInformation (data); + + globalSettings->setValue (T("filterState"), data.toBase64Encoding()); + } + + deleteFilter(); +} + +//============================================================================== +void StandaloneFilterWindow::deleteFilter() +{ + if (deviceManager != 0) + deviceManager->setFilter (0); + + if (filter != 0 && getContentComponent() != 0) + { + filter->editorBeingDeleted (dynamic_cast (getContentComponent())); + setContentComponent (0, true); + } + + deleteAndZero (filter); +} + +void StandaloneFilterWindow::resetFilter() +{ + deleteFilter(); + + filter = createPluginFilter(); + + if (filter != 0) + { + if (deviceManager != 0) + deviceManager->setFilter (filter); + + setContentComponent (filter->createEditorIfNeeded(), true, true); + } + + PropertySet* const globalSettings = getGlobalSettings(); + + if (globalSettings != 0) + globalSettings->removeValue (T("filterState")); +} + +//============================================================================== +void StandaloneFilterWindow::saveState() +{ + PropertySet* const globalSettings = getGlobalSettings(); + + FileChooser fc (TRANS("Save current state"), + globalSettings != 0 ? File (globalSettings->getValue (T("lastStateFile"))) + : File::nonexistent); + + if (fc.browseForFileToSave (true)) + { + juce::MemoryBlock data; + filter->getStateInformation (data); + + if (! fc.getResult().replaceWithData (data.getData(), data.getSize())) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + TRANS("Error whilst saving"), + TRANS("Couldn't write to the specified file!")); + } + } +} + +void StandaloneFilterWindow::loadState() +{ + PropertySet* const globalSettings = getGlobalSettings(); + + FileChooser fc (TRANS("Load a saved state"), + globalSettings != 0 ? File (globalSettings->getValue (T("lastStateFile"))) + : File::nonexistent); + + if (fc.browseForFileToOpen()) + { + juce::MemoryBlock data; + + if (fc.getResult().loadFileAsData (data)) + { + filter->setStateInformation (data.getData(), data.getSize()); + } + else + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + TRANS("Error whilst loading"), + TRANS("Couldn't read from the specified file!")); + } + } +} + +//============================================================================== +PropertySet* StandaloneFilterWindow::getGlobalSettings() +{ + /* If you want this class to store the plugin's settings, you can set up an + ApplicationProperties object and use this method as it is, or override this + method to return your own custom PropertySet. + + If using this method without changing it, you'll probably need to call + ApplicationProperties::setStorageParameters() in your plugin's constructor to + tell it where to save the file. + */ + return ApplicationProperties::getInstance()->getUserSettings(); +} + +void StandaloneFilterWindow::showAudioSettingsDialog() +{ + AudioDeviceSelectorComponent selectorComp (*deviceManager, + filter->getNumInputChannels(), + filter->getNumInputChannels(), + filter->getNumOutputChannels(), + filter->getNumOutputChannels(), + true); + + selectorComp.setSize (500, 350); + + DialogWindow::showModalDialog (TRANS("Audio Settings"), &selectorComp, this, Colours::lightgrey, true, false, false); +} + +//============================================================================== +void StandaloneFilterWindow::closeButtonPressed() +{ + JUCEApplication::quit(); +} + +void StandaloneFilterWindow::resized() +{ + DocumentWindow::resized(); + + if (optionsButton != 0) + optionsButton->setBounds (8, 6, 60, getTitleBarHeight() - 8); +} + +void StandaloneFilterWindow::buttonClicked (Button*) +{ + if (filter == 0) + return; + + PopupMenu m; + m.addItem (1, TRANS("Audio Settings...")); + m.addSeparator(); + m.addItem (2, TRANS("Save current state...")); + m.addItem (3, TRANS("Load a saved state...")); + m.addSeparator(); + m.addItem (4, TRANS("Reset to default state")); + + switch (m.showAt (optionsButton)) + { + case 1: + showAudioSettingsDialog(); + break; + + case 2: + saveState(); + break; + + case 3: + loadState(); + break; + + case 4: + resetFilter(); + break; + + default: + break; + } +} diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.h b/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.h new file mode 100644 index 0000000000..1a03d81617 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.h @@ -0,0 +1,96 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_STANDALONEFILTERWINDOW_JUCEHEADER__ +#define __JUCE_STANDALONEFILTERWINDOW_JUCEHEADER__ + +#include "juce_AudioFilterStreamer.h" + + +//============================================================================== +/** + A class that can be used to run a simple standalone application containing your filter. + + Just create one of these objects in your JUCEApplication::initialise() method, and + let it do its work. It will create your filter object using the same createFilter() function + that the other plugin wrappers use. +*/ +class StandaloneFilterWindow : public DocumentWindow, + public ButtonListener +{ +public: + //============================================================================== + StandaloneFilterWindow (const String& title, + const Colour& backgroundColour); + + ~StandaloneFilterWindow(); + + //============================================================================== + /** Deletes and re-creates the filter and its UI. */ + void resetFilter(); + + /** Pops up a dialog letting the user save the filter's state to a file. */ + void saveState(); + + /** Pops up a dialog letting the user re-load the filter's state from a file. */ + void loadState(); + + /** Shows the audio properties dialog box modally. */ + virtual void showAudioSettingsDialog(); + + /** Returns the property set to use for storing the app's last state. + + This will be used to store the audio set-up and the filter's last state. + */ + virtual PropertySet* getGlobalSettings(); + + //============================================================================== + /** @internal */ + void closeButtonPressed(); + /** @internal */ + void buttonClicked (Button*); + /** @internal */ + void resized(); + + juce_UseDebuggingNewOperator + +private: + AudioFilterBase* filter; + AudioFilterStreamingDeviceManager* deviceManager; + Button* optionsButton; + + void deleteFilter(); + + StandaloneFilterWindow (const StandaloneFilterWindow&); + const StandaloneFilterWindow& operator= (const StandaloneFilterWindow&); +}; + +#endif // __JUCE_STANDALONEFILTERWINDOW_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp b/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp new file mode 100644 index 0000000000..14f48194c8 --- /dev/null +++ b/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp @@ -0,0 +1,1290 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +/* + *** DON't EDIT THIS FILE!! *** + + The idea is that everyone's plugins should share this same wrapper + code, so if you start hacking around in here you're missing the point! + + If there's a bug or a function you need that can't be done without changing + some of the code in here, give me a shout so we can add it to the library, + rather than branching off and going it alone! +*/ + + +//============================================================================== +#ifdef _MSC_VER + #pragma warning (disable : 4996) +#endif + +#ifdef _WIN32 + #include +#elif defined (LINUX) + #include + #include + #include + #undef KeyPress +#else + #include +#endif + +#ifdef PRAGMA_ALIGN_SUPPORTED + #undef PRAGMA_ALIGN_SUPPORTED + #define PRAGMA_ALIGN_SUPPORTED 1 +#endif + +#include "../../juce_IncludeCharacteristics.h" + +//============================================================================== +/* These files come with the Steinberg VST SDK - to get them, you'll need to + visit the Steinberg website and jump through some hoops to sign up as a + VST developer. + + Then, you'll need to make sure your include path contains your "vstsdk2.3" or + "vstsdk2.4" directory. + + Note that the JUCE_USE_VSTSDK_2_4 macro should be defined in JucePluginCharacteristics.h +*/ +#if JUCE_USE_VSTSDK_2_4 + // VSTSDK V2.4 includes.. + #include "public.sdk/source/vst2.x/audioeffectx.h" + #include "public.sdk/source/vst2.x/aeffeditor.h" + #include "public.sdk/source/vst2.x/audioeffectx.cpp" + #include "public.sdk/source/vst2.x/audioeffect.cpp" +#else + // VSTSDK V2.3 includes.. + #include "source/common/audioeffectx.h" + #include "source/common/AEffEditor.hpp" + #include "source/common/audioeffectx.cpp" + #include "source/common/AudioEffect.cpp" + typedef long VstInt32; + typedef long VstIntPtr; +#endif + +//============================================================================== +#include "../../juce_AudioFilterBase.h" +#undef MemoryBlock + +class JuceVSTWrapper; +static bool recursionCheck = false; +static uint32 lastMasterIdleCall = 0; + +BEGIN_JUCE_NAMESPACE + extern void juce_callAnyTimersSynchronously(); + + #if JUCE_MAC + extern void juce_macDoPendingRepaintsNow(); + #elif JUCE_LINUX + extern Display* display; + extern bool juce_dispatchNextMessageOnSystemQueue (bool); + #endif +END_JUCE_NAMESPACE + +//============================================================================== +#if JUCE_WIN32 + +static HWND findMDIParentOf (HWND w) +{ + const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); + + while (w != 0) + { + HWND parent = GetParent (w); + + if (parent == 0) + break; + + TCHAR windowType [32]; + zeromem (windowType, sizeof (windowType)); + GetClassName (parent, windowType, 31); + + if (String (windowType).equalsIgnoreCase (T("MDIClient"))) + { + w = parent; + break; + } + + RECT windowPos; + GetWindowRect (w, &windowPos); + + RECT parentPos; + GetWindowRect (parent, &parentPos); + + int dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); + int dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); + + if (dw > 100 || dh > 100) + break; + + w = parent; + + if (dw == 2 * frameThickness) + break; + } + + return w; +} + +//============================================================================== +#elif JUCE_LINUX + +class SharedMessageThread : public Thread +{ +public: + SharedMessageThread() + : Thread (T("VstMessageThread")) + { + startThread (7); + } + + ~SharedMessageThread() + { + signalThreadShouldExit(); + + const int quitMessageId = 0xfffff321; + Message* const m = new Message (quitMessageId, 1, 0, 0); + + if (! juce_postMessageToSystemQueue (m, true)) + delete m; + + clearSingletonInstance(); + } + + void run() + { + MessageManager* const messageManager = MessageManager::getInstance(); + + const int originalThreadId = messageManager->getCurrentMessageThread(); + messageManager->setCurrentMessageThread (getThreadId()); + + while (! threadShouldExit() + && messageManager->dispatchNextMessage()) + { + } + + messageManager->setCurrentMessageThread (originalThreadId); + } + + juce_DeclareSingleton (SharedMessageThread, true) +}; + +juce_ImplementSingleton (SharedMessageThread); + +#endif + +//============================================================================== +// A component to hold the AudioFilterEditor, and cope with some housekeeping +// chores when it changes or repaints. +class EditorCompWrapper : public Component, + public AsyncUpdater +{ + JuceVSTWrapper* wrapper; + +public: + EditorCompWrapper (JuceVSTWrapper* const wrapper_, + AudioFilterEditor* const editor) + : wrapper (wrapper_) + { + setOpaque (true); + editor->setOpaque (true); + + setBounds (editor->getBounds()); + editor->setTopLeftPosition (0, 0); + addAndMakeVisible (editor); + +#if JUCE_WIN32 + addMouseListener (this, true); +#endif + } + + ~EditorCompWrapper() + { + deleteAllChildren(); + } + + void paint (Graphics& g) + { + } + + void paintOverChildren (Graphics& g) + { + // this causes an async call to masterIdle() to help + // creaky old DAWs like Nuendo repaint themselves while we're + // repainting. Otherwise they just seem to give up and sit there + // waiting. + triggerAsyncUpdate(); + } + + AudioFilterEditor* getEditorComp() const + { + return dynamic_cast (getChildComponent (0)); + } + + void resized() + { + Component* const c = getChildComponent (0); + + if (c != 0) + c->setBounds (0, 0, getWidth(), getHeight()); + } + + void childBoundsChanged (Component* child); + void handleAsyncUpdate(); + +#if JUCE_WIN32 + void mouseDown (const MouseEvent&) + { + broughtToFront(); + } + + void broughtToFront() + { + // for hosts like nuendo, need to also pop the MDI container to the + // front when our comp is clicked on. + HWND parent = findMDIParentOf ((HWND) getWindowHandle()); + + if (parent != 0) + { + SetWindowPos (parent, + HWND_TOP, + 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE); + } + } +#endif + + //============================================================================== + juce_UseDebuggingNewOperator +}; + +static VoidArray activePlugins; + + +//============================================================================== +/** + This wraps an AudioFilterBase as an AudioEffectX... +*/ +class JuceVSTWrapper : public AudioEffectX, + private Timer, + public AudioFilterBase::FilterNativeCallbacks +{ +public: + //============================================================================== + JuceVSTWrapper (audioMasterCallback audioMaster, + AudioFilterBase* const filter_) + : AudioEffectX (audioMaster, + filter_->getNumPrograms(), + filter_->getNumParameters()), + filter (filter_) + { + filter->numInputChannels = JucePlugin_MaxNumInputChannels; + filter->numOutputChannels = JucePlugin_MaxNumOutputChannels; + + filter_->initialiseInternal (this); + + editorComp = 0; + outgoingEvents = 0; + outgoingEventSize = 0; + chunkMemoryTime = 0; + isProcessing = false; + firstResize = true; + +#if JUCE_MAC || JUCE_LINUX + hostWindow = 0; +#endif + + cEffect.flags |= effFlagsHasEditor; + + setUniqueID ((int) (JucePlugin_VSTUniqueID)); + +#if JucePlugin_WantsMidiInput && ! JUCE_USE_VSTSDK_2_4 + wantEvents(); +#endif + + setNumInputs (filter->numInputChannels); + setNumOutputs (filter->numOutputChannels); + + canProcessReplacing (true); + +#if ! JUCE_USE_VSTSDK_2_4 + hasVu (false); + hasClip (false); +#endif + + isSynth ((JucePlugin_IsSynth) != 0); + noTail ((JucePlugin_SilenceInProducesSilenceOut) != 0); + setInitialDelay (JucePlugin_Latency); + programsAreChunks (true); + + VstPinProperties props; + + int i; + for (i = 0; i < filter->numInputChannels; ++i) + { + String s (i + 1); + + if (getInputProperties (i, &props)) + { + s = props.label; + + if (s.isEmpty()) + { + if ((props.flags & kVstPinIsStereo) != 0) + s = ((i & 1) == 0) ? T("left") : T("right"); + else + s = String (i + 1); + } + } + + filter->inputNames.add (s); + } + + for (i = 0; i < filter->numOutputChannels; ++i) + { + String s (i + 1); + + if (getOutputProperties (i, &props)) + { + s = props.label; + + if (s.isEmpty()) + { + if ((props.flags & kVstPinIsStereo) != 0) + s = ((i & 1) == 0) ? T("left") : T("right"); + else + s = String (i + 1); + } + } + + filter->outputNames.add (s); + } + + activePlugins.add (this); + } + + ~JuceVSTWrapper() + { + stopTimer(); + deleteEditor(); + + delete filter; + filter = 0; + + if (outgoingEvents != 0) + { + for (int i = outgoingEventSize; --i >= 0;) + juce_free (outgoingEvents->events[i]); + + juce_free (outgoingEvents); + outgoingEvents = 0; + } + + jassert (editorComp == 0); + + jassert (activePlugins.contains (this)); + activePlugins.removeValue (this); + +#if JUCE_MAC || JUCE_LINUX + if (activePlugins.size() == 0) + { +#if JUCE_LINUX + SharedMessageThread::deleteInstance(); +#endif + shutdownJuce_GUI(); + } +#endif + } + + void open() + { + startTimer (1000 / 4); + } + + void close() + { + jassert (! recursionCheck); + + stopTimer(); + deleteEditor(); + } + + //============================================================================== + bool getEffectName (char* name) + { + String (JucePlugin_Name).copyToBuffer (name, 64); + return true; + } + + bool getVendorString (char* text) + { + String (JucePlugin_Manufacturer).copyToBuffer (text, 64); + return true; + } + + bool getProductString (char* text) + { + return getEffectName (text); + } + + VstInt32 getVendorVersion() + { + return 1000; + } + + VstPlugCategory getPlugCategory() + { + return JucePlugin_VSTCategory; + } + + VstInt32 canDo (char* text) + { + VstInt32 result = 0; + + if (strcmp (text, "receiveVstEvents") == 0 + || strcmp (text, "receiveVstMidiEvents") == 0) + { +#if JucePlugin_WantsMidiInput + result = 1; +#else + result = -1; +#endif + } + else if (strcmp (text, "sendVstEvents") == 0 + || strcmp (text, "sendVstMidiEvent") == 0) + { +#if JucePlugin_ProducesMidiOutput + result = 1; +#else + result = -1; +#endif + } + else if (strcmp (text, "receiveVstTimeInfo") == 0) + { + result = 1; + } + else if (strcmp (text, "conformsToWindowRules") == 0) + { + result = 1; + } + + return result; + } + + bool keysRequired() + { + return (JucePlugin_EditorRequiresKeyboardFocus) != 0; + } + + //============================================================================== + VstInt32 processEvents (VstEvents* events) + { +#if JucePlugin_WantsMidiInput + for (int i = 0; i < events->numEvents; ++i) + { + const VstEvent* const e = events->events[i]; + + if (e != 0 && e->type == kVstMidiType) + { + const VstMidiEvent* const vme = (const VstMidiEvent*) e; + + midiEvents.addEvent ((const uint8*) vme->midiData, + 4, + vme->deltaFrames); + } + } + + return 1; +#else + return 0; +#endif + } + + void process (float** inputs, float** outputs, + const VstInt32 numSamples, const bool accumulate) + { + // if this fails, the host hasn't called resume() before processing + jassert (isProcessing); + + // (tragically, some hosts actually need this, although it's stupid to have + // to do it here..) + if (! isProcessing) + resume(); + +#if JUCE_DEBUG + const int numMidiEventsComingIn = midiEvents.getNumEvents(); +#endif + + jassert (activePlugins.contains (this)); + + { + const AudioSampleBuffer input (inputs, filter->numInputChannels, numSamples); + AudioSampleBuffer output (outputs, filter->numOutputChannels, numSamples); + + const ScopedLock sl (filter->getCallbackLock()); + + if (filter->suspended) + { + if (! accumulate) + output.clear(); + } + else + { + filter->processBlock (input, output, accumulate, midiEvents); + } + } + + if (! midiEvents.isEmpty()) + { +#if JucePlugin_ProducesMidiOutput + const int numEvents = midiEvents.getNumEvents(); + + ensureOutgoingEventSize (numEvents); + outgoingEvents->numEvents = 0; + + const uint8* midiEventData; + int midiEventSize, midiEventPosition; + MidiBuffer::Iterator i (midiEvents); + + while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) + { + if (midiEventSize <= 4) + { + VstMidiEvent* const vme = (VstMidiEvent*) outgoingEvents->events [outgoingEvents->numEvents++]; + + memcpy (vme->midiData, midiEventData, midiEventSize); + vme->deltaFrames = midiEventPosition; + + jassert (vme->deltaFrames >= 0 && vme->deltaFrames < numSamples); + } + } + + sendVstEventsToHost (outgoingEvents); +#else + /* This assertion is caused when you've added some events to the + midiMessages array in your processBlock() method, which usually means + that you're trying to send them somewhere. But in this case they're + getting thrown away. + + If your plugin does want to send midi messages, you'll need to set + the JucePlugin_ProducesMidiOutput macro to 1 in your + JucePluginCharacteristics.h file. + + If you don't want to produce any midi output, then you should clear the + midiMessages array at the end of your processBlock() method, to + indicate that you don't want any of the events to be passed through + to the output. + */ + jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); +#endif + + midiEvents.clear(); + } + } + + void process (float** inputs, float** outputs, VstInt32 numSamples) + { + process (inputs, outputs, numSamples, true); + } + + void processReplacing (float** inputs, float** outputs, VstInt32 numSamples) + { + process (inputs, outputs, numSamples, false); + } + + //============================================================================== + void resume() + { + isProcessing = true; + + filter->sampleRate = getSampleRate(); + + jassert (filter->sampleRate > 0); + if (filter->sampleRate <= 0) + filter->sampleRate = 44100.0; + + filter->blockSize = getBlockSize(); + jassert (filter->blockSize > 0); + + filter->prepareToPlay (filter->sampleRate, filter->blockSize); + midiEvents.clear(); + + AudioEffectX::resume(); + +#if JucePlugin_ProducesMidiOutput + ensureOutgoingEventSize (64); +#endif + +#if JucePlugin_WantsMidiInput && ! JUCE_USE_VSTSDK_2_4 + wantEvents(); +#endif + } + + void suspend() + { + AudioEffectX::suspend(); + + filter->releaseResources(); + midiEvents.clear(); + + isProcessing = false; + } + + bool JUCE_CALLTYPE getCurrentPositionInfo (AudioFilterBase::CurrentPositionInfo& info) + { + const VstTimeInfo* const ti = getTimeInfo (kVstPpqPosValid + | kVstTempoValid + | kVstBarsValid + //| kVstCyclePosValid + | kVstTimeSigValid + | kVstSmpteValid + | kVstClockValid); + + if (ti == 0 || ti->sampleRate <= 0) + return false; + + if ((ti->flags & kVstTempoValid) != 0) + info.bpm = ti->tempo; + else + info.bpm = 0.0; + + if ((ti->flags & kVstTimeSigValid) != 0) + { + info.timeSigNumerator = ti->timeSigNumerator; + info.timeSigDenominator = ti->timeSigDenominator; + } + else + { + info.timeSigNumerator = 4; + info.timeSigDenominator = 4; + } + + info.timeInSeconds = ti->samplePos / ti->sampleRate; + + if ((ti->flags & kVstPpqPosValid) != 0) + info.ppqPosition = ti->ppqPos; + else + info.ppqPosition = 0.0; + + if ((ti->flags & kVstBarsValid) != 0) + info.ppqPositionOfLastBarStart = ti->barStartPos; + else + info.ppqPositionOfLastBarStart = 0.0; + + if ((ti->flags & kVstSmpteValid) != 0) + { + info.frameRate = (AudioFilterBase::CurrentPositionInfo::FrameRateType) (int) ti->smpteFrameRate; + + const double fpsDivisors[] = { 24.0, 25.0, 30.0, 30.0, 30.0, 30.0, 1.0 }; + info.editOriginTime = (ti->smpteOffset / (80.0 * fpsDivisors [(int) info.frameRate])); + } + else + { + info.frameRate = AudioFilterBase::CurrentPositionInfo::fpsUnknown; + info.editOriginTime = 0; + } + + info.isRecording = (ti->flags & kVstTransportRecording) != 0; + info.isPlaying = (ti->flags & kVstTransportPlaying) != 0 || info.isRecording; + + return true; + } + + //============================================================================== + VstInt32 getProgram() + { + return filter->getCurrentProgram(); + } + + void setProgram (VstInt32 program) + { + filter->setCurrentProgram (program); + } + + void setProgramName (char* name) + { + filter->changeProgramName (filter->getCurrentProgram(), name); + } + + void getProgramName (char* name) + { + filter->getProgramName (filter->getCurrentProgram()).copyToBuffer (name, 24); + } + + bool getProgramNameIndexed (VstInt32 category, VstInt32 index, char* text) + { + if (index >= 0 && index < filter->getNumPrograms()) + { + filter->getProgramName (index).copyToBuffer (text, 24); + return true; + } + + return false; + } + + //============================================================================== + float getParameter (VstInt32 index) + { + jassert (index >= 0 && index < filter->getNumParameters()); + return filter->getParameter (index); + } + + void setParameter (VstInt32 index, float value) + { + jassert (index >= 0 && index < filter->getNumParameters()); + filter->setParameter (index, value); + } + + void getParameterDisplay (VstInt32 index, char* text) + { + jassert (index >= 0 && index < filter->getNumParameters()); + filter->getParameterText (index).copyToBuffer (text, 64); + } + + void getParameterName (VstInt32 index, char* text) + { + jassert (index >= 0 && index < filter->getNumParameters()); + filter->getParameterName (index).copyToBuffer (text, 8); + } + + void JUCE_CALLTYPE informHostOfParameterChange (int index, float newValue) + { + setParameterAutomated (index, newValue); + } + + //============================================================================== + VstInt32 getChunk (void** data, bool onlyStoreCurrentProgramData) + { + chunkMemory.setSize (0); + if (onlyStoreCurrentProgramData) + filter->getCurrentProgramStateInformation (chunkMemory); + else + filter->getStateInformation (chunkMemory); + + *data = (void*) chunkMemory; + + // because the chunk is only needed temporarily by the host (or at least you'd + // hope so) we'll give it a while and then free it in the timer callback. + chunkMemoryTime = JUCE_NAMESPACE::Time::getApproximateMillisecondCounter(); + + return chunkMemory.getSize(); + } + + VstInt32 setChunk (void* data, VstInt32 byteSize, bool onlyRestoreCurrentProgramData) + { + chunkMemory.setSize (0); + chunkMemoryTime = 0; + + if (byteSize > 0 && data != 0) + { + if (onlyRestoreCurrentProgramData) + filter->setCurrentProgramStateInformation (data, byteSize); + else + filter->setStateInformation (data, byteSize); + } + + return 0; + } + + void timerCallback() + { + if (chunkMemoryTime > 0 + && chunkMemoryTime < JUCE_NAMESPACE::Time::getApproximateMillisecondCounter() - 2000 + && ! recursionCheck) + { + chunkMemoryTime = 0; + chunkMemory.setSize (0); + } + + tryMasterIdle(); + } + + void tryMasterIdle() + { + if (Component::isMouseButtonDownAnywhere() + && ! recursionCheck) + { + const uint32 now = JUCE_NAMESPACE::Time::getMillisecondCounter(); + + if (now > lastMasterIdleCall + 20 && editorComp != 0) + { + lastMasterIdleCall = now; + + recursionCheck = true; + masterIdle(); + recursionCheck = false; + } + } + } + + void doIdleCallback() + { + if (! recursionCheck) + { + const MessageManagerLock mml; + + recursionCheck = true; + + juce_callAnyTimersSynchronously(); + + for (int i = ComponentPeer::getNumPeers(); --i >= 0;) + ComponentPeer::getPeer (i)->performAnyPendingRepaintsNow(); + + recursionCheck = false; + } + } + + void createEditorComp() + { + if (editorComp == 0) + { +#if JUCE_LINUX + const MessageManagerLock mml; +#endif + + AudioFilterEditor* const ed = filter->createEditorIfNeeded(); + + if (ed != 0) + { + ed->setOpaque (true); + ed->setVisible (true); + + editorComp = new EditorCompWrapper (this, ed); + } + } + } + + void deleteEditor() + { + PopupMenu::dismissAllActiveMenus(); + + jassert (! recursionCheck); + recursionCheck = true; + +#if JUCE_LINUX + const MessageManagerLock mml; +#endif + + Component* modalComponent = Component::getCurrentlyModalComponent(); + if (modalComponent != 0) + modalComponent->exitModalState (0); + + if (editorComp != 0) + { + filter->editorBeingDeleted (editorComp->getEditorComp()); + + deleteAndZero (editorComp); + } + +#if JUCE_MAC || JUCE_LINUX + hostWindow = 0; +#endif + + recursionCheck = false; + + // there's some kind of component currently modal, but the host + // is trying to delete our plugin. You should try to avoid this happening.. + jassert (Component::getCurrentlyModalComponent() == 0); + } + + VstIntPtr dispatcher (VstInt32 opCode, VstInt32 index, VstIntPtr value, void* ptr, float opt) + { + if (opCode == effEditIdle) + { + doIdleCallback(); + return 0; + } + else if (opCode == effEditOpen) + { + jassert (! recursionCheck); + + deleteEditor(); + createEditorComp(); + + if (editorComp != 0) + { +#if JUCE_LINUX + const MessageManagerLock mml; +#endif + + editorComp->setOpaque (true); + editorComp->setVisible (false); + +#if JUCE_WIN32 + editorComp->addToDesktop (0); + + hostWindow = (HWND) ptr; + HWND editorWnd = (HWND) editorComp->getWindowHandle(); + + SetParent (editorWnd, hostWindow); + + DWORD val = GetWindowLong (editorWnd, GWL_STYLE); + val = (val & ~WS_POPUP) | WS_CHILD; + SetWindowLong (editorWnd, GWL_STYLE, val); + + editorComp->setVisible (true); +#elif JUCE_LINUX + editorComp->addToDesktop (0); + + hostWindow = (Window) ptr; + + Window editorWnd = (Window) editorComp->getWindowHandle(); + + XReparentWindow (display, editorWnd, hostWindow, 0, 0); + + editorComp->setVisible (true); +#else + hostWindow = (WindowRef) ptr; + firstResize = true; + + SetAutomaticControlDragTrackingEnabledForWindow (hostWindow, true); + + WindowAttributes attributes; + GetWindowAttributes (hostWindow, &attributes); + + HIViewRef parentView = 0; + + if ((attributes & kWindowCompositingAttribute) != 0) + { + HIViewRef root = HIViewGetRoot (hostWindow); + HIViewFindByID (root, kHIViewWindowContentID, &parentView); + + if (parentView == 0) + parentView = root; + } + else + { + GetRootControl (hostWindow, (ControlRef*) &parentView); + + if (parentView == 0) + CreateRootControl (hostWindow, (ControlRef*) &parentView); + } + + jassert (parentView != 0); // agh - the host has to provide a compositing window.. + + editorComp->setVisible (true); + editorComp->addToDesktop (0, (void*) parentView); +#endif + + return 1; + } + } + else if (opCode == effEditClose) + { + deleteEditor(); + return 0; + } + else if (opCode == effEditGetRect) + { + createEditorComp(); + + if (editorComp != 0) + { + editorSize.left = 0; + editorSize.top = 0; + editorSize.right = editorComp->getWidth(); + editorSize.bottom = editorComp->getHeight(); + + *((ERect**) ptr) = &editorSize; + + return (VstIntPtr) &editorSize; + } + else + { + return 0; + } + } + + return AudioEffectX::dispatcher (opCode, index, value, ptr, opt); + } + + void resizeHostWindow (int newWidth, int newHeight) + { + if (editorComp != 0) + { +#if ! JUCE_LINUX // linux hosts shouldn't be trusted! + if (! (canHostDo ("sizeWindow") && sizeWindow (newWidth, newHeight))) +#endif + { + // some hosts don't support the sizeWindow call, so do it manually.. +#if JUCE_MAC + Rect r; + GetWindowBounds (hostWindow, kWindowContentRgn, &r); + + if (firstResize) + { + diffW = (r.right - r.left) - editorComp->getWidth(); + diffH = (r.bottom - r.top) - editorComp->getHeight(); + firstResize = false; + } + + r.right = r.left + newWidth + diffW; + r.bottom = r.top + newHeight + diffH; + + SetWindowBounds (hostWindow, kWindowContentRgn, &r); + + r.bottom -= r.top; + r.right -= r.left; + r.left = r.top = 0; + InvalWindowRect (hostWindow, &r); +#elif JUCE_LINUX + Window root; + int x, y; + unsigned int width, height, border, depth; + + XGetGeometry (display, hostWindow, &root, + &x, &y, &width, &height, &border, &depth); + + newWidth += (width + border) - editorComp->getWidth(); + newHeight += (height + border) - editorComp->getHeight(); + + XResizeWindow (display, hostWindow, newWidth, newHeight); +#else + int dw = 0; + int dh = 0; + const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); + + HWND w = (HWND) editorComp->getWindowHandle(); + + while (w != 0) + { + HWND parent = GetParent (w); + + if (parent == 0) + break; + + TCHAR windowType [32]; + zeromem (windowType, sizeof (windowType)); + GetClassName (parent, windowType, 31); + + if (String (windowType).equalsIgnoreCase (T("MDIClient"))) + break; + + RECT windowPos; + GetWindowRect (w, &windowPos); + + RECT parentPos; + GetWindowRect (parent, &parentPos); + + SetWindowPos (w, 0, 0, 0, + newWidth + dw, + newHeight + dh, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); + + dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); + dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); + + w = parent; + + if (dw == 2 * frameThickness) + break; + + if (dw > 100 || dh > 100) + w = 0; + } + + if (w != 0) + SetWindowPos (w, 0, 0, 0, + newWidth + dw, + newHeight + dh, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); +#endif + } + + if (editorComp->getPeer() != 0) + editorComp->getPeer()->handleMovedOrResized(); + } + } + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + AudioFilterBase* filter; + juce::MemoryBlock chunkMemory; + uint32 chunkMemoryTime; + EditorCompWrapper* editorComp; + ERect editorSize; + MidiBuffer midiEvents; + VstEvents* outgoingEvents; + int outgoingEventSize; + bool isProcessing; + bool firstResize; + int diffW, diffH; + + void ensureOutgoingEventSize (int numEvents) + { + if (outgoingEventSize < numEvents) + { + numEvents += 32; + const int size = 16 + sizeof (VstEvent*) * numEvents; + + if (outgoingEvents == 0) + outgoingEvents = (VstEvents*) juce_calloc (size); + else + outgoingEvents = (VstEvents*) juce_realloc (outgoingEvents, size); + + for (int i = outgoingEventSize; i < numEvents; ++i) + { + VstMidiEvent* const e = (VstMidiEvent*) juce_calloc (sizeof (VstMidiEvent)); + e->type = kVstMidiType; + e->byteSize = 24; + + outgoingEvents->events[i] = (VstEvent*) e; + } + + outgoingEventSize = numEvents; + } + } + + const String getHostName() + { + char host[256]; + zeromem (host, sizeof (host)); + getHostProductString (host); + return host; + } + +#if JUCE_MAC + WindowRef hostWindow; +#elif JUCE_LINUX + Window hostWindow; +#else + HWND hostWindow; +#endif +}; + +//============================================================================== +void EditorCompWrapper::childBoundsChanged (Component* child) +{ + child->setTopLeftPosition (0, 0); + + const int cw = child->getWidth(); + const int ch = child->getHeight(); + + wrapper->resizeHostWindow (cw, ch); + setSize (cw, ch); + +#if JUCE_MAC + wrapper->resizeHostWindow (cw, ch); // (doing this a second time seems to be necessary in tracktion) +#endif +} + +void EditorCompWrapper::handleAsyncUpdate() +{ + wrapper->tryMasterIdle(); +} + +//============================================================================== +static AEffect* pluginEntryPoint (audioMasterCallback audioMaster) +{ + MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (0); + + try + { + if (audioMaster (0, audioMasterVersion, 0, 0, 0, 0) != 0) + { + AudioFilterBase* const filter = createPluginFilter(); + + if (filter != 0) + { + JuceVSTWrapper* const wrapper = new JuceVSTWrapper (audioMaster, filter); + return wrapper->getAeffect(); + } + } + } + catch (...) + {} + + return 0; +} + +//============================================================================== +// Mac startup code.. +#if JUCE_MAC + +extern "C" __attribute__((visibility("default"))) AEffect* main_macho (audioMasterCallback audioMaster) +{ + initialiseJuce_GUI(); + return pluginEntryPoint (audioMaster); +} + +//============================================================================== +// Linux startup code.. +#elif JUCE_LINUX + +extern "C" AEffect* main_plugin (audioMasterCallback audioMaster) asm ("main"); + +extern "C" AEffect* main_plugin (audioMasterCallback audioMaster) +{ + initialiseJuce_GUI(); + + SharedMessageThread::getInstance (); + + return pluginEntryPoint (audioMaster); +} + +__attribute__((constructor)) void myPluginInit() +{ + // don't put initialiseJuce_GUI here... it will crash ! +} + +__attribute__((destructor)) void myPluginFini() +{ + // don't put shutdownJuce_GUI here... it will crash ! +} + +//============================================================================== +// Win32 startup code.. +#else + +__declspec(dllexport) void* main (audioMasterCallback audioMaster) +{ + return (void*) pluginEntryPoint (audioMaster); +} + +BOOL WINAPI DllMain (HINSTANCE instance, DWORD dwReason, LPVOID) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + PlatformUtilities::setCurrentModuleInstanceHandle (instance); + initialiseJuce_GUI(); + } + else if (dwReason == DLL_PROCESS_DETACH) + { + shutdownJuce_GUI(); + } + + return TRUE; +} + +#endif diff --git a/extras/audio plugins/wrapper/juce_AudioFilterBase.cpp b/extras/audio plugins/wrapper/juce_AudioFilterBase.cpp new file mode 100644 index 0000000000..2b2d8f36f9 --- /dev/null +++ b/extras/audio plugins/wrapper/juce_AudioFilterBase.cpp @@ -0,0 +1,173 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_AudioFilterBase.h" + + +//============================================================================== +AudioFilterBase::AudioFilterBase() + : suspended (false), + numInputChannels (0), + numOutputChannels (0), + callbacks (0), + activeEditor (0) +{ + sampleRate = 0.0; + blockSize = 0; +} + +AudioFilterBase::~AudioFilterBase() +{ + // ooh, nasty - the editor should have been deleted before the filter + // that it refers to is deleted.. + jassert (activeEditor == 0); +} + +void AudioFilterBase::initialiseInternal (FilterNativeCallbacks* const callbacks_) +{ + callbacks = callbacks_; +} + +void AudioFilterBase::setParameterNotifyingHost (const int parameterIndex, + const float newValue) +{ + jassert (parameterIndex >= 0 && parameterIndex < getNumParameters()); + + if (callbacks != 0) + callbacks->informHostOfParameterChange (parameterIndex, newValue); + else + setParameter (parameterIndex, newValue); +} + +void AudioFilterBase::suspendProcessing (const bool shouldBeSuspended) +{ + const ScopedLock sl (callbackLock); + suspended = shouldBeSuspended; +} + +//============================================================================== +bool AudioFilterBase::getCurrentPositionInfo (CurrentPositionInfo& info) +{ + return callbacks != 0 + && callbacks->getCurrentPositionInfo (info); +} + +const String AudioFilterBase::getInputChannelName (const int channelIndex) const +{ + String s (inputNames [channelIndex]); + return s.isNotEmpty() ? s : String (channelIndex + 1); +} + +const String AudioFilterBase::getOutputChannelName (const int channelIndex) const +{ + String s (outputNames [channelIndex]); + return s.isNotEmpty() ? s : String (channelIndex + 1); +} + +//============================================================================== +void AudioFilterBase::editorBeingDeleted (AudioFilterEditor* const editor) +{ + const ScopedLock sl (callbackLock); + + jassert (activeEditor == editor); + + if (activeEditor == editor) + activeEditor = 0; +} + +AudioFilterEditor* AudioFilterBase::createEditorIfNeeded() +{ + if (activeEditor != 0) + return activeEditor; + + AudioFilterEditor* const ed = createEditor(); + + if (ed != 0) + { + // you must give your editor comp a size before returning it.. + jassert (ed->getWidth() > 0 && ed->getHeight() > 0); + + const ScopedLock sl (callbackLock); + activeEditor = ed; + } + + return ed; +} + +//============================================================================== +void AudioFilterBase::getCurrentProgramStateInformation (JUCE_NAMESPACE::MemoryBlock& destData) +{ + getStateInformation (destData); +} + +void AudioFilterBase::setCurrentProgramStateInformation (const void* data, int sizeInBytes) +{ + setStateInformation (data, sizeInBytes); +} + +//============================================================================== +// magic number to identify memory blocks that we've stored as XML +const uint32 magicXmlNumber = 0x21324356; + +void AudioFilterBase::copyXmlToBinary (const XmlElement& xml, + JUCE_NAMESPACE::MemoryBlock& destData) +{ + const String xmlString (xml.createDocument (String::empty, true, false)); + const int stringLength = xmlString.length(); + + destData.setSize (stringLength + 10); + + char* const d = (char*) destData.getData(); + *(uint32*) d = swapIfBigEndian ((const uint32) magicXmlNumber); + *(uint32*) (d + 4) = swapIfBigEndian ((const uint32) stringLength); + + xmlString.copyToBuffer (d + 8, stringLength); +} + +XmlElement* AudioFilterBase::getXmlFromBinary (const void* data, + const int sizeInBytes) +{ + if (sizeInBytes > 8 + && littleEndianInt ((const char*) data) == magicXmlNumber) + { + const uint32 stringLength = littleEndianInt (((const char*) data) + 4); + + if (stringLength > 0) + { + XmlDocument doc (String (((const char*) data) + 8, + jmin ((sizeInBytes - 8), stringLength))); + + return doc.getDocumentElement(); + } + } + + return 0; +} diff --git a/extras/audio plugins/wrapper/juce_AudioFilterBase.h b/extras/audio plugins/wrapper/juce_AudioFilterBase.h new file mode 100644 index 0000000000..e9d3b61357 --- /dev/null +++ b/extras/audio plugins/wrapper/juce_AudioFilterBase.h @@ -0,0 +1,536 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_AUDIOFILTERBASE_JUCEHEADER__ +#define __JUCE_AUDIOFILTERBASE_JUCEHEADER__ + +#ifdef _MSC_VER + #pragma pack (push, 8) +#endif + +#include "../../../juce.h" +#include "juce_AudioFilterEditor.h" +#undef MemoryBlock + +//============================================================================== +/** + Base class for plugins written using JUCE. + + This is intended to act as a base class of plugin that is general enough to + be wrapped as a VST, AU, RTAS, etc. + + Derive your filter class from this base class, and implement a global function + called initialiseFilterInfo() which creates and returns a new instance of + your subclass. +*/ +class AudioFilterBase +{ +protected: + //============================================================================== + /** Constructor. + + You can also do your initialisation tasks in the initialiseFilterInfo() + call, which will be made after this object has been created. + */ + AudioFilterBase(); + +public: + /** Destructor. */ + virtual ~AudioFilterBase(); + + //============================================================================== + /** Called before playback starts, to let the plugin prepare itself. + + The sample rate is the target sample rate, and will remain constant until + playback stops. + + The estimatedSamplesPerBlock value is a HINT about the typical number of + samples that will be processed for each callback, but isn't any kind + of guarantee. The actual block sizes that the host uses may be different + each time the callback happens, and may be more or less than this value. + */ + virtual void JUCE_CALLTYPE prepareToPlay (double sampleRate, + int estimatedSamplesPerBlock) = 0; + + /** Called after playback has stopped, to let the plugin free up any resources it + no longer needs. + */ + virtual void JUCE_CALLTYPE releaseResources() = 0; + + /** Renders the next block. + + The input and output buffers will have been prepared with the number of samples + and channels required, and mustn't be resized. Note that these may both point to + the same block of memory if accumulateOutput is true. There will always be the + same number of samples in the input and output buffers, but the number of channels + may not be the same. + + If accumulateOutput is true, then the output buffer will contain a copy of the + input buffer (or may be physically the same memory - be careful!), and your filter's + output should be added to (or may replace) whatever samples are already in the + output buffer. + + If accumulateOutput is false then the contents of the output buffer are undefined + and MUST ALL be overwritten with your plugin's output. + + Note that the number of samples in these buffers is NOT guaranteed to be + the same for every callback, and may be more or less than the estimated value + given to prepareToPlay(). Your code must be able to cope with variable-sized + blocks, or you're going to get clicks and crashes! + + Your plugin must also not make any assumptions about the number of channels + supplied in the input and output buffers - there could be any number of channels + here, up to the maximum values specified in your JucePluginCharacteristics.h file. + However, the number of channels will remain constant between the prepareToPlay() + and releaseResources() calls. + + If the plugin has indicated that it needs midi input, then the midiMessages + array will be filled with midi messages for this block. Each message's timestamp + will indicate the message's time, as a number of samples from the start of the + block. + + If the plugin has indicated that it produces midi output, then any messages remaining + in the midiMessages array will be sent to the host after the processBlock method + returns. This means that the plugin must be careful to clear any incoming messages + out of the array if it doesn't want them to be passed-on. + + Be very careful about what you do in this callback - it's going to be called by + the audio thread, so any kind of interaction with the UI is absolutely + out of the question. If you change a parameter in here and need to tell your UI to + update itself, the best way is probably to inherit from a ChangeBroadcaster, let + the UI components register as listeners, and then call sendChangeMessage() inside the + processBlock() method to send out an asynchronous message. You could also use + the AsyncUpdater class in a similar way. + */ + virtual void JUCE_CALLTYPE processBlock (const AudioSampleBuffer& input, + AudioSampleBuffer& output, + const bool accumulateOutput, + MidiBuffer& midiMessages) = 0; + + //============================================================================== + /** Structure containing details of the playback position. + + @see AudioFilterBase::getCurrentPositionInfo + */ + struct CurrentPositionInfo + { + /** The tempo in BPM */ + double bpm; + + /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ + int timeSigNumerator; + /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ + int timeSigDenominator; + + /** The current play position, in seconds from the start of the edit. */ + double timeInSeconds; + + /** For timecode, the position of the start of the edit, in seconds from 00:00:00:00. */ + double editOriginTime; + + /** The current play position in pulses-per-quarter-note. + + This is the number of quarter notes since the edit start. + */ + double ppqPosition; + + /** The position of the start of the last bar, in pulses-per-quarter-note. + + This is the number of quarter notes from the start of the edit to the + start of the current bar. + + Note - this value may be unavailable on some hosts, e.g. Pro-Tools. If + it's not available, the value will be 0. + */ + double ppqPositionOfLastBarStart; + + /** Frame rate types */ + enum FrameRateType + { + fps24 = 0, + fps25 = 1, + fps2997 = 2, + fps30 = 3, + fps2997drop = 4, + fps30drop = 5, + fpsUnknown = 99 + }; + + /** The video frame rate, if applicable. */ + FrameRateType frameRate; + + /** True if the transport is currently playing. */ + bool isPlaying; + + /** True if the transport is currently recording. + + (When isRecording is true, then isPlaying will also be true). + */ + bool isRecording; + }; + + /** Asks the host to return the current playback position. + + You can call this from your processBlock() method to get info about + the time of the start of the block currently being processed. + + If the host can't supply this for some reason, this will return false, otherwise + it'll fill in the structure passed in. + */ + bool JUCE_CALLTYPE getCurrentPositionInfo (CurrentPositionInfo& info); + + /** Returns the current sample rate. + + This can be called from your processBlock() method - it's not guaranteed + to be valid at any other time, and may return 0 if it's unknown. + */ + double JUCE_CALLTYPE getSampleRate() const throw() { return sampleRate; } + + /** Returns the current typical block size that is being used. + + This can be called from your processBlock() method - it's not guaranteed + to be valid at any other time. + + Remember it's not the ONLY block size that may be used when calling + processBlock, it's just the normal one. The actual block sizes used may be + larger or smaller than this, and will vary between successive calls. + */ + int JUCE_CALLTYPE getBlockSize() const throw() { return blockSize; } + + /** Returns the number of input channels that the host will be sending the filter. + + In your JucePluginCharacteristics.h file, you specify the number of channels + that your plugin would prefer to get, and this method lets you know how + many the host is actually going to send. + + Note that this method is only valid during or after the prepareToPlay() + method call. Until that point, the number of channels will be unknown. + */ + int JUCE_CALLTYPE getNumInputChannels() const throw() { return numInputChannels; } + + /** Returns the number of output channels that the host will be sending the filter. + + In your JucePluginCharacteristics.h file, you specify the number of channels + that your plugin would prefer to get, and this method lets you know how + many the host is actually going to send. + + Note that this method is only valid during or after the prepareToPlay() + method call. Until that point, the number of channels will be unknown. + */ + int JUCE_CALLTYPE getNumOutputChannels() const throw() { return numOutputChannels; } + + /** Returns the name of one of the input channels, as returned by the host. + + The host might not supply very useful names for channels, and this might be + something like "1", "2", "left", "right", etc. + */ + const String getInputChannelName (const int channelIndex) const; + + /** Returns the name of one of the output channels, as returned by the host. + + The host might not supply very useful names for channels, and this might be + something like "1", "2", "left", "right", etc. + */ + const String getOutputChannelName (const int channelIndex) const; + + //============================================================================== + /** This returns a critical section that will automatically be locked while the host + is calling the processBlock() method. + + Use it from your UI or other threads to lock access to variables that are used + by the process callback, but obviously be careful not to keep it locked for + too long, because that could cause stuttering playback. If you need to do something + that'll take a long time and need the processing to stop while it happens, use the + suspendProcessing() method instead. + + @see suspendProcessing + */ + const CriticalSection& JUCE_CALLTYPE getCallbackLock() const throw() { return callbackLock; } + + /** Enables and disables the processing callback. + + If you need to do something time-consuming on a thread and would like to make sure + the audio processing callback doesn't happen until you've finished, use this + to disable the callback and re-enable it again afterwards. + + E.g. + @code + void loadNewPatch() + { + suspendProcessing (true); + + ..do something that takes ages.. + + suspendProcessing (false); + } + @endcode + + If the host tries to make an audio callback while processing is suspended, the + filter will return an empty buffer, but won't block the audio thread like it would + do if you use the getCallbackLock() critical section to synchronise access. + + @see getCallbackLock + */ + void JUCE_CALLTYPE suspendProcessing (const bool shouldBeSuspended); + + //============================================================================== + /** Creates the plugin's UI. + + This can return 0 if you want a UI-less plugin. Otherwise, the component should + be created and set to the size you want it to be before returning it. + + Remember not to do anything silly like allowing your plugin to keep a pointer to + the component that gets created - this may be deleted later without any warning, so + that pointer could become a dangler. Use the getActiveEditor() method instead. + + The correct way to handle the connection between an editor component and its + plugin is to use something like a ChangeBroadcaster so that the editor can + register itself as a listener, and be told when a change occurs. This lets them + safely unregister themselves when they are deleted. + + Here are a few assumptions to bear in mind when writing an editor: + + - Initially there won't be an editor, until the user opens one, or they might + not open one at all. Your plugin mustn't rely on it being there. + - An editor object may be deleted and a replacement one created again at any time. + - It's safe to assume that an editor will be deleted before its filter. + */ + virtual AudioFilterEditor* JUCE_CALLTYPE createEditor() = 0; + + //============================================================================== + /** Returns the active editor, if there is one. + + Bear in mind this can return 0, even if an editor has previously been + opened. + */ + AudioFilterEditor* JUCE_CALLTYPE getActiveEditor() const throw() { return activeEditor; } + + /** Returns the active editor, or if there isn't one, it will create one. + + This may call createEditor() internally to create the component. + */ + AudioFilterEditor* JUCE_CALLTYPE createEditorIfNeeded(); + + //============================================================================== + /** This must return the correct value immediately after the object has been + created, and mustn't change the number of parameters later. + */ + virtual int JUCE_CALLTYPE getNumParameters() = 0; + + /** Returns the name of a particular parameter. */ + virtual const String JUCE_CALLTYPE getParameterName (int parameterIndex) = 0; + + /** Called by the host to find out the value of one of the plugin's parameters. + + This could be called quite frequently, so try to make your code efficient. + */ + virtual float JUCE_CALLTYPE getParameter (int parameterIndex) = 0; + + /** Returns the value of a parameter as a text string. */ + virtual const String JUCE_CALLTYPE getParameterText (int parameterIndex) = 0; + + /** The host will call this method to change the value of one of the plugin's parameters. + + The host may call this at any time, including during the audio processing + callback, so the plugin has to process this very fast and avoid blocking. + + If you want to set the value of a parameter internally, e.g. from your + plugin editor, then don't call this directly - instead, use the + setParameterNotifyingHost() method, which will also send a message to + the host telling it about the change. If the message isn't sent, the host + won't be able to automate your parameters properly. + */ + virtual void JUCE_CALLTYPE setParameter (int parameterIndex, + float newValue) = 0; + + /** Your plugin can call this when it needs to change one of its parameters. + + This could happen when the editor or some other internal operation changes + a parameter. This method will call the setParamete() method to change the + value, and will then send a message to the host telling it about the change. + */ + void JUCE_CALLTYPE setParameterNotifyingHost (int parameterIndex, + float newValue); + + //============================================================================== + /** Returns the number of preset programs the plugin supports. + + The value returned must be valid as soon as this object is created, and + must not change over its lifetime. + + This value shouldn't be less than 1. + */ + virtual int JUCE_CALLTYPE getNumPrograms() = 0; + + /** Returns the number of the currently active program. + */ + virtual int JUCE_CALLTYPE getCurrentProgram() = 0; + + /** Called by the host to change the current program. + */ + virtual void JUCE_CALLTYPE setCurrentProgram (int index) = 0; + + /** Must return the name of a given program. */ + virtual const String JUCE_CALLTYPE getProgramName (int index) = 0; + + /** Called by the host to rename a program. + */ + virtual void JUCE_CALLTYPE changeProgramName (int index, const String& newName) = 0; + + //============================================================================== + /** The host will call this method when it wants to save the plugin's internal state. + + This must copy any info about the plugin's state into the block of memory provided, + so that the host can store this and later restore it using setStateInformation(). + + Note that there's also a getCurrentProgramStateInformation() method, which only + stores the current program, not the state of the entire filter. + + See also the helper function copyXmlToBinary() for storing settings as XML. + + @see getCurrentProgramStateInformation + */ + virtual void JUCE_CALLTYPE getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData) = 0; + + /** The host will call this method if it wants to save the state of just the plugin's + current program. + + Unlike getStateInformation, this should only return the current program's state. + + Not all hosts support this, and if you don't implement it, the base class + method just calls getStateInformation() instead. If you do implement it, be + sure to also implement getCurrentProgramStateInformation. + + @see getStateInformation, setCurrentProgramStateInformation + */ + virtual void JUCE_CALLTYPE getCurrentProgramStateInformation (JUCE_NAMESPACE::MemoryBlock& destData); + + /** This must restore the plugin's state from a block of data previously created + using getStateInformation(). + + Note that there's also a setCurrentProgramStateInformation() method, which tries + to restore just the current program, not the state of the entire filter. + + See also the helper function getXmlFromBinary() for loading settings as XML. + + @see setCurrentProgramStateInformation + */ + virtual void JUCE_CALLTYPE setStateInformation (const void* data, int sizeInBytes) = 0; + + /** The host will call this method if it wants to restore the state of just the plugin's + current program. + + Not all hosts support this, and if you don't implement it, the base class + method just calls setStateInformation() instead. If you do implement it, be + sure to also implement getCurrentProgramStateInformation. + + @see setStateInformation, getCurrentProgramStateInformation + */ + virtual void JUCE_CALLTYPE setCurrentProgramStateInformation (const void* data, int sizeInBytes); + + + //============================================================================== + /** @internal */ + class FilterNativeCallbacks + { + public: + virtual ~FilterNativeCallbacks() {} + virtual bool JUCE_CALLTYPE getCurrentPositionInfo (CurrentPositionInfo& info) = 0; + virtual void JUCE_CALLTYPE informHostOfParameterChange (int index, float newValue) = 0; + }; + + + //============================================================================== + /** Not for public use - this is called by the wrapper code before deleting an + editor component. + */ + void JUCE_CALLTYPE editorBeingDeleted (AudioFilterEditor* const editor); + + /** Not for public use - this is called by the wrapper code to initialised the + filter. + */ + void JUCE_CALLTYPE initialiseInternal (FilterNativeCallbacks* const); + + //============================================================================== + juce_UseDebuggingNewOperator + +protected: + //============================================================================== + /** Helper function that just converts an xml element into a binary blob. + + Use this in your plugin's getStateInformation() method if you want to + store its state as xml. + + Then use getXmlFromBinary() to reverse this operation and retrieve the XML + from a binary blob. + */ + static void JUCE_CALLTYPE copyXmlToBinary (const XmlElement& xml, + JUCE_NAMESPACE::MemoryBlock& destData); + + /** Retrieves an XML element that was stored as binary with the copyXmlToBinary() method. + + This might return 0 if the data's unsuitable or corrupted. Otherwise it will return + an XmlElement object that the caller must delete when no longer needed. + */ + static XmlElement* JUCE_CALLTYPE getXmlFromBinary (const void* data, + const int sizeInBytes); + +private: + friend class JuceVSTWrapper; + friend class JuceAU; + friend class JuceAUView; + friend class AudioFilterEditor; + friend class AudioFilterStreamer; + friend class JucePlugInProcess; + + CriticalSection callbackLock; + bool suspended; + double sampleRate; + int blockSize, numInputChannels, numOutputChannels; + StringArray outputNames, inputNames; + + FilterNativeCallbacks* callbacks; + + AudioFilterEditor* activeEditor; +}; + +//============================================================================== +/** Somewhere in the code for an actual plugin, you need to implement this function + and make it create an instance of the plugin subclass that you're building. +*/ +extern AudioFilterBase* JUCE_CALLTYPE createPluginFilter(); + +#ifdef _MSC_VER + #pragma pack (pop) +#endif + + +#endif // __JUCE_AUDIOFILTERBASE_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/juce_AudioFilterEditor.cpp b/extras/audio plugins/wrapper/juce_AudioFilterEditor.cpp new file mode 100644 index 0000000000..74d68c7063 --- /dev/null +++ b/extras/audio plugins/wrapper/juce_AudioFilterEditor.cpp @@ -0,0 +1,49 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_AudioFilterEditor.h" +#include "juce_AudioFilterBase.h" + + +//============================================================================== +AudioFilterEditor::AudioFilterEditor (AudioFilterBase* const ownerFilter_) + : ownerFilter (ownerFilter_) +{ + // the filter must be valid.. + jassert (ownerFilter != 0); +} + +AudioFilterEditor::~AudioFilterEditor() +{ + // if this fails, then the wrapper hasn't called editorBeingDeleted() on the + // filter for some reason.. + jassert (ownerFilter->activeEditor != this); +} diff --git a/extras/audio plugins/wrapper/juce_AudioFilterEditor.h b/extras/audio plugins/wrapper/juce_AudioFilterEditor.h new file mode 100644 index 0000000000..6e2e3016e2 --- /dev/null +++ b/extras/audio plugins/wrapper/juce_AudioFilterEditor.h @@ -0,0 +1,79 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_AUDIOFILTEREDITOR_JUCEHEADER__ +#define __JUCE_AUDIOFILTEREDITOR_JUCEHEADER__ + +#ifdef _MSC_VER + #pragma pack (push, 8) +#endif + +#include "../../../juce.h" +class AudioFilterBase; + + +//============================================================================== +/** + Base class for the component that forms a plugin's GUI. + + Derive your editor component from this class, and create an instance of it + by overriding the AudioFilterBase::createEditor() method. + +*/ +class AudioFilterEditor : public Component +{ +public: + //============================================================================== + /** Creates a filter editor. + + You'll need to pass in the filter that's creating it. + */ + AudioFilterEditor (AudioFilterBase* const ownerFilter); + + /** Destructor. */ + ~AudioFilterEditor(); + + + //============================================================================== + /** Returns a pointer to the filter that owns this editor. */ + AudioFilterBase* getOwnerFilter() const throw() { return ownerFilter; } + + +private: + //============================================================================== + AudioFilterBase* const ownerFilter; +}; + +#ifdef _MSC_VER + #pragma pack (pop) +#endif + +#endif // __JUCE_AUDIOFILTEREDITOR_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h b/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h new file mode 100644 index 0000000000..4cbb0e18cc --- /dev/null +++ b/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h @@ -0,0 +1,98 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_INCLUDECHARACTERISTICS_JUCEHEADER__ +#define __JUCE_INCLUDECHARACTERISTICS_JUCEHEADER__ + +//============================================================================== +/* The JucePluginCharacteristics.h file is supposed to live in your plugin-specific + project directory, and has to contain info describing its name, type, etc. For + more info, see the JucePluginCharacteristics.h that is included in the demo plugin. + + You may need to adjust the include path of your project to make sure it can be + found by this include statement. (Don't hack this file to change the include path) +*/ +#include "JucePluginCharacteristics.h" + + +//============================================================================== +// The following stuff is just to cause a compile error if you've forgotten to +// define all your plugin settings properly. + +#ifndef JucePlugin_IsSynth + #error "You need to define the JucePlugin_IsSynth value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_ManufacturerCode + #error "You need to define the JucePlugin_ManufacturerCode value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_PluginCode + #error "You need to define the JucePlugin_PluginCode value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_ProducesMidiOutput + #error "You need to define the JucePlugin_ProducesMidiOutput value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_WantsMidiInput + #error "You need to define the JucePlugin_WantsMidiInput value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_MaxNumInputChannels + #error "You need to define the JucePlugin_MaxNumInputChannels value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_MaxNumOutputChannels + #error "You need to define the JucePlugin_MaxNumOutputChannels value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_PreferredChannelConfigurations + #error "You need to define the JucePlugin_PreferredChannelConfigurations value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_Latency + #error "You need to define the JucePlugin_Latency value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_SilenceInProducesSilenceOut + #error "You need to define the JucePlugin_SilenceInProducesSilenceOut value in your JucePluginCharacteristics.h file!" +#endif + +#ifndef JucePlugin_EditorRequiresKeyboardFocus + #error "You need to define the JucePlugin_EditorRequiresKeyboardFocus value in your JucePluginCharacteristics.h file!" +#endif + +#if JUCE_USE_VSTSDK_2_4 != 0 && JUCE_USE_VSTSDK_2_4 != 1 + #error "You need to define the JUCE_USE_VSTSDK_2_4 value in your JucePluginCharacteristics.h file!" +#endif + +#endif // __JUCE_INCLUDECHARACTERISTICS_JUCEHEADER__ diff --git a/extras/binarybuilder/BinaryBuilder.cpp b/extras/binarybuilder/BinaryBuilder.cpp new file mode 100644 index 0000000000..4656dc558e --- /dev/null +++ b/extras/binarybuilder/BinaryBuilder.cpp @@ -0,0 +1,222 @@ +/* + ============================================================================== + + Utility to turn a bunch of binary files into a .cpp file and .h file full of + data so they can be built directly into an executable. + + Copyright 2007 by Julian Storer. + + Use this code at your own risk! It carries no warranty! + + ============================================================================== +*/ + +#define ONLY_INCLUDE_JUCE_CORE_HEADERS 1 + +#include "../../juce.h" + + +//============================================================================== +static int addFile (const File& file, + const String& classname, + OutputStream& headerStream, + OutputStream& cppStream) +{ + MemoryBlock mb; + file.loadFileAsData (mb); + + const String name (file.getFileName().toLowerCase() + .replaceCharacter (' ', '_') + .replaceCharacter ('.', '_') + .retainCharacters (T("abcdefghijklmnopqrstuvwxyz_0123456789"))); + + printf ("Adding %s: %d bytes\n", + (const char*) name, + mb.getSize()); + + headerStream.printf (" extern const char* %s;\r\n" + " const int %sSize = %d;\r\n\r\n", + (const char*) name, + (const char*) name, + mb.getSize()); + + static int tempNum = 0; + + cppStream.printf ("static const unsigned char temp%d[] = {", ++tempNum); + + int i = 0; + const uint8* const data = (const uint8*) mb.getData(); + + while (i < mb.getSize() - 1) + { + if ((i % 40) != 39) + cppStream.printf ("%d,", (int) data[i]); + else + cppStream.printf ("%d,\r\n ", (int) data[i]); + + ++i; + } + + cppStream.printf ("%d,0,0};\r\n", (int) data[i]); + + cppStream.printf ("const char* %s::%s = (const char*) temp%d;\r\n\r\n", + (const char*) classname, + (const char*) name, + tempNum); + + return mb.getSize(); +} + +static bool isHiddenFile (const File& f, const File& root) +{ + return f.getFileName().endsWithIgnoreCase (T(".scc")) + || f.getFileName().startsWithChar (T('.')) + || f.getSize() == 0 + || (f.getParentDirectory() != root && isHiddenFile (f.getParentDirectory(), root)); +} + +//============================================================================== +int main (int argc, char* argv[]) +{ + // If you're running a command-line app, you need to initialise juce manually + // before calling any Juce functionality.. + initialiseJuce_NonGUI(); + + printf ("\n BinaryBuilder! Copyright 2007 by Julian Storer - www.rawmaterialsoftware.com\n\n"); + + if (argc != 4) + { + printf (" Usage: BinaryBuilder sourcedirectory targetdirectory targetclassname\n\n"); + printf (" BinaryBuilder will find all files in the source directory, and encode them\n"); + printf (" into two files called (targetclassname).cpp and (targetclassname).h, which it\n"); + printf (" will write into the target directory supplied.\n\n"); + printf (" Any files in sub-directories of the source directory will be put into the\n"); + printf (" resultant class, but #ifdef'ed out using the name of the sub-directory (hard to\n"); + printf (" explain, but obvious when you try it...)\n"); + + return 0; + } + + const File sourceDirectory (File::getCurrentWorkingDirectory() + .getChildFile (String (argv[1]).unquoted())); + + if (! sourceDirectory.isDirectory()) + { + String error ("Source directory doesn't exist: "); + error << sourceDirectory.getFullPathName() << "\n\n"; + + printf ((const char*) error); + return 0; + } + + const File destDirectory (File::getCurrentWorkingDirectory() + .getChildFile (String (argv[2]).unquoted())); + + if (! destDirectory.isDirectory()) + { + String error ("Destination directory doesn't exist: "); + error << destDirectory.getFullPathName() << "\n\n"; + + printf ((const char*) error); + return 0; + } + + String className (argv[3]); + className = className.trim(); + + const File headerFile (destDirectory.getChildFile (className).withFileExtension (T(".h"))); + const File cppFile (destDirectory.getChildFile (className).withFileExtension (T(".cpp"))); + + String message; + message << "Creating " << headerFile.getFullPathName() + << " and " << cppFile.getFullPathName() + << " from files in " << sourceDirectory.getFullPathName() + << "...\n\n"; + + printf ((const char*) message); + + OwnedArray files; + sourceDirectory.findChildFiles (files, File::findFiles, true, "*"); + + if (files.size() == 0) + { + String error ("Didn't find any source files in: "); + error << sourceDirectory.getFullPathName() << "\n\n"; + printf ((const char*) error); + return 0; + } + + headerFile.deleteFile(); + cppFile.deleteFile(); + + OutputStream* header = headerFile.createOutputStream(); + + if (header == 0) + { + String error ("Couldn't open "); + error << headerFile.getFullPathName() << " for writing\n\n"; + printf ((const char*) error); + return 0; + } + + OutputStream* cpp = cppFile.createOutputStream(); + + if (cpp == 0) + { + String error ("Couldn't open "); + error << cppFile.getFullPathName() << " for writing\n\n"; + printf ((const char*) error); + return 0; + } + + header->printf ("/* (Auto-generated binary data file). */\r\n\r\n" + "#ifndef BINARY_%s_H\r\n" + "#define BINARY_%s_H\r\n\r\n" + "namespace %s\r\n" + "{\r\n", + (const char*) className.toUpperCase(), + (const char*) className.toUpperCase(), + (const char*) className); + + cpp->printf ("/* (Auto-generated binary data file). */\r\n\r\n" + "#include \"%s.h\"\r\n\r\n", + (const char*) className); + + int totalBytes = 0; + + for (int i = 0; i < files.size(); ++i) + { + const File file (*(files[i])); + + // (avoid source control files and hidden files..) + if (! isHiddenFile (file, sourceDirectory)) + { + if (file.getParentDirectory() != sourceDirectory) + { + header->printf (" #ifdef %s\r\n", (const char*) file.getParentDirectory().getFileName().toUpperCase()); + cpp->printf ("#ifdef %s\r\n", (const char*) file.getParentDirectory().getFileName().toUpperCase()); + + totalBytes += addFile (file, className, *header, *cpp); + + header->printf (" #endif\r\n"); + cpp->printf ("#endif\r\n"); + } + else + { + totalBytes += addFile (file, className, *header, *cpp); + } + } + } + + header->printf ("};\r\n\r\n" + "#endif\r\n"); + + delete header; + delete cpp; + + printf ("\n Total size of binary data: %d bytes\n", totalBytes); + + shutdownJuce_NonGUI(); + + return 0; +} diff --git a/extras/binarybuilder/vc8/BinaryBuilder.sln b/extras/binarybuilder/vc8/BinaryBuilder.sln new file mode 100644 index 0000000000..97e9844218 --- /dev/null +++ b/extras/binarybuilder/vc8/BinaryBuilder.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BinaryBuilder", "BinaryBuilder.vcproj", "{27423CD3-4ECF-4378-9408-17E01DD339C2}" + ProjectSection(ProjectDependencies) = postProject + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} = {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JUCE", "..\..\..\build\win32\vc8\JUCE.vcproj", "{AE232C11-D91C-4CA1-B24E-8B11A52EFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Release|Win32 = DLL Release|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {27423CD3-4ECF-4378-9408-17E01DD339C2}.Debug|Win32.ActiveCfg = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.Debug|Win32.Build.0 = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.DLL Debug|Win32.ActiveCfg = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.DLL Debug|Win32.Build.0 = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.DLL Release|Win32.ActiveCfg = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.DLL Release|Win32.Build.0 = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.Release|Win32.ActiveCfg = Release|Win32 + {27423CD3-4ECF-4378-9408-17E01DD339C2}.Release|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extras/binarybuilder/vc8/BinaryBuilder.vcproj b/extras/binarybuilder/vc8/BinaryBuilder.vcproj new file mode 100644 index 0000000000..20daa64b66 --- /dev/null +++ b/extras/binarybuilder/vc8/BinaryBuilder.vcproj @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/example projects/common/Main.cpp b/extras/example projects/common/Main.cpp new file mode 100644 index 0000000000..8faae6d3b0 --- /dev/null +++ b/extras/example projects/common/Main.cpp @@ -0,0 +1,160 @@ +/* + ============================================================================== + + Demonstration "Hello World" application in JUCE + Copyright 2004 by Julian Storer. + + ============================================================================== +*/ + +#include "../../../juce.h" + +//============================================================================== +/** This is the component that sits inside the "hello world" window, filling its + content area. In this example, we'll just write "hello world" inside it. +*/ +class HelloWorldContentComponent : public Component +{ +public: + HelloWorldContentComponent() + { + } + + ~HelloWorldContentComponent() + { + } + + void paint (Graphics& g) + { + g.fillAll (Colours::white); + + g.setColour (Colours::black); + g.setFont (20.0f, Font::bold); + g.drawText (T("Hello World!"), + 0, 0, getWidth(), getHeight(), + Justification::centred, false); + } +}; + +//============================================================================== +/** This is the top-level window that we'll pop up. Inside it, we'll create and + show a HelloWorldContentComponent component. +*/ +class HelloWorldWindow : public DocumentWindow +{ +public: + //============================================================================== + HelloWorldWindow() + : DocumentWindow (T("Hello World"), + Colours::lightgrey, + DocumentWindow::allButtons, + true) + { + setContentComponent (new HelloWorldContentComponent()); + + setVisible (true); + centreWithSize (400, 200); + } + + ~HelloWorldWindow() + { + // (the content component will be deleted automatically, so no need to do it here) + } + + //============================================================================== + void closeButtonPressed() + { + // When the user presses the close button, we'll tell the app to quit. This + // window will be deleted by the app object as it closes down. + JUCEApplication::quit(); + } +}; + + +//============================================================================== +/** This is the application object that is started up when Juce starts. It handles + the initialisation and shutdown of the whole application. +*/ +class JUCEHelloWorldApplication : public JUCEApplication +{ + /* Important! NEVER embed objects directly inside your JUCEApplication class! Use + ONLY pointers to objects, which you should create during the initialise() method + (NOT in the constructor!) and delete in the shutdown() method (NOT in the + destructor!) + + This is because the application object gets created before Juce has been properly + initialised, so any embedded objects would also get constructed too soon. + */ + HelloWorldWindow* helloWorldWindow; + ShinyLookAndFeel shinyLookAndFeel; + +public: + //============================================================================== + JUCEHelloWorldApplication() + : helloWorldWindow (0) + { + // NEVER do anything in here that could involve any Juce function being called + // - leave all your startup tasks until the initialise() method. + } + + ~JUCEHelloWorldApplication() + { + // Your shutdown() method should already have done all the things necessary to + // clean up this app object, so you should never need to put anything in + // the destructor. + + // Making any Juce calls in here could be very dangerous... + } + + //============================================================================== + void initialise (const String& commandLine) + { + LookAndFeel::setDefaultLookAndFeel (&shinyLookAndFeel); + + // just create the main window... + helloWorldWindow = new HelloWorldWindow(); + + /* ..and now return, which will fall into to the main event + dispatch loop, and this will run until something calls + JUCEAppliction::quit(). + + In this case, JUCEAppliction::quit() will be called by the + hello world window being clicked. + */ + } + + void shutdown() + { + // clear up.. + + if (helloWorldWindow != 0) + delete helloWorldWindow; + + LookAndFeel::setDefaultLookAndFeel (0); + } + + //============================================================================== + const String getApplicationName() + { + return T("Hello World for JUCE"); + } + + const String getApplicationVersion() + { + return T("1.0"); + } + + bool moreThanOneInstanceAllowed() + { + return true; + } + + void anotherInstanceStarted (const String& commandLine) + { + } +}; + + +//============================================================================== +// This macro creates the application's main() function.. +START_JUCE_APPLICATION (JUCEHelloWorldApplication) diff --git a/extras/example projects/example_project_for_Mac/English.lproj/InfoPlist.strings b/extras/example projects/example_project_for_Mac/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..ba19a1b589aa65adf882c922c7712432d80862ed GIT binary patch literal 274 zcmX|*NeaS15JmsmQ-myos0gmaje;m>7J7gXGdN}-i9)=QmsDT3L5l9`s(StFzdstv zlcS9aMGAG(Sx+U3={?AmYC45-vO`X}*HkI*flABQYUo~}TT6Lp_K1a+n(Gc7!zJ?3 z&&ZBu99I`+5p_Vn?6i!BrrYRhii)qjR*)H!Ts!y>y-)|Mxxh!s-ikj*ovf3e`imU_ Yv1Mwg49+ODe;;PrhZ<`{OmM`$FZH!A?f?J) literal 0 HcmV?d00001 diff --git a/extras/example projects/example_project_for_Mac/Info.plist b/extras/example projects/example_project_for_Mac/Info.plist new file mode 100644 index 0000000000..252e4c3dc8 --- /dev/null +++ b/extras/example projects/example_project_for_Mac/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + juce_application + CFBundleIconFile + + CFBundleIdentifier + com.apple.myCarbonApp + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + + + diff --git a/extras/example projects/example_project_for_Mac/juce_application.xcodeproj/project.pbxproj b/extras/example projects/example_project_for_Mac/juce_application.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..fbc625cc98 --- /dev/null +++ b/extras/example projects/example_project_for_Mac/juce_application.xcodeproj/project.pbxproj @@ -0,0 +1,276 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 84078F3E09E6B42E004E7BCD /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84078F3D09E6B42E004E7BCD /* AGL.framework */; }; + 8407902B09E6B5BD004E7BCD /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407902A09E6B5BD004E7BCD /* QuickTime.framework */; }; + 84F30CD108FEAAA20087E26C /* Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F30CD008FEAAA20087E26C /* Main.cpp */; }; + 84F30CED08FEAD7A0087E26C /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */; }; + 84FDB0610C15BD5C00CD0087 /* libjuce.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FDB05E0C15BD4500CD0087 /* libjuce.a */; }; + 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */; }; + 8D0C4E920486CD37000505A6 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20286C33FDCF999611CA2CEA /* Carbon.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 84FDB05D0C15BD4500CD0087 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 84F30CCA08FEAA8C0087E26C /* Juce.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC046055464E500DB518D /* libjuce.a */; + remoteInfo = Juce; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0867D6ABFE840B52C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 20286C33FDCF999611CA2CEA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 4A9504C8FFE6A3BC11CA0CBA /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; + 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; + 84078F3D09E6B42E004E7BCD /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + 8407902A09E6B5BD004E7BCD /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + 84F30CCA08FEAA8C0087E26C /* Juce.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Juce.xcodeproj; path = ../../../build/macosx/Juce.xcodeproj; sourceTree = SOURCE_ROOT; }; + 84F30CD008FEAAA20087E26C /* Main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../common/Main.cpp; sourceTree = SOURCE_ROOT; }; + 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D0C4E970486CD37000505A6 /* juce_application.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = juce_application.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D0C4E910486CD37000505A6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84FDB0610C15BD5C00CD0087 /* libjuce.a in Frameworks */, + 8D0C4E920486CD37000505A6 /* Carbon.framework in Frameworks */, + 84F30CED08FEAD7A0087E26C /* CoreAudio.framework in Frameworks */, + 84078F3E09E6B42E004E7BCD /* AGL.framework in Frameworks */, + 8407902B09E6B5BD004E7BCD /* QuickTime.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 195DF8CFFE9D517E11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D0C4E970486CD37000505A6 /* juce_application.app */, + ); + name = Products; + sourceTree = ""; + }; + 20286C29FDCF999611CA2CEA /* juce_application */ = { + isa = PBXGroup; + children = ( + 20286C2AFDCF999611CA2CEA /* Sources */, + 20286C2CFDCF999611CA2CEA /* Resources */, + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, + 195DF8CFFE9D517E11CA2CBB /* Products */, + ); + name = juce_application; + sourceTree = ""; + }; + 20286C2AFDCF999611CA2CEA /* Sources */ = { + isa = PBXGroup; + children = ( + 84F30CD008FEAAA20087E26C /* Main.cpp */, + ); + name = Sources; + sourceTree = ""; + }; + 20286C2CFDCF999611CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D0C4E960486CD37000505A6 /* Info.plist */, + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 84F30CCA08FEAA8C0087E26C /* Juce.xcodeproj */, + 20286C33FDCF999611CA2CEA /* Carbon.framework */, + 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */, + 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */, + 4A9504C8FFE6A3BC11CA0CBA /* ApplicationServices.framework */, + 84078F3D09E6B42E004E7BCD /* AGL.framework */, + 8407902A09E6B5BD004E7BCD /* QuickTime.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 84FDB05A0C15BD4500CD0087 /* Products */ = { + isa = PBXGroup; + children = ( + 84FDB05E0C15BD4500CD0087 /* libjuce.a */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D0C4E890486CD37000505A6 /* juce_application */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84F30CBF08FEAA620087E26C /* Build configuration list for PBXNativeTarget "juce_application" */; + buildPhases = ( + 8D0C4E8C0486CD37000505A6 /* Resources */, + 8D0C4E8F0486CD37000505A6 /* Sources */, + 8D0C4E910486CD37000505A6 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = juce_application; + productInstallPath = "$(HOME)/Applications"; + productName = juce_application; + productReference = 8D0C4E970486CD37000505A6 /* juce_application.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 20286C28FDCF999611CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 84F30CC308FEAA620087E26C /* Build configuration list for PBXProject "juce_application" */; + hasScannedForEncodings = 1; + mainGroup = 20286C29FDCF999611CA2CEA /* juce_application */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 84FDB05A0C15BD4500CD0087 /* Products */; + ProjectRef = 84F30CCA08FEAA8C0087E26C /* Juce.xcodeproj */; + }, + ); + targets = ( + 8D0C4E890486CD37000505A6 /* juce_application */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 84FDB05E0C15BD4500CD0087 /* libjuce.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjuce.a; + remoteRef = 84FDB05D0C15BD4500CD0087 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D0C4E8C0486CD37000505A6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D0C4E8F0486CD37000505A6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84F30CD108FEAAA20087E26C /* Main.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0867D6ABFE840B52C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84F30CC008FEAA620087E26C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = ../../../juce/bin; + PREBINDING = NO; + PRODUCT_NAME = juce_application; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 84F30CC108FEAA620087E26C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = ../../../juce/bin; + PREBINDING = NO; + PRODUCT_NAME = juce_application; + WRAPPER_EXTENSION = app; + ZERO_LINK = NO; + }; + name = Release; + }; + 84F30CC408FEAA620087E26C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 84F30CC508FEAA620087E26C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84F30CBF08FEAA620087E26C /* Build configuration list for PBXNativeTarget "juce_application" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84F30CC008FEAA620087E26C /* Debug */, + 84F30CC108FEAA620087E26C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 84F30CC308FEAA620087E26C /* Build configuration list for PBXProject "juce_application" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84F30CC408FEAA620087E26C /* Debug */, + 84F30CC508FEAA620087E26C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 20286C28FDCF999611CA2CEA /* Project object */; +} diff --git a/extras/example projects/example_project_for_Mac/version.plist b/extras/example projects/example_project_for_Mac/version.plist new file mode 100644 index 0000000000..df8c3dc7d1 --- /dev/null +++ b/extras/example projects/example_project_for_Mac/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 92 + CFBundleVersion + 1.0 + ProductBuildVersion + 7K571 + ProjectName + NibPBTemplates + SourceVersion + 1200000 + + diff --git a/extras/example projects/example_project_for_Win32/juce_application.dsp b/extras/example projects/example_project_for_Win32/juce_application.dsp new file mode 100644 index 0000000000..8100617bf1 --- /dev/null +++ b/extras/example projects/example_project_for_Win32/juce_application.dsp @@ -0,0 +1,107 @@ +# Microsoft Developer Studio Project File - Name="juce_application" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=juce_application - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "juce_application.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "juce_application.mak" CFG="juce_application - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "juce_application - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "juce_application - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "juce_application - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /G6 /MT /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /libpath:"../../bin" + +!ELSEIF "$(CFG)" == "juce_application - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /G6 /MTd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"../../bin" + +!ENDIF + +# Begin Target + +# Name "juce_application - Win32 Release" +# Name "juce_application - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\common\Main.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/extras/example projects/example_project_for_Win32/juce_application.dsw b/extras/example projects/example_project_for_Win32/juce_application.dsw new file mode 100644 index 0000000000..6d3f6fcd67 --- /dev/null +++ b/extras/example projects/example_project_for_Win32/juce_application.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "JUCE"="..\..\build\win32\vc6\JUCE.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "juce_application"=".\juce_application.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name JUCE + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/extras/example projects/example_project_for_Win32/juce_application.sln b/extras/example projects/example_project_for_Win32/juce_application.sln new file mode 100644 index 0000000000..e1917fb9a9 --- /dev/null +++ b/extras/example projects/example_project_for_Win32/juce_application.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "juce_application", "juce_application.vcproj", "{3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}" + ProjectSection(ProjectDependencies) = postProject + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} = {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JUCE", "..\..\..\build\win32\vc8\JUCE.vcproj", "{AE232C11-D91C-4CA1-B24E-8B11A52EFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug DLL|Win32 = Debug DLL|Win32 + Debug|Win32 = Debug|Win32 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Release|Win32 = DLL Release|Win32 + Release DLL|Win32 = Release DLL|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Debug DLL|Win32.ActiveCfg = Debug|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Debug DLL|Win32.Build.0 = Debug|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Debug|Win32.ActiveCfg = Debug|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Debug|Win32.Build.0 = Debug|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.DLL Debug|Win32.Build.0 = Debug|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.DLL Release|Win32.ActiveCfg = Release|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.DLL Release|Win32.Build.0 = Release|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Release DLL|Win32.ActiveCfg = Release|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Release DLL|Win32.Build.0 = Release|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Release|Win32.ActiveCfg = Release|Win32 + {3FDA7E37-BC7B-4E95-9F8A-58857E2ACD2C}.Release|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug DLL|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug DLL|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release DLL|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release DLL|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extras/example projects/example_project_for_Win32/juce_application.vcproj b/extras/example projects/example_project_for_Win32/juce_application.vcproj new file mode 100644 index 0000000000..acb8748731 --- /dev/null +++ b/extras/example projects/example_project_for_Win32/juce_application.vcproj @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/example projects/readme.txt b/extras/example projects/readme.txt new file mode 100644 index 0000000000..d043476e9a --- /dev/null +++ b/extras/example projects/readme.txt @@ -0,0 +1,5 @@ + +This directory contains empty "Hello World" type projects that you can copy and alter to +quickly create a JUCE application. + +For a more complete example, see the Juce demo app. diff --git a/extras/juce demo/build/linux/JuceDemo.make b/extras/juce demo/build/linux/JuceDemo.make new file mode 100644 index 0000000000..f54f86c1f2 --- /dev/null +++ b/extras/juce demo/build/linux/JuceDemo.make @@ -0,0 +1,147 @@ +# C++ Windowed Executable Makefile autogenerated by premake +# Don't edit this file! Instead edit `premake.lua` then rerun `make` + +ifndef CONFIG + CONFIG=Debug +endif + +ifeq ($(CONFIG),Debug) + BINDIR := build + LIBDIR := build + OBJDIR := build/intermediate/Debug + OUTDIR := build + CPPFLAGS := -MD -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -I "/usr/include" + CFLAGS += $(CPPFLAGS) -g -D_DEBUG -ggdb + CXXFLAGS := $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -L "/usr/X11R6/lib/" -L "../../../../bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound -ljuce_debug + LDDEPS := + TARGET := jucedemo +endif + +ifeq ($(CONFIG),Release) + BINDIR := build + LIBDIR := build + OBJDIR := build/intermediate/Release + OUTDIR := build + CPPFLAGS := -MD -D "LINUX=1" -D "NDEBUG=1" -I "/usr/include" + CFLAGS += $(CPPFLAGS) -O2 + CXXFLAGS := $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -s -L "/usr/X11R6/lib/" -L "../../../../bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound -ljuce + LDDEPS := + TARGET := jucedemo +endif + +OBJECTS := \ + $(OBJDIR)/ApplicationStartup.o \ + $(OBJDIR)/BinaryData.o \ + $(OBJDIR)/MainDemoWindow.o \ + $(OBJDIR)/AudioDemo.o \ + $(OBJDIR)/DragAndDropDemo.o \ + $(OBJDIR)/FontsAndTextDemo.o \ + $(OBJDIR)/InterprocessCommsDemo.o \ + $(OBJDIR)/OpenGLDemo.o \ + $(OBJDIR)/PathsAndTransformsDemo.o \ + $(OBJDIR)/QuickTimeDemo.o \ + $(OBJDIR)/TableDemo.o \ + $(OBJDIR)/ThreadingDemo.o \ + $(OBJDIR)/TreeViewDemo.o \ + $(OBJDIR)/WidgetsDemo.o \ + +CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) +ifeq (,$(CMD)) + CMD_MKBINDIR := mkdir -p $(BINDIR) + CMD_MKLIBDIR := mkdir -p $(LIBDIR) + CMD_MKOUTDIR := mkdir -p $(OUTDIR) + CMD_MKOBJDIR := mkdir -p $(OBJDIR) +else + CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) + CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) + CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) + CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) +endif + +.PHONY: clean + +$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) + @echo Linking JuceDemo + -@$(CMD_MKBINDIR) + -@$(CMD_MKLIBDIR) + -@$(CMD_MKOUTDIR) + @$(CXX) -o $@ $(OBJECTS) $(LDFLAGS) $(RESOURCES) + +clean: + @echo Cleaning JuceDemo + -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) + +$(OBJDIR)/ApplicationStartup.o: ../../src/ApplicationStartup.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/BinaryData.o: ../../src/BinaryData.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/MainDemoWindow.o: ../../src/MainDemoWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/AudioDemo.o: ../../src/demos/AudioDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/DragAndDropDemo.o: ../../src/demos/DragAndDropDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/FontsAndTextDemo.o: ../../src/demos/FontsAndTextDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/InterprocessCommsDemo.o: ../../src/demos/InterprocessCommsDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/OpenGLDemo.o: ../../src/demos/OpenGLDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/PathsAndTransformsDemo.o: ../../src/demos/PathsAndTransformsDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/QuickTimeDemo.o: ../../src/demos/QuickTimeDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/TableDemo.o: ../../src/demos/TableDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/ThreadingDemo.o: ../../src/demos/ThreadingDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/TreeViewDemo.o: ../../src/demos/TreeViewDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/WidgetsDemo.o: ../../src/demos/WidgetsDemo.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJECTS:%.o=%.d) + diff --git a/extras/juce demo/build/linux/Makefile b/extras/juce demo/build/linux/Makefile new file mode 100644 index 0000000000..d020da080c --- /dev/null +++ b/extras/juce demo/build/linux/Makefile @@ -0,0 +1,25 @@ +# Makefile autogenerated by premake +# Don't edit this file! Instead edit `premake.lua` then rerun `make` +# Options: +# CONFIG=[Debug|Release] + +ifndef CONFIG + CONFIG=Debug +endif + +export CONFIG + +.PHONY: all clean JuceDemo + +all: JuceDemo + +Makefile: jucedemo_premake.lua + @echo ==== Regenerating Makefiles ==== + @premake --file $^ --cc gcc --target gnu + +JuceDemo: + @echo ==== Building JuceDemo ==== + @$(MAKE) --no-print-directory -C . -f JuceDemo.make + +clean: + @$(MAKE) --no-print-directory -C . -f JuceDemo.make clean diff --git a/extras/juce demo/build/linux/jucedemo_premake.lua b/extras/juce demo/build/linux/jucedemo_premake.lua new file mode 100644 index 0000000000..abab2a2e84 --- /dev/null +++ b/extras/juce demo/build/linux/jucedemo_premake.lua @@ -0,0 +1,49 @@ + +project.name = "JuceDemo" +project.bindir = "build" +project.libdir = "build" + +project.configs = { "Debug", "Release" } + +package = newpackage() +package.name = "JuceDemo" +package.kind = "winexe" +package.language = "c++" + +package.objdir = "build/intermediate" +package.config["Debug"].objdir = "build/intermediate/Debug" +package.config["Release"].objdir = "build/intermediate/Release" + +package.config["Debug"].defines = { "LINUX=1", "DEBUG=1", "_DEBUG=1" }; +package.config["Debug"].buildoptions = { "-D_DEBUG -ggdb" } + +package.config["Release"].defines = { "LINUX=1", "NDEBUG=1" }; + +package.target = "jucedemo" + +package.includepaths = { + "/usr/include" +} + +package.libpaths = { + "/usr/X11R6/lib/", + "../../../../bin" +} + +package.config["Debug"].links = { + "freetype", "pthread", "rt", "X11", "GL", "GLU", "Xinerama", "asound", "juce_debug" +} + +package.config["Release"].links = { + "freetype", "pthread", "rt", "X11", "GL", "GLU", "Xinerama", "asound", "juce" +} + +package.linkflags = { "static-runtime" } + +package.files = { matchfiles ( + "../../src/*.h", + "../../src/*.cpp", + "../../src/demos/*.h", + "../../src/demos/*.cpp" + ) +} diff --git a/extras/juce demo/build/linux/runpremake b/extras/juce demo/build/linux/runpremake new file mode 100644 index 0000000000..41ae324bc2 --- /dev/null +++ b/extras/juce demo/build/linux/runpremake @@ -0,0 +1 @@ +premake --file jucedemo_premake.lua --cc gcc --target gnu \ No newline at end of file diff --git a/extras/juce demo/build/macosx/English.lproj/InfoPlist.strings b/extras/juce demo/build/macosx/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..6d415a2f14d30fbeb9fd961c79d2c7251c644cac GIT binary patch literal 512 zcmbV|I}5@<5QL}pR|Lx-zOWM;13o}g7_gPo7@tu|qM$!s{SqaD#72(0z1x}HotyhZ zHQBN>(oqW;?X}TOOZnt3#7HrjqYgxi7;p}G1>CDTW&BtP*&Xa_#L#kdiAd`&q33P|E3C7C`=t_g4fmJHe-!JQ&tGipz@mkKSir=m99Ju@FC1N6Eqt9 RFq&tM6-{}0SA_gA{|S6ZSC#+( literal 0 HcmV?d00001 diff --git a/extras/juce demo/build/macosx/Info.plist b/extras/juce demo/build/macosx/Info.plist new file mode 100644 index 0000000000..f47341ab27 --- /dev/null +++ b/extras/juce demo/build/macosx/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + jucedemo + CFBundleIconFile + + CFBundleIdentifier + com.apple.myCarbonNibApp + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 0.1 + CSResourcesFileMapped + + + diff --git a/extras/juce demo/build/macosx/jucedemo.xcodeproj/project.pbxproj b/extras/juce demo/build/macosx/jucedemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..ff7c00c256 --- /dev/null +++ b/extras/juce demo/build/macosx/jucedemo.xcodeproj/project.pbxproj @@ -0,0 +1,387 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 8402D4D608CC934C00E06580 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */; }; + 8417EE7A0A6E7EB90058E04E /* TableDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8417EE790A6E7EB90058E04E /* TableDemo.cpp */; }; + 842A97B8081060FB0059DBCC /* DragAndDropDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842A97B6081060FB0059DBCC /* DragAndDropDemo.cpp */; }; + 842A97B9081060FB0059DBCC /* OpenGLDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 842A97B7081060FB0059DBCC /* OpenGLDemo.cpp */; }; + 846929270A49DDE100314975 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 846929260A49DDE100314975 /* juce.xcconfig */; }; + 849E1BF706C15C330002E024 /* BinaryData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 849E1BF506C15C330002E024 /* BinaryData.cpp */; }; + 849E1BF806C15C330002E024 /* BinaryData.h in Headers */ = {isa = PBXBuildFile; fileRef = 849E1BF606C15C330002E024 /* BinaryData.h */; }; + 84A06BA809CAD661006A43BD /* InterprocessCommsDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84A06BA709CAD661006A43BD /* InterprocessCommsDemo.cpp */; }; + 84C49E5506C0EE8C0066071B /* ApplicationStartup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E4A06C0EE8C0066071B /* ApplicationStartup.cpp */; }; + 84C49E5606C0EE8C0066071B /* AudioDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E4C06C0EE8C0066071B /* AudioDemo.cpp */; }; + 84C49E5706C0EE8C0066071B /* FontsAndTextDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E4D06C0EE8C0066071B /* FontsAndTextDemo.cpp */; }; + 84C49E5806C0EE8C0066071B /* PathsAndTransformsDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E4E06C0EE8C0066071B /* PathsAndTransformsDemo.cpp */; }; + 84C49E5906C0EE8C0066071B /* ThreadingDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E4F06C0EE8C0066071B /* ThreadingDemo.cpp */; }; + 84C49E5A06C0EE8C0066071B /* TreeViewDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E5006C0EE8C0066071B /* TreeViewDemo.cpp */; }; + 84C49E5B06C0EE8C0066071B /* WidgetsDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E5106C0EE8C0066071B /* WidgetsDemo.cpp */; }; + 84C49E5C06C0EE8C0066071B /* jucedemo_headers.h in Headers */ = {isa = PBXBuildFile; fileRef = 84C49E5206C0EE8C0066071B /* jucedemo_headers.h */; }; + 84C49E5D06C0EE8C0066071B /* MainDemoWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84C49E5306C0EE8C0066071B /* MainDemoWindow.cpp */; }; + 84C49E5E06C0EE8C0066071B /* MainDemoWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84C49E5406C0EE8C0066071B /* MainDemoWindow.h */; }; + 84C49F2606C0F3200066071B /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C49F2506C0F3200066071B /* CoreAudio.framework */; }; + 84C4A41106C0F9A00066071B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C4A41006C0F9A00066071B /* IOKit.framework */; }; + 84D67A2B0802CAFF003B9EFE /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D67A2A0802CAFF003B9EFE /* QuickTime.framework */; }; + 84E8209909729D760097675B /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E8209809729D760097675B /* CoreMIDI.framework */; }; + 84EAE2F309DAAF0B00288D0A /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84EAE2F109DAAF0B00288D0A /* AGL.framework */; }; + 84EAE2F409DAAF0B00288D0A /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84EAE2F209DAAF0B00288D0A /* OpenGL.framework */; }; + 84F8DB0B099CA8DD00E911ED /* QuickTimeDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F8DB0A099CA8DD00E911ED /* QuickTimeDemo.cpp */; }; + 84FDB0950C15BDDD00CD0087 /* libjuce.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FDB0940C15BDCE00CD0087 /* libjuce.a */; }; + 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */; }; + 8D0C4E920486CD37000505A6 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20286C33FDCF999611CA2CEA /* Carbon.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 84FDB0930C15BDCE00CD0087 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 84EAE2F909DAAF2F00288D0A /* Juce.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC046055464E500DB518D /* libjuce.a */; + remoteInfo = Juce; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0867D6ABFE840B52C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 20286C33FDCF999611CA2CEA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; + 8417EE790A6E7EB90058E04E /* TableDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TableDemo.cpp; sourceTree = ""; }; + 842A97B6081060FB0059DBCC /* DragAndDropDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DragAndDropDemo.cpp; sourceTree = ""; }; + 842A97B7081060FB0059DBCC /* OpenGLDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = OpenGLDemo.cpp; sourceTree = ""; }; + 846929260A49DDE100314975 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; + 849E1BF506C15C330002E024 /* BinaryData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../src/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; + 849E1BF606C15C330002E024 /* BinaryData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../src/BinaryData.h; sourceTree = SOURCE_ROOT; }; + 84A06BA709CAD661006A43BD /* InterprocessCommsDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = InterprocessCommsDemo.cpp; sourceTree = ""; }; + 84C49E4A06C0EE8C0066071B /* ApplicationStartup.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ApplicationStartup.cpp; path = ../../src/ApplicationStartup.cpp; sourceTree = SOURCE_ROOT; }; + 84C49E4C06C0EE8C0066071B /* AudioDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AudioDemo.cpp; sourceTree = ""; }; + 84C49E4D06C0EE8C0066071B /* FontsAndTextDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FontsAndTextDemo.cpp; sourceTree = ""; }; + 84C49E4E06C0EE8C0066071B /* PathsAndTransformsDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PathsAndTransformsDemo.cpp; sourceTree = ""; }; + 84C49E4F06C0EE8C0066071B /* ThreadingDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadingDemo.cpp; sourceTree = ""; }; + 84C49E5006C0EE8C0066071B /* TreeViewDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TreeViewDemo.cpp; sourceTree = ""; }; + 84C49E5106C0EE8C0066071B /* WidgetsDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WidgetsDemo.cpp; sourceTree = ""; }; + 84C49E5206C0EE8C0066071B /* jucedemo_headers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jucedemo_headers.h; path = ../../src/jucedemo_headers.h; sourceTree = SOURCE_ROOT; }; + 84C49E5306C0EE8C0066071B /* MainDemoWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = MainDemoWindow.cpp; path = ../../src/MainDemoWindow.cpp; sourceTree = SOURCE_ROOT; }; + 84C49E5406C0EE8C0066071B /* MainDemoWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = MainDemoWindow.h; path = ../../src/MainDemoWindow.h; sourceTree = SOURCE_ROOT; }; + 84C49F2506C0F3200066071B /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 84C4A41006C0F9A00066071B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; + 84D67A2A0802CAFF003B9EFE /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + 84E8209809729D760097675B /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = /System/Library/Frameworks/CoreMIDI.framework; sourceTree = ""; }; + 84EAE2F109DAAF0B00288D0A /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + 84EAE2F209DAAF0B00288D0A /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + 84EAE2F909DAAF2F00288D0A /* Juce.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Juce.xcodeproj; path = ../../../../build/macosx/Juce.xcodeproj; sourceTree = SOURCE_ROOT; }; + 84F8DB0A099CA8DD00E911ED /* QuickTimeDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = QuickTimeDemo.cpp; sourceTree = ""; }; + 8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D0C4E970486CD37000505A6 /* jucedemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = jucedemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D0C4E910486CD37000505A6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84FDB0950C15BDDD00CD0087 /* libjuce.a in Frameworks */, + 8D0C4E920486CD37000505A6 /* Carbon.framework in Frameworks */, + 84C49F2606C0F3200066071B /* CoreAudio.framework in Frameworks */, + 84C4A41106C0F9A00066071B /* IOKit.framework in Frameworks */, + 84D67A2B0802CAFF003B9EFE /* QuickTime.framework in Frameworks */, + 8402D4D608CC934C00E06580 /* CoreServices.framework in Frameworks */, + 84E8209909729D760097675B /* CoreMIDI.framework in Frameworks */, + 84EAE2F309DAAF0B00288D0A /* AGL.framework in Frameworks */, + 84EAE2F409DAAF0B00288D0A /* OpenGL.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 195DF8CFFE9D517E11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D0C4E970486CD37000505A6 /* jucedemo.app */, + ); + name = Products; + sourceTree = ""; + }; + 20286C29FDCF999611CA2CEA /* jucedemo */ = { + isa = PBXGroup; + children = ( + 20286C2AFDCF999611CA2CEA /* Sources */, + 846929260A49DDE100314975 /* juce.xcconfig */, + 20286C2CFDCF999611CA2CEA /* Resources */, + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, + 195DF8CFFE9D517E11CA2CBB /* Products */, + ); + name = jucedemo; + sourceTree = ""; + }; + 20286C2AFDCF999611CA2CEA /* Sources */ = { + isa = PBXGroup; + children = ( + 84C49E4B06C0EE8C0066071B /* demos */, + 84C49E5206C0EE8C0066071B /* jucedemo_headers.h */, + 84C49E4A06C0EE8C0066071B /* ApplicationStartup.cpp */, + 84C49E5306C0EE8C0066071B /* MainDemoWindow.cpp */, + 84C49E5406C0EE8C0066071B /* MainDemoWindow.h */, + 849E1BF506C15C330002E024 /* BinaryData.cpp */, + 849E1BF606C15C330002E024 /* BinaryData.h */, + ); + name = Sources; + sourceTree = ""; + }; + 20286C2CFDCF999611CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D0C4E960486CD37000505A6 /* Info.plist */, + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 84EAE2F909DAAF2F00288D0A /* Juce.xcodeproj */, + 84EAE2F109DAAF0B00288D0A /* AGL.framework */, + 84EAE2F209DAAF0B00288D0A /* OpenGL.framework */, + 84D67A2A0802CAFF003B9EFE /* QuickTime.framework */, + 84C4A41006C0F9A00066071B /* IOKit.framework */, + 84C49F2506C0F3200066071B /* CoreAudio.framework */, + 20286C33FDCF999611CA2CEA /* Carbon.framework */, + 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */, + 84E8209809729D760097675B /* CoreMIDI.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 84C49E4B06C0EE8C0066071B /* demos */ = { + isa = PBXGroup; + children = ( + 842A97B6081060FB0059DBCC /* DragAndDropDemo.cpp */, + 842A97B7081060FB0059DBCC /* OpenGLDemo.cpp */, + 84C49E4C06C0EE8C0066071B /* AudioDemo.cpp */, + 84C49E4D06C0EE8C0066071B /* FontsAndTextDemo.cpp */, + 84C49E4E06C0EE8C0066071B /* PathsAndTransformsDemo.cpp */, + 84F8DB0A099CA8DD00E911ED /* QuickTimeDemo.cpp */, + 8417EE790A6E7EB90058E04E /* TableDemo.cpp */, + 84C49E4F06C0EE8C0066071B /* ThreadingDemo.cpp */, + 84C49E5006C0EE8C0066071B /* TreeViewDemo.cpp */, + 84C49E5106C0EE8C0066071B /* WidgetsDemo.cpp */, + 84A06BA709CAD661006A43BD /* InterprocessCommsDemo.cpp */, + ); + name = demos; + path = ../../src/demos; + sourceTree = SOURCE_ROOT; + }; + 84FDB0900C15BDCE00CD0087 /* Products */ = { + isa = PBXGroup; + children = ( + 84FDB0940C15BDCE00CD0087 /* libjuce.a */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8D0C4E8A0486CD37000505A6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 84C49E5C06C0EE8C0066071B /* jucedemo_headers.h in Headers */, + 84C49E5E06C0EE8C0066071B /* MainDemoWindow.h in Headers */, + 849E1BF806C15C330002E024 /* BinaryData.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8D0C4E890486CD37000505A6 /* jucedemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84CFBCCB085F14F000C52F85 /* Build configuration list for PBXNativeTarget "jucedemo" */; + buildPhases = ( + 8D0C4E8A0486CD37000505A6 /* Headers */, + 8D0C4E8C0486CD37000505A6 /* Resources */, + 8D0C4E8F0486CD37000505A6 /* Sources */, + 8D0C4E910486CD37000505A6 /* Frameworks */, + 8D0C4E940486CD37000505A6 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = jucedemo; + productInstallPath = "$(HOME)/Applications"; + productName = jucedemo; + productReference = 8D0C4E970486CD37000505A6 /* jucedemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 20286C28FDCF999611CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 84CFBCCF085F14F000C52F85 /* Build configuration list for PBXProject "jucedemo" */; + hasScannedForEncodings = 1; + mainGroup = 20286C29FDCF999611CA2CEA /* jucedemo */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 84FDB0900C15BDCE00CD0087 /* Products */; + ProjectRef = 84EAE2F909DAAF2F00288D0A /* Juce.xcodeproj */; + }, + ); + targets = ( + 8D0C4E890486CD37000505A6 /* jucedemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 84FDB0940C15BDCE00CD0087 /* libjuce.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjuce.a; + remoteRef = 84FDB0930C15BDCE00CD0087 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D0C4E8C0486CD37000505A6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */, + 846929270A49DDE100314975 /* juce.xcconfig in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 8D0C4E940486CD37000505A6 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D0C4E8F0486CD37000505A6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84C49E5506C0EE8C0066071B /* ApplicationStartup.cpp in Sources */, + 84C49E5606C0EE8C0066071B /* AudioDemo.cpp in Sources */, + 84C49E5706C0EE8C0066071B /* FontsAndTextDemo.cpp in Sources */, + 84C49E5806C0EE8C0066071B /* PathsAndTransformsDemo.cpp in Sources */, + 84C49E5906C0EE8C0066071B /* ThreadingDemo.cpp in Sources */, + 84C49E5A06C0EE8C0066071B /* TreeViewDemo.cpp in Sources */, + 84C49E5B06C0EE8C0066071B /* WidgetsDemo.cpp in Sources */, + 84C49E5D06C0EE8C0066071B /* MainDemoWindow.cpp in Sources */, + 849E1BF706C15C330002E024 /* BinaryData.cpp in Sources */, + 842A97B8081060FB0059DBCC /* DragAndDropDemo.cpp in Sources */, + 842A97B9081060FB0059DBCC /* OpenGLDemo.cpp in Sources */, + 84F8DB0B099CA8DD00E911ED /* QuickTimeDemo.cpp in Sources */, + 84A06BA809CAD661006A43BD /* InterprocessCommsDemo.cpp in Sources */, + 8417EE7A0A6E7EB90058E04E /* TableDemo.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0867D6ABFE840B52C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84CFBCCC085F14F000C52F85 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_DEBUG=1", + "DEBUG=1", + ); + HEADER_SEARCH_PATHS = "$(SYSTEM_DEVELOPER_DIR)/Headers/FlatCarbon"; + INFOPLIST_FILE = Info.plist; + LIBRARY_SEARCH_PATHS = ../../../bin; + PRODUCT_NAME = jucedemo; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 84CFBCCD085F14F000C52F85 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_NDEBUG=1", + "NDEBUG=1", + ); + HEADER_SEARCH_PATHS = "$(SYSTEM_DEVELOPER_DIR)/Headers/FlatCarbon"; + INFOPLIST_FILE = Info.plist; + LIBRARY_SEARCH_PATHS = ../../../bin; + PRODUCT_NAME = jucedemo; + WRAPPER_EXTENSION = app; + ZERO_LINK = NO; + }; + name = Release; + }; + 84CFBCD0085F14F000C52F85 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 846929260A49DDE100314975 /* juce.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 84CFBCD1085F14F000C52F85 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 846929260A49DDE100314975 /* juce.xcconfig */; + buildSettings = { + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84CFBCCB085F14F000C52F85 /* Build configuration list for PBXNativeTarget "jucedemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84CFBCCC085F14F000C52F85 /* Debug */, + 84CFBCCD085F14F000C52F85 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 84CFBCCF085F14F000C52F85 /* Build configuration list for PBXProject "jucedemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84CFBCD0085F14F000C52F85 /* Debug */, + 84CFBCD1085F14F000C52F85 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 20286C28FDCF999611CA2CEA /* Project object */; +} diff --git a/extras/juce demo/build/macosx/version.plist b/extras/juce demo/build/macosx/version.plist new file mode 100644 index 0000000000..a293201869 --- /dev/null +++ b/extras/juce demo/build/macosx/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 17 + CFBundleShortVersionString + 0.1 + CFBundleVersion + 0.1 + ProjectName + NibPBTemplates + SourceVersion + 1150000 + + diff --git a/extras/juce demo/build/win32_devcpp/JuceDemo.dev b/extras/juce demo/build/win32_devcpp/JuceDemo.dev new file mode 100644 index 0000000000..4729f18c35 --- /dev/null +++ b/extras/juce demo/build/win32_devcpp/JuceDemo.dev @@ -0,0 +1,209 @@ +[Project] +FileName=JuceDemo.dev +Name=JuceDemo +UnitCount=16 +Type=0 +Ver=1 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler=-DJUCE_USE_FLAC 0_@@_-D JUCE_USE_OGGVORBIS 0_@@_ +Linker=../../../../bin/libjuce.a_@@_-lwininet_@@_-lole32_@@_-lwinmm_@@_-lgdi32_@@_-luuid_@@_-lshell32_@@_-lvfw32_@@_-lrpcrt4_@@_-lopengl32_@@_-lglu32_@@_-lwsock32_@@_ +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +OverrideOutput=0 +OverrideOutputName=JuceDemo.exe +HostApplication= +Folders=src,src/demos +CommandLine= +UseCustomMakefile=0 +CustomMakefile= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000001000000000000000 + +[Unit1] +FileName=..\..\src\ApplicationStartup.cpp +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=..\..\src\BinaryData.cpp +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=..\..\src\BinaryData.h +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=..\..\src\jucedemo_headers.h +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=..\..\src\MainDemoWindow.cpp +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=..\..\src\MainDemoWindow.h +CompileCpp=1 +Folder=src +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=..\..\src\demos\DragAndDropDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=..\..\src\demos\FontsAndTextDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit10] +FileName=..\..\src\demos\OpenGLDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit11] +FileName=..\..\src\demos\PathsAndTransformsDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit12] +FileName=..\..\src\demos\ThreadingDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit13] +FileName=..\..\src\demos\TreeViewDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit14] +FileName=..\..\src\demos\WidgetsDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit7] +FileName=..\..\src\demos\AudioDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit15] +FileName=..\..\src\demos\InterprocessCommsDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit16] +FileName=..\..\src\demos\TableDemo.cpp +CompileCpp=1 +Folder=src/demos +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/extras/juce demo/build/win32_devcpp/Makefile.win b/extras/juce demo/build/win32_devcpp/Makefile.win new file mode 100644 index 0000000000..2982fe16d9 --- /dev/null +++ b/extras/juce demo/build/win32_devcpp/Makefile.win @@ -0,0 +1,66 @@ +# Project: JuceDemo +# Makefile created by Dev-C++ 4.9.9.2 + +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +RES = +OBJ = ../../src/ApplicationStartup.o ../../src/BinaryData.o ../../src/MainDemoWindow.o ../../src/demos/AudioDemo.o ../../src/demos/DragAndDropDemo.o ../../src/demos/FontsAndTextDemo.o ../../src/demos/OpenGLDemo.o ../../src/demos/PathsAndTransformsDemo.o ../../src/demos/ThreadingDemo.o ../../src/demos/TreeViewDemo.o ../../src/demos/WidgetsDemo.o ../../src/demos/InterprocessCommsDemo.o ../../src/demos/TableDemo.o $(RES) +LINKOBJ = ../../src/ApplicationStartup.o ../../src/BinaryData.o ../../src/MainDemoWindow.o ../../src/demos/AudioDemo.o ../../src/demos/DragAndDropDemo.o ../../src/demos/FontsAndTextDemo.o ../../src/demos/OpenGLDemo.o ../../src/demos/PathsAndTransformsDemo.o ../../src/demos/ThreadingDemo.o ../../src/demos/TreeViewDemo.o ../../src/demos/WidgetsDemo.o ../../src/demos/InterprocessCommsDemo.o ../../src/demos/TableDemo.o $(RES) +LIBS = -L"C:/prog/Dev-Cpp/lib" -L"C:/essentials/QT6 SDK (Win)/Interfaces & Libraries/QTDevWin/Libraries" -mwindows ../../../../bin/libjuce.a -lwininet -lole32 -lwinmm -lgdi32 -luuid -lshell32 -lvfw32 -lrpcrt4 -lopengl32 -lglu32 -lwsock32 +INCS = -I"C:/prog/Dev-Cpp/include" +CXXINCS = -I"C:/prog/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/prog/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/prog/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/prog/Dev-Cpp/include/c++/3.4.2" -I"C:/prog/Dev-Cpp/include" -I"C:/essentials/asiosdk2/common" -I"C:/essentials/QT6 SDK (Win)/Interfaces & Libraries/QTDevWin/CIncludes" -I"c:/program files/QuickTime" +BIN = JuceDemo.exe +CXXFLAGS = $(CXXINCS) -DJUCE_USE_FLAC 0 -D JUCE_USE_OGGVORBIS 0 -Wall -fexceptions +CFLAGS = $(INCS) -Wall -fexceptions +RM = rm -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before JuceDemo.exe all-after + + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CPP) $(LINKOBJ) -o "JuceDemo.exe" $(LIBS) + +../../src/ApplicationStartup.o: ../../src/ApplicationStartup.cpp + $(CPP) -c ../../src/ApplicationStartup.cpp -o ../../src/ApplicationStartup.o $(CXXFLAGS) + +../../src/BinaryData.o: ../../src/BinaryData.cpp + $(CPP) -c ../../src/BinaryData.cpp -o ../../src/BinaryData.o $(CXXFLAGS) + +../../src/MainDemoWindow.o: ../../src/MainDemoWindow.cpp + $(CPP) -c ../../src/MainDemoWindow.cpp -o ../../src/MainDemoWindow.o $(CXXFLAGS) + +../../src/demos/AudioDemo.o: ../../src/demos/AudioDemo.cpp + $(CPP) -c ../../src/demos/AudioDemo.cpp -o ../../src/demos/AudioDemo.o $(CXXFLAGS) + +../../src/demos/DragAndDropDemo.o: ../../src/demos/DragAndDropDemo.cpp + $(CPP) -c ../../src/demos/DragAndDropDemo.cpp -o ../../src/demos/DragAndDropDemo.o $(CXXFLAGS) + +../../src/demos/FontsAndTextDemo.o: ../../src/demos/FontsAndTextDemo.cpp + $(CPP) -c ../../src/demos/FontsAndTextDemo.cpp -o ../../src/demos/FontsAndTextDemo.o $(CXXFLAGS) + +../../src/demos/OpenGLDemo.o: ../../src/demos/OpenGLDemo.cpp + $(CPP) -c ../../src/demos/OpenGLDemo.cpp -o ../../src/demos/OpenGLDemo.o $(CXXFLAGS) + +../../src/demos/PathsAndTransformsDemo.o: ../../src/demos/PathsAndTransformsDemo.cpp + $(CPP) -c ../../src/demos/PathsAndTransformsDemo.cpp -o ../../src/demos/PathsAndTransformsDemo.o $(CXXFLAGS) + +../../src/demos/ThreadingDemo.o: ../../src/demos/ThreadingDemo.cpp + $(CPP) -c ../../src/demos/ThreadingDemo.cpp -o ../../src/demos/ThreadingDemo.o $(CXXFLAGS) + +../../src/demos/TreeViewDemo.o: ../../src/demos/TreeViewDemo.cpp + $(CPP) -c ../../src/demos/TreeViewDemo.cpp -o ../../src/demos/TreeViewDemo.o $(CXXFLAGS) + +../../src/demos/WidgetsDemo.o: ../../src/demos/WidgetsDemo.cpp + $(CPP) -c ../../src/demos/WidgetsDemo.cpp -o ../../src/demos/WidgetsDemo.o $(CXXFLAGS) + +../../src/demos/InterprocessCommsDemo.o: ../../src/demos/InterprocessCommsDemo.cpp + $(CPP) -c ../../src/demos/InterprocessCommsDemo.cpp -o ../../src/demos/InterprocessCommsDemo.o $(CXXFLAGS) + +../../src/demos/TableDemo.o: ../../src/demos/TableDemo.cpp + $(CPP) -c ../../src/demos/TableDemo.cpp -o ../../src/demos/TableDemo.o $(CXXFLAGS) diff --git a/extras/juce demo/build/win32_vc6/jucedemo.dsp b/extras/juce demo/build/win32_vc6/jucedemo.dsp new file mode 100644 index 0000000000..99c1105812 --- /dev/null +++ b/extras/juce demo/build/win32_vc6/jucedemo.dsp @@ -0,0 +1,168 @@ +# Microsoft Developer Studio Project File - Name="jucedemo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=jucedemo - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "jucedemo.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "jucedemo.mak" CFG="jucedemo - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "jucedemo - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "jucedemo - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "jucedemo - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib /nologo /subsystem:windows /machine:I386 /libpath:"../../../bin" + +!ELSEIF "$(CFG)" == "jucedemo - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"../../../bin" +# SUBTRACT LINK32 /nodefaultlib + +!ENDIF + +# Begin Target + +# Name "jucedemo - Win32 Release" +# Name "jucedemo - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Group "demos" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\demos\AudioDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\DragAndDropDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\FontsAndTextDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\InterprocessCommsDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\OpenGLDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\PathsAndTransformsDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\QuickTimeDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\TableDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\ThreadingDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\TreeViewDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\demos\WidgetsDemo.cpp +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\src\ApplicationStartup.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\BinaryData.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\jucedemo_headers.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\MainDemoWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\MainDemoWindow.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/extras/juce demo/build/win32_vc6/jucedemo.dsw b/extras/juce demo/build/win32_vc6/jucedemo.dsw new file mode 100644 index 0000000000..deb59612bc --- /dev/null +++ b/extras/juce demo/build/win32_vc6/jucedemo.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "JUCE"=..\..\..\build\win32\vc6\JUCE.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "jucedemo"=.\jucedemo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name JUCE + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/extras/juce demo/build/win32_vc8/jucedemo.sln b/extras/juce demo/build/win32_vc8/jucedemo.sln new file mode 100644 index 0000000000..197f8550c5 --- /dev/null +++ b/extras/juce demo/build/win32_vc8/jucedemo.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jucedemo", "jucedemo.vcproj", "{050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}" + ProjectSection(ProjectDependencies) = postProject + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} = {AE232C11-D91C-4CA1-B24E-8B11A52EFF26} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JUCE", "..\..\..\..\build\win32\vc8\JUCE.vcproj", "{AE232C11-D91C-4CA1-B24E-8B11A52EFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Release|Win32 = DLL Release|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.Debug|Win32.ActiveCfg = Debug|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.Debug|Win32.Build.0 = Debug|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.DLL Debug|Win32.Build.0 = Debug|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.DLL Release|Win32.ActiveCfg = Release|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.DLL Release|Win32.Build.0 = Release|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.Release|Win32.ActiveCfg = Release|Win32 + {050D65C2-17C4-4EE1-ABCE-BEA9DA83D77A}.Release|Win32.Build.0 = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AE232C11-D91C-4CA1-B24E-8B11A52EFF26}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extras/juce demo/build/win32_vc8/jucedemo.vcproj b/extras/juce demo/build/win32_vc8/jucedemo.vcproj new file mode 100644 index 0000000000..4247934daa --- /dev/null +++ b/extras/juce demo/build/win32_vc8/jucedemo.vcproj @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/juce demo/src/ApplicationStartup.cpp b/extras/juce demo/src/ApplicationStartup.cpp new file mode 100644 index 0000000000..cd90290402 --- /dev/null +++ b/extras/juce demo/src/ApplicationStartup.cpp @@ -0,0 +1,178 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "jucedemo_headers.h" +#include "MainDemoWindow.h" + + +//============================================================================== +class JUCEDemoApplication : public JUCEApplication +{ + /* Important! NEVER embed objects directly inside your JUCEApplication class! Use + ONLY pointers to objects, which you should create during the initialise() method + (NOT in the constructor!) and delete in the shutdown() method (NOT in the + destructor!) + + This is because the application object gets created before Juce has been properly + initialised, so any embedded objects would also get constructed too soon. + */ + MainDemoWindow* theMainWindow; + +public: + //============================================================================== + JUCEDemoApplication() + : theMainWindow (0) + { + // NEVER do anything in here that could involve any Juce function being called + // - leave all your startup tasks until the initialise() method. + } + + ~JUCEDemoApplication() + { + // Your shutdown() method should already have done all the things necessary to + // clean up this app object, so you should never need to put anything in + // the destructor. + + // Making any Juce calls in here could be very dangerous... + } + + //============================================================================== + void initialise (const String& commandLine) + { + // just create the main window... + theMainWindow = new MainDemoWindow(); + theMainWindow->centreWithSize (700, 600); + theMainWindow->setVisible (true); + + // this little function just demonstrates a few system info calls + Logger::outputDebugString (collectSomeSystemInfo()); + + /* on return from this method, the app will go into its the main event + dispatch loop, and this will run until something calls + JUCEAppliction::quit(). + + In this case, JUCEAppliction::quit() will be called by the + demo window when the user clicks on its close button. + */ + } + + void shutdown() + { + delete theMainWindow; + theMainWindow = 0; + } + + //============================================================================== + const String getApplicationName() + { + return T("JUCE Demo"); + } + + const String getApplicationVersion() + { + return T("1.0"); + } + + bool moreThanOneInstanceAllowed() + { + return true; + } + + void anotherInstanceStarted (const String& commandLine) + { + // This will get called if the user launches another copy of the app, but + // there's nothing that the demo app needs to do here. + } + +private: + //============================================================================== + // this little function just demonstrates a few system info calls + static const String collectSomeSystemInfo() + { + String systemInfo; + + systemInfo + << T("Time and date: ") << Time::getCurrentTime().toString (true, true) + << T("\nOperating system: ") << SystemStats::getOperatingSystemName() + << T("\nCPU vendor: ") << SystemStats::getCpuVendor() + << T("\nCPU speed: ") << SystemStats::getCpuSpeedInMegaherz() << T("MHz\n") + << T("\nNumber of physical CPUs: ") << SystemStats::getNumPhysicalCpus() + << T("\nNumber of logical CPUs: ") << SystemStats::getNumLogicalCpus() + << T("\nCPU has MMX: ") << (SystemStats::hasMMX() ? T("yes") : T("no")) + << T("\nCPU has SSE: ") << (SystemStats::hasSSE() ? T("yes") : T("no")) + << T("\nCPU has SSE2: ") << (SystemStats::hasSSE2() ? T("yes") : T("no")) + << T("\nCPU has 3DNOW: ") << (SystemStats::has3DNow() ? T("yes") : T("no")) + << T("\nCPU has hyperthreading: ") << (SystemStats::hasHyperThreading() ? T("yes") : T("no")) + << T("\nMemory size: ") << SystemStats::getMemorySizeInMegabytes() << T("MB\n"); + + int64 macAddresses[8]; + const int numAddresses = SystemStats::getMACAddresses (macAddresses, 8); + + for (int i = 0; i < numAddresses; ++i) + { + systemInfo + << T("Found network card MAC address: ") + << String::formatted (T("%02x-%02x-%02x-%02x-%02x-%02x\n"), + 0xff & (int) (macAddresses [i] >> 40), + 0xff & (int) (macAddresses [i] >> 32), + 0xff & (int) (macAddresses [i] >> 24), + 0xff & (int) (macAddresses [i] >> 16), + 0xff & (int) (macAddresses [i] >> 8), + 0xff & (int) macAddresses [i]); + } + + systemInfo + << T("Current executable file: ") + << File::getSpecialLocation (File::currentExecutableFile).getFullPathName() + << T("\nCurrent application file: ") + << File::getSpecialLocation (File::currentApplicationFile).getFullPathName() + << T("\nUser home directory: ") + << File::getSpecialLocation (File::userHomeDirectory).getFullPathName() + << T("\nUser documents directory: ") + << File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName() + << T("\nUser application data directory: ") + << File::getSpecialLocation (File::userApplicationDataDirectory).getFullPathName() + << T("\nCommon application data directory: ") + << File::getSpecialLocation (File::commonApplicationDataDirectory).getFullPathName() + << T("\nTemp directory: ") + << File::getSpecialLocation (File::tempDirectory).getFullPathName() + << T("\n\n"); + + return systemInfo; + } +}; + + +//============================================================================== +/* + This macro creates the application's main() function.. +*/ +START_JUCE_APPLICATION (JUCEDemoApplication) diff --git a/extras/juce demo/src/BinaryData.cpp b/extras/juce demo/src/BinaryData.cpp new file mode 100644 index 0000000000..4e36402723 --- /dev/null +++ b/extras/juce demo/src/BinaryData.cpp @@ -0,0 +1,7816 @@ +/* (Auto-generated binary data file). */ + +#include "BinaryData.h" + +static const unsigned char temp1[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,47,42,42,32,79,117,114,32,100,101,109,111,32,115,121,110,116,104,32,111,110,108,121,32,104,97,115,32,111,110,101,32,116,121,112,101, + 32,111,102,32,115,111,117,110,100,44,32,97,110,100,32,105,116,39,115,32,118,101,114,121,32,98,97,115,105,99,46,46,13,10,42,47,13,10,99,108, + 97,115,115,32,83,105,110,101,87,97,118,101,83,111,117,110,100,32,58,32,112,117,98,108,105,99,32,83,121,110,116,104,101,115,105,115,101,114,83,111, + 117,110,100,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,83,105,110,101,87,97,118,101,83,111,117,110,100,32,40,99,111,110,115, + 116,32,66,105,116,65,114,114,97,121,38,32,109,105,100,105,78,111,116,101,115,95,41,13,10,32,32,32,32,32,32,32,32,58,32,109,105,100,105,78, + 111,116,101,115,32,40,109,105,100,105,78,111,116,101,115,95,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,98, + 111,111,108,32,97,112,112,108,105,101,115,84,111,78,111,116,101,32,40,99,111,110,115,116,32,105,110,116,32,109,105,100,105,78,111,116,101,78,117,109, + 98,101,114,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,105,100,105,78,111,116,101,115,32,91,109, + 105,100,105,78,111,116,101,78,117,109,98,101,114,93,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,98,111,111,108,32,97,112,112,108,105, + 101,115,84,111,67,104,97,110,110,101,108,32,40,99,111,110,115,116,32,105,110,116,32,109,105,100,105,67,104,97,110,110,101,108,41,32,32,32,32,32, + 32,32,32,32,32,32,123,32,114,101,116,117,114,110,32,116,114,117,101,59,32,125,13,10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32, + 47,47,32,116,104,105,115,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,32,110,111,116,101,115,32,116,104,97,116,32,116,104,105,115, + 32,115,111,117,110,100,32,105,115,32,97,116,116,97,99,104,101,100,32,116,111,46,13,10,32,32,32,32,66,105,116,65,114,114,97,121,32,109,105,100, + 105,78,111,116,101,115,59,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,47,42,42,32,79,117,114,32,100,101,109,111,32,115,121,110,116,104,32,118,111, + 105,99,101,32,106,117,115,116,32,112,108,97,121,115,32,97,32,115,105,110,101,32,119,97,118,101,46,46,13,10,42,47,13,10,99,108,97,115,115,32, + 83,105,110,101,87,97,118,101,86,111,105,99,101,32,32,58,32,112,117,98,108,105,99,32,83,121,110,116,104,101,115,105,115,101,114,86,111,105,99,101, + 13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,83,105,110,101,87,97,118,101,86,111,105,99,101,40,41,13,10,32,32,32,32,32, + 32,32,32,58,32,97,110,103,108,101,68,101,108,116,97,32,40,48,46,48,41,44,13,10,32,32,32,32,32,32,32,32,32,32,116,97,105,108,79,102, + 102,32,40,48,46,48,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,98,111,111,108,32,99,97,110,80,108,97, + 121,83,111,117,110,100,32,40,83,121,110,116,104,101,115,105,115,101,114,83,111,117,110,100,42,32,115,111,117,110,100,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,121,110,97,109,105,99,95,99,97,115,116,32,60,83,105,110,101,87,97,118,101,83,111, + 117,110,100,42,62,32,40,115,111,117,110,100,41,32,33,61,32,48,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,115, + 116,97,114,116,78,111,116,101,32,40,99,111,110,115,116,32,105,110,116,32,109,105,100,105,78,111,116,101,78,117,109,98,101,114,44,32,99,111,110,115, + 116,32,102,108,111,97,116,32,118,101,108,111,99,105,116,121,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83, + 121,110,116,104,101,115,105,115,101,114,83,111,117,110,100,42,32,115,111,117,110,100,44,32,99,111,110,115,116,32,105,110,116,32,99,117,114,114,101,110, + 116,80,105,116,99,104,87,104,101,101,108,80,111,115,105,116,105,111,110,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,99,117,114, + 114,101,110,116,65,110,103,108,101,32,61,32,48,46,48,59,13,10,32,32,32,32,32,32,32,32,108,101,118,101,108,32,61,32,118,101,108,111,99,105, + 116,121,32,42,32,48,46,49,53,59,13,10,32,32,32,32,32,32,32,32,116,97,105,108,79,102,102,32,61,32,48,46,48,59,13,10,13,10,32,32, + 32,32,32,32,32,32,100,111,117,98,108,101,32,99,121,99,108,101,115,80,101,114,83,101,99,111,110,100,32,61,32,77,105,100,105,77,101,115,115,97, + 103,101,58,58,103,101,116,77,105,100,105,78,111,116,101,73,110,72,101,114,116,122,32,40,109,105,100,105,78,111,116,101,78,117,109,98,101,114,41,59, + 13,10,32,32,32,32,32,32,32,32,100,111,117,98,108,101,32,99,121,99,108,101,115,80,101,114,83,97,109,112,108,101,32,61,32,99,121,99,108,101, + 115,80,101,114,83,101,99,111,110,100,32,47,32,103,101,116,83,97,109,112,108,101,82,97,116,101,40,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,97,110,103,108,101,68,101,108,116,97,32,61,32,99,121,99,108,101,115,80,101,114,83,97,109,112,108,101,32,42,32,50,46,48,32,42,32,100,111, + 117,98,108,101,95,80,105,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,115,116,111,112,78,111,116,101,32,40,99,111, + 110,115,116,32,98,111,111,108,32,97,108,108,111,119,84,97,105,108,79,102,102,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105, + 102,32,40,97,108,108,111,119,84,97,105,108,79,102,102,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,47,47,32,115,116,97,114,116,32,97,32,116,97,105,108,45,111,102,102,32,98,121,32,115,101,116,116,105,110,103,32,116,104,105,115,32,102,108,97, + 103,46,32,84,104,101,32,114,101,110,100,101,114,32,99,97,108,108,98,97,99,107,32,119,105,108,108,32,112,105,99,107,32,117,112,32,111,110,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115,32,97,110,100,32,100,111,32,97,32,102,97,100,101,32,111,117,116,44,32,99, + 97,108,108,105,110,103,32,99,108,101,97,114,67,117,114,114,101,110,116,78,111,116,101,40,41,32,119,104,101,110,32,105,116,39,115,32,102,105,110,105, + 115,104,101,100,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,97,105,108,79,102,102,32,61,61,32,48,46,48,41, + 32,47,47,32,119,101,32,111,110,108,121,32,110,101,101,100,32,116,111,32,98,101,103,105,110,32,97,32,116,97,105,108,45,111,102,102,32,105,102,32, + 105,116,39,115,32,110,111,116,32,97,108,114,101,97,100,121,32,100,111,105,110,103,32,115,111,32,45,32,116,104,101,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,115,116,111,112,78,111,116,101,32,109,101,116, + 104,111,100,32,99,111,117,108,100,32,98,101,32,99,97,108,108,101,100,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,46,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,116,97,105,108,79,102,102,32,61,32,49,46,48,59,13,10,32,32,32,32,32,32,32,32,125,13,10, + 32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32, + 119,101,39,114,101,32,98,101,105,110,103,32,116,111,108,100,32,116,111,32,115,116,111,112,32,112,108,97,121,105,110,103,32,105,109,109,101,100,105,97, + 116,101,108,121,44,32,115,111,32,114,101,115,101,116,32,101,118,101,114,121,116,104,105,110,103,46,46,13,10,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,99,108,101,97,114,67,117,114,114,101,110,116,78,111,116,101,40,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,110,103,108, + 101,68,101,108,116,97,32,61,32,48,46,48,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118, + 111,105,100,32,112,105,116,99,104,87,104,101,101,108,77,111,118,101,100,32,40,99,111,110,115,116,32,105,110,116,32,110,101,119,86,97,108,117,101,41, + 13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,99,97,110,39,116,32,98,101,32,98,111,116,104,101,114,101,100,32,105,109, + 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,102,111,114,32,116,104,101,32,100,101,109,111,33,13,10,32,32,32,32,125,13,10,13,10, + 32,32,32,32,118,111,105,100,32,99,111,110,116,114,111,108,108,101,114,77,111,118,101,100,32,40,99,111,110,115,116,32,105,110,116,32,99,111,110,116, + 114,111,108,108,101,114,78,117,109,98,101,114,44,32,99,111,110,115,116,32,105,110,116,32,110,101,119,86,97,108,117,101,41,13,10,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,47,47,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,99,111,110,116,114,111,108,108,101, + 114,115,32,105,110,32,116,104,105,115,32,99,97,115,101,46,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,110,100, + 101,114,78,101,120,116,66,108,111,99,107,32,40,65,117,100,105,111,83,97,109,112,108,101,66,117,102,102,101,114,38,32,111,117,116,112,117,116,66,117, + 102,102,101,114,44,32,105,110,116,32,115,116,97,114,116,83,97,109,112,108,101,44,32,105,110,116,32,110,117,109,83,97,109,112,108,101,115,41,13,10, + 32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,97,110,103,108,101,68,101,108,116,97,32,33,61,32,48,46,48,41,13,10,32, + 32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,97,105,108,79,102,102,32,62,32,48,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,119,104,105,108,101,32,40,45,45, + 110,117,109,83,97,109,112,108,101,115,32,62,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,102,108,111,97,116,32,99,117,114,114,101,110,116,83,97,109,112, + 108,101,32,61,32,40,102,108,111,97,116,41,32,40,115,105,110,32,40,99,117,114,114,101,110,116,65,110,103,108,101,41,32,42,32,108,101,118,101,108, + 32,42,32,116,97,105,108,79,102,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32, + 40,105,110,116,32,105,32,61,32,111,117,116,112,117,116,66,117,102,102,101,114,46,103,101,116,78,117,109,67,104,97,110,110,101,108,115,40,41,59,32, + 45,45,105,32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,111,117,116, + 112,117,116,66,117,102,102,101,114,46,103,101,116,83,97,109,112,108,101,68,97,116,97,32,40,105,44,32,115,116,97,114,116,83,97,109,112,108,101,41, + 32,43,61,32,99,117,114,114,101,110,116,83,97,109,112,108,101,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,99,117,114,114,101,110,116,65,110,103,108,101,32,43,61,32,97,110,103,108,101,68,101,108,116,97,59,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,43,43,115,116,97,114,116,83,97,109,112,108,101,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,116,97,105,108,79,102,102,32,42,61,32,48,46,57,57,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,105,102,32,40,116,97,105,108,79,102,102,32,60,61,32,48,46,48,48,53,41,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99, + 108,101,97,114,67,117,114,114,101,110,116,78,111,116,101,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,97,110,103,108,101,68,101,108,116,97,32,61,32,48,46,48,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,98,114,101,97,107,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,119,104,105,108,101,32,40,45,45,110,117,109,83,97,109,112,108,101,115,32,62,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,102,108,111,97,116, + 32,99,117,114,114,101,110,116,83,97,109,112,108,101,32,61,32,40,102,108,111,97,116,41,32,40,115,105,110,32,40,99,117,114,114,101,110,116,65,110, + 103,108,101,41,32,42,32,108,101,118,101,108,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111, + 114,32,40,105,110,116,32,105,32,61,32,111,117,116,112,117,116,66,117,102,102,101,114,46,103,101,116,78,117,109,67,104,97,110,110,101,108,115,40,41, + 59,32,45,45,105,32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,111, + 117,116,112,117,116,66,117,102,102,101,114,46,103,101,116,83,97,109,112,108,101,68,97,116,97,32,40,105,44,32,115,116,97,114,116,83,97,109,112,108, + 101,41,32,43,61,32,99,117,114,114,101,110,116,83,97,109,112,108,101,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,99,117,114,114,101,110,116,65,110,103,108,101,32,43,61,32,97,110,103,108,101,68,101,108,116,97,59,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,43,43,115,116,97,114,116,83,97,109,112,108,101,59,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13, + 10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,100,111,117,98,108,101,32,99,117,114,114,101,110,116,65,110,103,108,101,44,32,97,110, + 103,108,101,68,101,108,116,97,44,32,108,101,118,101,108,44,32,116,97,105,108,79,102,102,59,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,47,42,42,32,84, + 104,105,115,32,105,115,32,97,110,32,97,117,100,105,111,32,115,111,117,114,99,101,32,116,104,97,116,32,115,116,114,101,97,109,115,32,116,104,101,32, + 111,117,116,112,117,116,32,111,102,32,111,117,114,32,100,101,109,111,32,115,121,110,116,104,46,13,10,42,47,13,10,99,108,97,115,115,32,83,121,110, + 116,104,65,117,100,105,111,83,111,117,114,99,101,32,32,58,32,112,117,98,108,105,99,32,65,117,100,105,111,83,111,117,114,99,101,13,10,123,13,10, + 112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,116,104,105,115,32,99,111,108,108,101,99,116,115,32,114,101,97,108, + 45,116,105,109,101,32,109,105,100,105,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,116,104,101,32,109,105,100,105,32,105,110,112,117,116,32, + 100,101,118,105,99,101,44,32,97,110,100,13,10,32,32,32,32,47,47,32,116,117,114,110,115,32,116,104,101,109,32,105,110,116,111,32,98,108,111,99, + 107,115,32,116,104,97,116,32,119,101,32,99,97,110,32,112,114,111,99,101,115,115,32,105,110,32,111,117,114,32,97,117,100,105,111,32,99,97,108,108, + 98,97,99,107,13,10,32,32,32,32,77,105,100,105,77,101,115,115,97,103,101,67,111,108,108,101,99,116,111,114,32,109,105,100,105,67,111,108,108,101, + 99,116,111,114,59,13,10,13,10,32,32,32,32,47,47,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,115,116,97,116, + 101,32,111,102,32,119,104,105,99,104,32,107,101,121,115,32,111,110,32,111,117,114,32,111,110,45,115,99,114,101,101,110,32,107,101,121,98,111,97,114, + 100,32,97,114,101,32,104,101,108,100,13,10,32,32,32,32,47,47,32,100,111,119,110,46,32,87,104,101,110,32,116,104,101,32,109,111,117,115,101,32, + 105,115,32,99,108,105,99,107,101,100,32,111,110,32,116,104,101,32,107,101,121,98,111,97,114,100,32,99,111,109,112,111,110,101,110,116,44,32,116,104, + 105,115,32,111,98,106,101,99,116,32,97,108,115,111,13,10,32,32,32,32,47,47,32,103,101,110,101,114,97,116,101,115,32,109,105,100,105,32,109,101, + 115,115,97,103,101,115,32,102,111,114,32,116,104,105,115,44,32,119,104,105,99,104,32,119,101,32,99,97,110,32,112,97,115,115,32,111,110,32,116,111, + 32,111,117,114,32,115,121,110,116,104,46,13,10,32,32,32,32,77,105,100,105,75,101,121,98,111,97,114,100,83,116,97,116,101,32,107,101,121,98,111, + 97,114,100,83,116,97,116,101,59,13,10,13,10,32,32,32,32,47,47,32,116,104,101,32,115,121,110,116,104,32,105,116,115,101,108,102,33,13,10,32, + 32,32,32,83,121,110,116,104,101,115,105,115,101,114,32,115,121,110,116,104,59,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,83,121,110,116,104, + 65,117,100,105,111,83,111,117,114,99,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,119,101,39,108,108,32,98, + 101,32,109,105,120,105,110,103,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,115,111,117,110,100,44,32,115, + 111,32,104,101,114,101,32,119,101,39,108,108,32,99,114,101,97,116,101,32,116,119,111,13,10,32,32,32,32,32,32,32,32,47,47,32,115,101,116,115, + 32,111,102,32,110,111,116,101,32,109,97,112,115,44,32,112,117,116,116,105,110,103,32,101,97,99,104,32,115,111,117,110,100,32,111,110,32,97,32,100, + 105,102,102,101,114,101,110,116,32,111,99,116,97,118,101,32,111,102,32,116,104,101,32,107,101,121,98,111,97,114,100,58,13,10,32,32,32,32,32,32, + 32,32,66,105,116,65,114,114,97,121,32,115,105,110,101,119,97,118,101,78,111,116,101,115,44,32,115,97,109,112,108,101,114,78,111,116,101,115,59,13, + 10,13,10,32,32,32,32,32,32,32,32,105,110,116,32,105,59,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,32,61,32,48,59,32,105, + 32,60,32,49,50,56,59,32,43,43,105,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32, + 40,40,40,105,32,47,32,49,50,41,32,38,32,49,41,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115, + 105,110,101,119,97,118,101,78,111,116,101,115,46,115,101,116,66,105,116,32,40,105,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108, + 115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,97,109,112,108,101,114,78,111,116,101,115,46,115,101,116,66,105,116,32, + 40,105,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,97,100,100,32,97,32,119,97,118,101, + 32,115,111,117,110,100,44,32,119,104,105,99,104,32,119,105,108,108,32,103,101,116,32,97,112,112,108,105,101,100,32,116,111,32,115,111,109,101,32,111, + 102,32,116,104,101,32,110,111,116,101,115,46,46,13,10,32,32,32,32,32,32,32,32,115,121,110,116,104,46,97,100,100,83,111,117,110,100,32,40,110, + 101,119,32,83,105,110,101,87,97,118,101,83,111,117,110,100,32,40,115,105,110,101,119,97,118,101,78,111,116,101,115,41,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,47,47,32,103,105,118,101,32,111,117,114,32,115,121,110,116,104,32,97,32,102,101,119,32,118,111,105,99,101,115,32,116,104,97, + 116,32,99,97,110,32,112,108,97,121,32,116,104,101,32,119,97,118,101,32,115,111,117,110,100,46,46,13,10,32,32,32,32,32,32,32,32,102,111,114, + 32,40,105,32,61,32,52,59,32,45,45,105,32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,121,110,116,104,46,97, + 100,100,86,111,105,99,101,32,40,110,101,119,32,83,105,110,101,87,97,118,101,86,111,105,99,101,40,41,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,87,97,118,65,117,100,105,111,70,111,114,109,97,116,32,119,97,118,70,111,114,109,97,116,59,13,10,32,32,32,32,32,32,32,32,65,117,100, + 105,111,70,111,114,109,97,116,82,101,97,100,101,114,42,32,97,117,100,105,111,82,101,97,100,101,114,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,61,32,119,97,118,70,111,114,109,97,116,46,99,114,101,97,116,101,82,101,97,100,101,114,70,111,114,32,40,110,101,119,32,77,101,109,111,114,121, + 73,110,112,117,116,83,116,114,101,97,109,32,40,66,105,110,97,114,121,68,97,116,97,58,58,99,101,108,108,111,95,119,97,118,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,66,105,110,97,114,121,68,97,116,97,58,58,99,101,108,108,111,95,119, + 97,118,83,105,122,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,97,108,115,101,41,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,121,110,116,104,46,97,100,100,83,111,117,110,100,32,40,110,101,119, + 32,83,97,109,112,108,101,114,83,111,117,110,100,32,40,84,40,34,100,101,109,111,32,115,111,117,110,100,34,41,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,97,117,100,105, + 111,82,101,97,100,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,115,97,109,112,108,101,114,78,111,116,101,115,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,55,52,44,32,32,32,47,47,32,114,111, + 111,116,32,109,105,100,105,32,110,111,116,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,46,49,44,32,32,47,47,32,97,116,116,97,99,107,32,116,105,109,101,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 48,46,49,44,32,32,47,47,32,114,101,108,101,97,115,101,32,116,105,109,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,49,48,46,48,32,32,47,47,32,109,97,120,105,109,117, + 109,32,115,97,109,112,108,101,32,108,101,110,103,116,104,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101, + 32,97,117,100,105,111,82,101,97,100,101,114,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,97,110,100,32,103,105,118,101,32,116,104,101, + 32,115,121,110,116,104,32,115,111,109,101,32,115,97,109,112,108,101,114,32,118,111,105,99,101,115,32,116,111,32,112,108,97,121,32,116,104,101,32,115, + 97,109,112,108,101,100,32,115,111,117,110,100,46,46,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,32,61,32,52,59,32,45,45,105,32, + 62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,121,110,116,104,46,97,100,100,86,111,105,99,101,32,40,110,101,119,32, + 83,97,109,112,108,101,114,86,111,105,99,101,40,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,114,101,112, + 97,114,101,84,111,80,108,97,121,32,40,105,110,116,32,115,97,109,112,108,101,115,80,101,114,66,108,111,99,107,69,120,112,101,99,116,101,100,44,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,111,117,98,108,101,32,115,97,109,112,108,101,82,97, + 116,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,109,105,100,105,67,111,108,108,101,99,116,111,114,46,114,101,115,101,116,32, + 40,115,97,109,112,108,101,82,97,116,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,121,110,116,104,46,115,101,116,67,117,114,114,101,110, + 116,80,108,97,121,98,97,99,107,83,97,109,112,108,101,82,97,116,101,32,40,115,97,109,112,108,101,82,97,116,101,41,59,13,10,32,32,32,32,125, + 13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,108,101,97,115,101,82,101,115,111,117,114,99,101,115,40,41,13,10,32,32,32,32,123,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,103,101,116,78,101,120,116,65,117,100,105,111,66,108,111,99,107,32,40,99,111,110, + 115,116,32,65,117,100,105,111,83,111,117,114,99,101,67,104,97,110,110,101,108,73,110,102,111,38,32,98,117,102,102,101,114,84,111,70,105,108,108,41, + 13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,115,121,110,116,104,32,97,108,119,97,121,115,32,97,100,100, + 115,32,105,116,115,32,111,117,116,112,117,116,32,116,111,32,116,104,101,32,97,117,100,105,111,32,98,117,102,102,101,114,44,32,115,111,32,119,101,32, + 104,97,118,101,32,116,111,32,99,108,101,97,114,32,105,116,13,10,32,32,32,32,32,32,32,32,47,47,32,102,105,114,115,116,46,46,13,10,32,32, + 32,32,32,32,32,32,98,117,102,102,101,114,84,111,70,105,108,108,46,99,108,101,97,114,65,99,116,105,118,101,66,117,102,102,101,114,82,101,103,105, + 111,110,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,102,105,108,108,32,97,32,109,105,100,105,32,98,117,102,102,101,114,32,119, + 105,116,104,32,105,110,99,111,109,105,110,103,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,116,104,101,32,109,105,100,105,32,105,110,112,117, + 116,46,13,10,32,32,32,32,32,32,32,32,77,105,100,105,66,117,102,102,101,114,32,105,110,99,111,109,105,110,103,77,105,100,105,59,13,10,32,32, + 32,32,32,32,32,32,109,105,100,105,67,111,108,108,101,99,116,111,114,46,114,101,109,111,118,101,78,101,120,116,66,108,111,99,107,79,102,77,101,115, + 115,97,103,101,115,32,40,105,110,99,111,109,105,110,103,77,105,100,105,44,32,98,117,102,102,101,114,84,111,70,105,108,108,46,110,117,109,83,97,109, + 112,108,101,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,112,97,115,115,32,116,104,101,115,101,32,109,101,115,115,97,103,101,115, + 32,116,111,32,116,104,101,32,107,101,121,98,111,97,114,100,32,115,116,97,116,101,32,115,111,32,116,104,97,116,32,105,116,32,99,97,110,32,117,112, + 100,97,116,101,32,116,104,101,32,99,111,109,112,111,110,101,110,116,13,10,32,32,32,32,32,32,32,32,47,47,32,116,111,32,115,104,111,119,32,111, + 110,45,115,99,114,101,101,110,32,119,104,105,99,104,32,107,101,121,115,32,97,114,101,32,98,101,105,110,103,32,112,114,101,115,115,101,100,32,111,110, + 32,116,104,101,32,112,104,121,115,105,99,97,108,32,109,105,100,105,32,107,101,121,98,111,97,114,100,46,13,10,32,32,32,32,32,32,32,32,47,47, + 32,84,104,105,115,32,99,97,108,108,32,119,105,108,108,32,97,108,115,111,32,97,100,100,32,109,105,100,105,32,109,101,115,115,97,103,101,115,32,116, + 111,32,116,104,101,32,98,117,102,102,101,114,32,119,104,105,99,104,32,119,101,114,101,32,103,101,110,101,114,97,116,101,100,32,98,121,13,10,32,32, + 32,32,32,32,32,32,47,47,32,116,104,101,32,109,111,117,115,101,45,99,108,105,99,107,105,110,103,32,111,110,32,116,104,101,32,111,110,45,115,99, + 114,101,101,110,32,107,101,121,98,111,97,114,100,46,13,10,32,32,32,32,32,32,32,32,107,101,121,98,111,97,114,100,83,116,97,116,101,46,112,114, + 111,99,101,115,115,78,101,120,116,77,105,100,105,66,117,102,102,101,114,32,40,105,110,99,111,109,105,110,103,77,105,100,105,44,32,48,44,32,98,117, + 102,102,101,114,84,111,70,105,108,108,46,110,117,109,83,97,109,112,108,101,115,44,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,47,47,32,97,110,100,32,110,111,119,32,103,101,116,32,116,104,101,32,115,121,110,116,104,32,116,111,32,112,114,111,99,101,115,115,32,116,104,101, + 32,109,105,100,105,32,101,118,101,110,116,115,32,97,110,100,32,103,101,110,101,114,97,116,101,32,105,116,115,32,111,117,116,112,117,116,46,13,10,32, + 32,32,32,32,32,32,32,115,121,110,116,104,46,114,101,110,100,101,114,78,101,120,116,66,108,111,99,107,32,40,42,98,117,102,102,101,114,84,111,70, + 105,108,108,46,98,117,102,102,101,114,44,32,105,110,99,111,109,105,110,103,77,105,100,105,44,32,48,44,32,98,117,102,102,101,114,84,111,70,105,108, + 108,46,110,117,109,83,97,109,112,108,101,115,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,65,117,100, + 105,111,73,110,112,117,116,87,97,118,101,102,111,114,109,68,105,115,112,108,97,121,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101, + 110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 112,117,98,108,105,99,32,84,105,109,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,65,117,100,105,111,73,79,68,101,118,105,99,101,67,97,108,108,98,97,99,107,13,10, + 123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,65,117,100,105,111,73,110,112,117,116,87,97,118,101,102,111,114,109,68,105,115,112,108,97, + 121,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,98,117,102,102,101,114,80,111,115,32,61,32,48,59,13,10,32,32,32,32, + 32,32,32,32,98,117,102,102,101,114,83,105,122,101,32,61,32,50,48,52,56,59,13,10,32,32,32,32,32,32,32,32,99,105,114,99,117,108,97,114, + 66,117,102,102,101,114,32,61,32,40,102,108,111,97,116,42,41,32,106,117,99,101,95,99,97,108,108,111,99,32,40,115,105,122,101,111,102,32,40,102, + 108,111,97,116,41,32,42,32,98,117,102,102,101,114,83,105,122,101,41,59,13,10,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,73,110,112, + 117,116,76,101,118,101,108,32,61,32,48,46,48,102,59,13,10,32,32,32,32,32,32,32,32,110,117,109,83,97,109,112,108,101,115,73,110,32,61,32, + 48,59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,79,112,97,113,117,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32, + 32,115,116,97,114,116,84,105,109,101,114,32,40,49,48,48,48,32,47,32,53,48,41,59,32,32,47,47,32,114,101,112,97,105,110,116,32,101,118,101, + 114,121,32,49,47,53,48,32,111,102,32,97,32,115,101,99,111,110,100,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,65,117,100,105,111, + 73,110,112,117,116,87,97,118,101,102,111,114,109,68,105,115,112,108,97,121,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,106, + 117,99,101,95,102,114,101,101,32,40,99,105,114,99,117,108,97,114,66,117,102,102,101,114,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32, + 32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,32,32,32,32,32,32,32,32,103, + 46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,108,105,103,104,116,103,114,101,101,110,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,99,111,110,115,116,32,102,108,111,97,116,32,104,97,108,102,72,101,105,103,104,116,32,61,32,103,101,116,72,101,105,103,104,116,40, + 41,32,42,32,48,46,53,102,59,13,10,13,10,32,32,32,32,32,32,32,32,105,110,116,32,98,112,32,61,32,98,117,102,102,101,114,80,111,115,59, + 13,10,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,120,32,61,32,103,101,116,87,105,100,116,104,40,41,59,32,45,45,120, + 32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110, + 116,32,115,97,109,112,108,101,115,65,103,111,32,61,32,103,101,116,87,105,100,116,104,40,41,32,45,32,120,59,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,99,111,110,115,116,32,102,108,111,97,116,32,108,101,118,101,108,32,61,32,99,105,114,99,117,108,97,114,66,117,102,102,101,114,32,91, + 40,98,112,32,43,32,98,117,102,102,101,114,83,105,122,101,32,45,32,115,97,109,112,108,101,115,65,103,111,41,32,37,32,98,117,102,102,101,114,83, + 105,122,101,93,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,108,101,118,101,108,32,62,32,48,46,48,49,102,41,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,76,105,110,101,32,40,40,102,108,111,97,116,41,32,120,44,32, + 104,97,108,102,72,101,105,103,104,116,32,45,32,104,97,108,102,72,101,105,103,104,116,32,42,32,108,101,118,101,108,44,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,102,108,111,97,116,41,32,120,44,32,104,97,108,102,72,101,105, + 103,104,116,32,43,32,104,97,108,102,72,101,105,103,104,116,32,42,32,108,101,118,101,108,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32, + 32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,116,105,109,101,114,67,97,108,108,98,97,99,107,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,97, + 100,100,83,97,109,112,108,101,32,40,99,111,110,115,116,32,102,108,111,97,116,32,115,97,109,112,108,101,41,13,10,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,99,117,114,114,101,110,116,73,110,112,117,116,76,101,118,101,108,32,43,61,32,102,97,98,115,102,32,40,115,97,109,112,108,101, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,115,97,109,112,108,101,115,84,111,65,118,101,114,97,103,101, + 32,61,32,49,50,56,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,43,43,110,117,109,83,97,109,112,108,101,115,73,110,32,62,32, + 115,97,109,112,108,101,115,84,111,65,118,101,114,97,103,101,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,99,105,114,99,117,108,97,114,66,117,102,102,101,114,32,91,98,117,102,102,101,114,80,111,115,43,43,32,37,32,98,117,102,102,101,114,83,105, + 122,101,93,32,61,32,99,117,114,114,101,110,116,73,110,112,117,116,76,101,118,101,108,32,47,32,115,97,109,112,108,101,115,84,111,65,118,101,114,97, + 103,101,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,110,117,109,83,97,109,112,108,101,115,73,110,32,61,32,48,59,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,73,110,112,117,116,76,101,118,101,108,32,61,32,48,46,48,102,59,13,10,32,32,32, + 32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,97,117,100,105,111,68,101,118,105,99,101,73,79,67, + 97,108,108,98,97,99,107,32,40,99,111,110,115,116,32,102,108,111,97,116,42,42,32,105,110,112,117,116,67,104,97,110,110,101,108,68,97,116,97,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,116,111, + 116,97,108,78,117,109,73,110,112,117,116,67,104,97,110,110,101,108,115,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,108,111,97,116,42,42,32,111,117,116,112,117,116,67,104,97,110,110,101,108,68,97,116,97,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,116,111, + 116,97,108,78,117,109,79,117,116,112,117,116,67,104,97,110,110,101,108,115,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,110,117,109,83,97,109,112,108,101,115,41,13,10,32,32,32,32,123,13,10,32, + 32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,48,59,32,105,32,60,32,116,111,116,97,108,78,117,109,73,110,112,117,116, + 67,104,97,110,110,101,108,115,59,32,43,43,105,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105, + 102,32,40,105,110,112,117,116,67,104,97,110,110,101,108,68,97,116,97,32,91,105,93,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,106,32,61,32,48,59,32,106,32, + 60,32,110,117,109,83,97,109,112,108,101,115,59,32,43,43,106,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 97,100,100,83,97,109,112,108,101,32,40,105,110,112,117,116,67,104,97,110,110,101,108,68,97,116,97,32,91,105,93,91,106,93,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32, + 32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,97,117,100,105,111,68,101,118,105,99,101,65, + 98,111,117,116,84,111,83,116,97,114,116,32,40,100,111,117,98,108,101,32,115,97,109,112,108,101,82,97,116,101,44,32,105,110,116,32,110,117,109,83, + 97,109,112,108,101,115,80,101,114,66,108,111,99,107,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,122,101,114,111,109,101,109,32, + 40,99,105,114,99,117,108,97,114,66,117,102,102,101,114,44,32,115,105,122,101,111,102,32,40,102,108,111,97,116,41,32,42,32,98,117,102,102,101,114, + 83,105,122,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,97,117,100,105,111,68,101,118,105,99,101,83,116,111, + 112,112,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,122,101,114,111,109,101,109,32,40,99,105,114,99,117,108,97,114, + 66,117,102,102,101,114,44,32,115,105,122,101,111,102,32,40,102,108,111,97,116,41,32,42,32,98,117,102,102,101,114,83,105,122,101,41,59,13,10,32, + 32,32,32,125,13,10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,102,108,111,97,116,42,32,99,105,114,99,117,108,97,114,66,117,102, + 102,101,114,59,13,10,32,32,32,32,102,108,111,97,116,32,99,117,114,114,101,110,116,73,110,112,117,116,76,101,118,101,108,59,13,10,32,32,32,32, + 105,110,116,32,118,111,108,97,116,105,108,101,32,98,117,102,102,101,114,80,111,115,44,32,98,117,102,102,101,114,83,105,122,101,44,32,110,117,109,83, + 97,109,112,108,101,115,73,110,59,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,65,117,100,105,111,68,101,109,111,32,32,58,32, + 112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117, + 98,108,105,99,32,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116,76,105,115,116,101,110,101,114,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,66,117,116,116,111,110,76,105,115,116,101,110,101,114,44,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,67,104,97,110,103,101,76,105,115,116,101,110,101,114,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,65,117,100,105,111,73,79,68,101,118,105,99,101,67,97, + 108,108,98,97,99,107,13,10,123,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116,42,32, + 102,105,108,101,67,104,111,111,115,101,114,59,13,10,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,112,108,97,121,66,117,116,116,111,110, + 59,13,10,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,115,116,111,112,66,117,116,116,111,110,59,13,10,32,32,32,32,84,101,120,116, + 66,117,116,116,111,110,42,32,97,117,100,105,111,83,101,116,116,105,110,103,115,66,117,116,116,111,110,59,13,10,13,10,32,32,32,32,77,105,100,105, + 75,101,121,98,111,97,114,100,67,111,109,112,111,110,101,110,116,42,32,107,101,121,98,111,97,114,100,67,111,109,112,111,110,101,110,116,59,13,10,32, + 32,32,32,65,117,100,105,111,73,110,112,117,116,87,97,118,101,102,111,114,109,68,105,115,112,108,97,121,42,32,119,97,118,101,102,111,114,109,67,111, + 109,112,111,110,101,110,116,59,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,116,104,105,115,32,119,114,97,112,115,32,116,104,101,32, + 97,99,116,117,97,108,32,97,117,100,105,111,32,100,101,118,105,99,101,13,10,32,32,32,32,65,117,100,105,111,68,101,118,105,99,101,77,97,110,97, + 103,101,114,32,97,117,100,105,111,68,101,118,105,99,101,77,97,110,97,103,101,114,59,13,10,13,10,32,32,32,32,47,47,32,116,104,105,115,32,97, + 108,108,111,119,115,32,97,110,32,97,117,100,105,111,32,115,111,117,114,99,101,32,116,111,32,98,101,32,115,116,114,101,97,109,101,100,32,116,111,32, + 116,104,101,32,73,79,32,100,101,118,105,99,101,13,10,32,32,32,32,65,117,100,105,111,83,111,117,114,99,101,80,108,97,121,101,114,32,97,117,100, + 105,111,83,111,117,114,99,101,80,108,97,121,101,114,59,13,10,13,10,32,32,32,32,47,47,32,116,104,105,115,32,99,111,110,116,114,111,108,115,32, + 116,104,101,32,112,108,97,121,98,97,99,107,32,111,102,32,97,32,112,111,115,105,116,105,111,110,97,98,108,101,32,97,117,100,105,111,32,115,116,114, + 101,97,109,44,32,104,97,110,100,108,105,110,103,32,116,104,101,13,10,32,32,32,32,47,47,32,115,116,97,114,116,105,110,103,47,115,116,111,112,112, + 105,110,103,32,97,110,100,32,115,97,109,112,108,101,45,114,97,116,101,32,99,111,110,118,101,114,115,105,111,110,13,10,32,32,32,32,65,117,100,105, + 111,84,114,97,110,115,112,111,114,116,83,111,117,114,99,101,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,59,13,10,13,10,32,32,32, + 32,47,47,32,116,104,105,115,32,115,111,117,114,99,101,32,99,111,110,116,97,105,110,115,32,111,117,114,32,115,121,110,116,104,44,32,97,110,100,32, + 103,101,110,101,114,97,116,101,115,32,105,116,115,32,111,117,116,112,117,116,13,10,32,32,32,32,83,121,110,116,104,65,117,100,105,111,83,111,117,114, + 99,101,32,115,121,110,116,104,83,111,117,114,99,101,59,13,10,13,10,32,32,32,32,47,47,32,116,104,105,115,32,115,111,117,114,99,101,32,105,115, + 32,117,115,101,100,32,116,111,32,109,105,120,32,116,111,103,101,116,104,101,114,32,116,104,101,32,111,117,116,112,117,116,32,102,114,111,109,32,111,117, + 114,32,115,121,110,116,104,32,115,111,117,114,99,101,13,10,32,32,32,32,47,47,32,97,110,100,32,119,97,118,101,32,112,108,97,121,101,114,32,115, + 111,117,114,99,101,13,10,32,32,32,32,77,105,120,101,114,65,117,100,105,111,83,111,117,114,99,101,32,109,105,120,101,114,83,111,117,114,99,101,59, + 13,10,13,10,32,32,32,32,47,47,32,116,104,105,115,32,105,115,32,116,104,101,32,97,99,116,117,97,108,32,115,116,114,101,97,109,32,116,104,97, + 116,39,115,32,103,111,105,110,103,32,116,111,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,97,117,100,105,111,32,102,105,108,101,46,13,10, + 32,32,32,32,65,117,100,105,111,70,111,114,109,97,116,82,101,97,100,101,114,83,111,117,114,99,101,42,32,99,117,114,114,101,110,116,65,117,100,105, + 111,70,105,108,101,83,111,117,114,99,101,59,13,10,13,10,32,32,32,32,70,105,108,101,32,99,117,114,114,101,110,116,70,105,108,101,59,13,10,13, + 10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,65,117,100,105,111,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10, + 32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40,34,65,117,100,105,111,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,99,117,114,114,101,110,116,65,117,100,105,111,70,105,108,101,83,111,117,114,99,101,32,61,32,48,59,13,10,13,10,32,32,32,32,32,32,32,32, + 47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 13,10,32,32,32,32,32,32,32,32,65,117,100,105,111,70,111,114,109,97,116,77,97,110,97,103,101,114,32,102,111,114,109,97,116,77,97,110,97,103, + 101,114,59,13,10,32,32,32,32,32,32,32,32,102,111,114,109,97,116,77,97,110,97,103,101,114,46,114,101,103,105,115,116,101,114,66,97,115,105,99, + 70,111,114,109,97,116,115,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32, + 40,102,105,108,101,67,104,111,111,115,101,114,32,61,32,110,101,119,32,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116,32,40,84,40, + 34,97,117,100,105,111,102,105,108,101,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70, + 105,108,101,58,58,110,111,110,101,120,105,115,116,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,116,114,117,101,44,32,102,97,108,115,101,44,32,102,97,108,115,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,102,111,114,109,97,116,77,97,110,97,103,101,114,46,103,101,116,87,105,108,100,99,97,114,100,70,111,114,65,108,108,70, + 111,114,109,97,116,115,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,116,114,105,110, + 103,58,58,101,109,112,116,121,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,40,99, + 104,111,111,115,101,32,97,32,87,65,86,32,111,114,32,65,73,70,70,32,102,105,108,101,32,116,111,32,112,108,97,121,41,34,41,41,41,59,13,10, + 32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114,45,62,97,100,100,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59, + 13,10,32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114,45,62,115,101,116,66,114,111,119,115,101,66,117,116,116,111,110,84,101, + 120,116,32,40,84,40,34,98,114,111,119,115,101,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86, + 105,115,105,98,108,101,32,40,112,108,97,121,66,117,116,116,111,110,32,61,32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34, + 112,108,97,121,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,99,108,105,99,107,32,104,101,114,101,32,116, + 111,32,112,108,97,121,32,116,104,101,32,99,117,114,114,101,110,116,32,97,117,100,105,111,32,102,105,108,101,34,41,41,41,59,13,10,32,32,32,32, + 32,32,32,32,112,108,97,121,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41, + 59,13,10,32,32,32,32,32,32,32,32,112,108,97,121,66,117,116,116,111,110,45,62,115,101,116,67,111,108,111,117,114,32,40,84,101,120,116,66,117, + 116,116,111,110,58,58,98,117,116,116,111,110,67,111,108,111,117,114,73,100,44,32,67,111,108,111,117,114,115,58,58,108,105,103,104,116,103,114,101,101, + 110,41,59,13,10,32,32,32,32,32,32,32,32,112,108,97,121,66,117,116,116,111,110,45,62,115,101,116,67,111,108,111,117,114,32,40,84,101,120,116, + 66,117,116,116,111,110,58,58,98,117,116,116,111,110,79,110,67,111,108,111,117,114,73,100,44,32,67,111,108,111,117,114,115,58,58,108,105,103,104,116, + 103,114,101,101,110,41,59,13,10,32,32,32,32,32,32,32,32,112,108,97,121,66,117,116,116,111,110,45,62,115,101,116,67,111,110,110,101,99,116,101, + 100,69,100,103,101,115,32,40,66,117,116,116,111,110,58,58,67,111,110,110,101,99,116,101,100,79,110,82,105,103,104,116,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,115,116,111,112,66,117,116,116,111,110,32,61,32,110,101, + 119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,115,116,111,112,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,84,40,34,99,108,105,99,107,32,104,101,114,101,32,116,111,32,112,108,97,121,32,116,104,101,32,99,117,114,114,101,110,116,32,97,117,100,105, + 111,32,102,105,108,101,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,115,116,111,112,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116, + 111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,115,116,111,112,66,117,116,116,111,110,45,62, + 115,101,116,67,111,108,111,117,114,32,40,84,101,120,116,66,117,116,116,111,110,58,58,98,117,116,116,111,110,67,111,108,111,117,114,73,100,44,32,67, + 111,108,111,117,114,115,58,58,114,101,100,41,59,13,10,32,32,32,32,32,32,32,32,115,116,111,112,66,117,116,116,111,110,45,62,115,101,116,67,111, + 108,111,117,114,32,40,84,101,120,116,66,117,116,116,111,110,58,58,98,117,116,116,111,110,79,110,67,111,108,111,117,114,73,100,44,32,67,111,108,111, + 117,114,115,58,58,114,101,100,41,59,13,10,32,32,32,32,32,32,32,32,115,116,111,112,66,117,116,116,111,110,45,62,115,101,116,67,111,110,110,101, + 99,116,101,100,69,100,103,101,115,32,40,66,117,116,116,111,110,58,58,67,111,110,110,101,99,116,101,100,79,110,76,101,102,116,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,97,117,100,105,111,83,101,116,116,105,110,103,115, + 66,117,116,116,111,110,32,61,32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,115,104,111,119,32,97,117,100,105,111,32,115, + 101,116,116,105,110,103,115,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 84,40,34,99,108,105,99,107,32,104,101,114,101,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,97,117,100,105,111,32,100,101,118,105,99,101, + 32,115,101,116,116,105,110,103,115,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,97,117,100,105,111,83,101,116,116,105,110,103,115,66,117,116, + 116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,107,101,121,98,111,97,114,100,67,111,109,112,111,110,101,110,116,32,61, + 32,110,101,119,32,77,105,100,105,75,101,121,98,111,97,114,100,67,111,109,112,111,110,101,110,116,32,40,115,121,110,116,104,83,111,117,114,99,101,46, + 107,101,121,98,111,97,114,100,83,116,97,116,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,77,105,100,105,75,101,121,98,111,97,114,100,67,111,109,112,111,110,101,110,116,58,58,104,111,114,105,122,111,110, + 116,97,108,75,101,121,98,111,97,114,100,41,41,59,13,10,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105, + 115,105,98,108,101,32,40,119,97,118,101,102,111,114,109,67,111,109,112,111,110,101,110,116,32,61,32,110,101,119,32,65,117,100,105,111,73,110,112,117, + 116,87,97,118,101,102,111,114,109,68,105,115,112,108,97,121,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32, + 32,32,47,47,32,114,101,103,105,115,116,101,114,32,102,111,114,32,115,116,97,114,116,47,115,116,111,112,32,109,101,115,115,97,103,101,115,32,102,114, + 111,109,32,116,104,101,32,116,114,97,110,115,112,111,114,116,32,115,111,117,114,99,101,46,46,13,10,32,32,32,32,32,32,32,32,116,114,97,110,115, + 112,111,114,116,83,111,117,114,99,101,46,97,100,100,67,104,97,110,103,101,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,47,47,32,97,110,100,32,105,110,105,116,105,97,108,105,115,101,32,116,104,101,32,100,101,118,105,99,101,32,109,97,110, + 97,103,101,114,32,119,105,116,104,32,110,111,32,115,101,116,116,105,110,103,115,32,115,111,32,116,104,97,116,32,105,116,32,112,105,99,107,115,32,97, + 13,10,32,32,32,32,32,32,32,32,47,47,32,100,101,102,97,117,108,116,32,100,101,118,105,99,101,32,116,111,32,117,115,101,46,13,10,32,32,32, + 32,32,32,32,32,99,111,110,115,116,32,83,116,114,105,110,103,32,101,114,114,111,114,32,40,97,117,100,105,111,68,101,118,105,99,101,77,97,110,97, + 103,101,114,46,105,110,105,116,105,97,108,105,115,101,32,40,49,44,32,47,42,32,110,117,109,98,101,114,32,111,102,32,105,110,112,117,116,32,99,104, + 97,110,110,101,108,115,32,42,47,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,44,32,47,42,32,110,117,109,98, + 101,114,32,111,102,32,111,117,116,112,117,116,32,99,104,97,110,110,101,108,115,32,42,47,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,48,44,32,47,42,32,110,111,32,88,77,76,32,115,101,116,116,105,110,103,115,46,46,32,42,47,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,32,32,47,42,32,115,101,108,101,99,116,32,100,101,102,97,117,108,116,32,100,101,118,105, + 99,101,32,111,110,32,102,97,105,108,117,114,101,32,42,47,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,101,114,114,111,114, + 46,105,115,78,111,116,69,109,112,116,121,40,41,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,65, + 108,101,114,116,87,105,110,100,111,119,58,58,115,104,111,119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58, + 58,87,97,114,110,105,110,103,73,99,111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,65,117,100,105,111,32,68,101,109,111,34,41,44,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,67,111, + 117,108,100,110,39,116,32,111,112,101,110,32,97,110,32,111,117,116,112,117,116,32,100,101,118,105,99,101,33,92,110,92,110,34,41,32,43,32,101,114, + 114,111,114,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,100,100,32,116,104,101,32,116,119,111,32,97,117,100,105,111,32,115,111,117,114, + 99,101,115,32,116,111,32,111,117,114,32,109,105,120,101,114,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,105,120,101,114,83,111,117, + 114,99,101,46,97,100,100,73,110,112,117,116,83,111,117,114,99,101,32,40,38,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,44,32,102,97, + 108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,105,120,101,114,83,111,117,114,99,101,46,97,100,100,73,110,112,117,116,83, + 111,117,114,99,101,32,40,38,115,121,110,116,104,83,111,117,114,99,101,44,32,102,97,108,115,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,47,47,32,46,46,97,110,100,32,99,111,110,110,101,99,116,32,116,104,101,32,109,105,120,101,114,32,116,111,32,111,117,114,32,115,111, + 117,114,99,101,32,112,108,97,121,101,114,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,117,100,105,111,83,111,117,114,99,101,80,108,97, + 121,101,114,46,115,101,116,83,111,117,114,99,101,32,40,38,109,105,120,101,114,83,111,117,114,99,101,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,47,47,32,115,116,97,114,116,32,116,104,101,32,73,79,32,100,101,118,105,99,101,32,112,117,108,108,105,110,103,32,105,116,115,32, + 100,97,116,97,32,102,114,111,109,32,111,117,114,32,99,97,108,108,98,97,99,107,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,117, + 100,105,111,68,101,118,105,99,101,77,97,110,97,103,101,114,46,115,101,116,65,117,100,105,111,67,97,108,108,98,97,99,107,32,40,116,104,105,115,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,110,100,32,119,101,32,110,101,101,100,32,116,111,32,115,101,110,100,32, + 109,105,100,105,32,105,110,112,117,116,32,116,111,32,111,117,114,32,115,121,110,116,104,32,102,111,114,32,112,114,111,99,101,115,115,105,110,103,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,97,117,100,105,111,68,101,118,105,99,101,77,97,110,97,103,101,114,46,97,100,100,77,105,100,105,73,110, + 112,117,116,67,97,108,108,98,97,99,107,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,38,115,121,110,116,104,83,111,117,114,99,101, + 46,109,105,100,105,67,111,108,108,101,99,116,111,114,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32, + 32,32,126,65,117,100,105,111,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,97,117,100,105,111,68,101,118,105, + 99,101,77,97,110,97,103,101,114,46,114,101,109,111,118,101,77,105,100,105,73,110,112,117,116,67,97,108,108,98,97,99,107,32,40,38,115,121,110,116, + 104,83,111,117,114,99,101,46,109,105,100,105,67,111,108,108,101,99,116,111,114,41,59,13,10,32,32,32,32,32,32,32,32,97,117,100,105,111,68,101, + 118,105,99,101,77,97,110,97,103,101,114,46,115,101,116,65,117,100,105,111,67,97,108,108,98,97,99,107,32,40,48,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46,114,101,109,111,118,101,67,104,97,110,103,101,76,105,115,116,101,110,101, + 114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46,115,101,116, + 83,111,117,114,99,101,32,40,48,41,59,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,110,100,90,101,114,111,32,40,99,117,114,114, + 101,110,116,65,117,100,105,111,70,105,108,101,83,111,117,114,99,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,117,100,105,111,83,111,117, + 114,99,101,80,108,97,121,101,114,46,115,101,116,83,111,117,114,99,101,32,40,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,100,101,108,101, + 116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,118,111,105, + 100,32,97,117,100,105,111,68,101,118,105,99,101,73,79,67,97,108,108,98,97,99,107,32,40,99,111,110,115,116,32,102,108,111,97,116,42,42,32,105, + 110,112,117,116,67,104,97,110,110,101,108,68,97,116,97,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,105,110,116,32,116,111,116,97,108,78,117,109,73,110,112,117,116,67,104,97,110,110,101,108,115,44,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,108,111,97,116,42,42,32,111,117, + 116,112,117,116,67,104,97,110,110,101,108,68,97,116,97,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,105,110,116,32,116,111,116,97,108,78,117,109,79,117,116,112,117,116,67,104,97,110,110,101,108,115,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,110,117,109,83,97, + 109,112,108,101,115,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,112,97,115,115,32,116,104,101,32,97,117,100,105,111, + 32,99,97,108,108,98,97,99,107,32,111,110,32,116,111,32,111,117,114,32,112,108,97,121,101,114,32,115,111,117,114,99,101,44,32,97,110,100,32,97, + 108,115,111,32,116,104,101,32,119,97,118,101,102,111,114,109,32,100,105,115,112,108,97,121,32,99,111,109,112,13,10,32,32,32,32,32,32,32,32,97, + 117,100,105,111,83,111,117,114,99,101,80,108,97,121,101,114,46,97,117,100,105,111,68,101,118,105,99,101,73,79,67,97,108,108,98,97,99,107,32,40, + 105,110,112,117,116,67,104,97,110,110,101,108,68,97,116,97,44,32,116,111,116,97,108,78,117,109,73,110,112,117,116,67,104,97,110,110,101,108,115,44, + 32,111,117,116,112,117,116,67,104,97,110,110,101,108,68,97,116,97,44,32,116,111,116,97,108,78,117,109,79,117,116,112,117,116,67,104,97,110,110,101, + 108,115,44,32,110,117,109,83,97,109,112,108,101,115,41,59,13,10,32,32,32,32,32,32,32,32,119,97,118,101,102,111,114,109,67,111,109,112,111,110, + 101,110,116,45,62,97,117,100,105,111,68,101,118,105,99,101,73,79,67,97,108,108,98,97,99,107,32,40,105,110,112,117,116,67,104,97,110,110,101,108, + 68,97,116,97,44,32,116,111,116,97,108,78,117,109,73,110,112,117,116,67,104,97,110,110,101,108,115,44,32,111,117,116,112,117,116,67,104,97,110,110, + 101,108,68,97,116,97,44,32,116,111,116,97,108,78,117,109,79,117,116,112,117,116,67,104,97,110,110,101,108,115,44,32,110,117,109,83,97,109,112,108, + 101,115,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,97,117,100,105,111,68,101,118,105,99,101,65,98,111,117,116, + 84,111,83,116,97,114,116,32,40,100,111,117,98,108,101,32,115,97,109,112,108,101,82,97,116,101,44,32,105,110,116,32,110,117,109,83,97,109,112,108, + 101,115,80,101,114,66,108,111,99,107,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,97,117,100,105,111,83,111,117,114,99,101,80, + 108,97,121,101,114,46,97,117,100,105,111,68,101,118,105,99,101,65,98,111,117,116,84,111,83,116,97,114,116,32,40,115,97,109,112,108,101,82,97,116, + 101,44,32,110,117,109,83,97,109,112,108,101,115,80,101,114,66,108,111,99,107,41,59,13,10,32,32,32,32,32,32,32,32,119,97,118,101,102,111,114, + 109,67,111,109,112,111,110,101,110,116,45,62,97,117,100,105,111,68,101,118,105,99,101,65,98,111,117,116,84,111,83,116,97,114,116,32,40,115,97,109, + 112,108,101,82,97,116,101,44,32,110,117,109,83,97,109,112,108,101,115,80,101,114,66,108,111,99,107,41,59,13,10,32,32,32,32,125,13,10,13,10, + 32,32,32,32,118,111,105,100,32,97,117,100,105,111,68,101,118,105,99,101,83,116,111,112,112,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,97,117,100,105,111,83,111,117,114,99,101,80,108,97,121,101,114,46,97,117,100,105,111,68,101,118,105,99,101,83,116,111,112,112, + 101,100,40,41,59,13,10,32,32,32,32,32,32,32,32,119,97,118,101,102,111,114,109,67,111,109,112,111,110,101,110,116,45,62,97,117,100,105,111,68, + 101,118,105,99,101,83,116,111,112,112,101,100,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,118,111,105,100, + 32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32, + 112,114,105,110,116,32,115,111,109,101,32,116,101,120,116,32,116,111,32,101,120,112,108,97,105,110,32,119,104,97,116,32,115,116,97,116,101,32,119,101, + 39,114,101,32,105,110,46,13,10,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58, + 58,98,108,97,99,107,41,59,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40,49,52,46,48,102,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,83,116,114,105,110,103,32,115,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,116,114,97,110,115,112,111, + 114,116,83,111,117,114,99,101,46,105,115,80,108,97,121,105,110,103,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,32,61,32,84, + 40,34,112,108,97,121,105,110,103,34,41,59,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 115,32,61,32,84,40,34,115,116,111,112,112,101,100,34,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,99,117,114,114,101,110,116, + 65,117,100,105,111,70,105,108,101,83,111,117,114,99,101,32,61,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,32,43,61,32, + 84,40,34,32,45,32,110,111,32,115,111,117,114,99,101,32,102,105,108,101,32,115,101,108,101,99,116,101,100,34,41,59,13,10,32,32,32,32,32,32, + 32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,32,43,61,32,84,40,34,32,45,32,102,105,108,101,58,32,92,34,34, + 41,32,43,32,99,117,114,114,101,110,116,70,105,108,101,46,103,101,116,70,117,108,108,80,97,116,104,78,97,109,101,40,41,32,43,32,84,40,34,92, + 34,34,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,84,101,120,116,32,40,115,44,32,50,53,48,44,32,53,48,44,32, + 103,101,116,87,105,100,116,104,40,41,32,45,32,50,53,48,44,32,50,52,44,32,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,99,101,110, + 116,114,101,100,76,101,102,116,44,32,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105, + 122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114,45,62,115,101,116,66,111, + 117,110,100,115,32,40,49,48,44,32,49,48,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,50,48,44,32,50,52,41,59,13,10,32,32,32, + 32,32,32,32,32,112,108,97,121,66,117,116,116,111,110,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,53,48,44,32,49,48,48,44, + 32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,115,116,111,112,66,117,116,116,111,110,45,62,115,101,116,66,111,117,110,100,115,32,40,49,49, + 48,44,32,53,48,44,32,49,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,97,117,100,105,111,83,101,116,116,105,110,103,115,66, + 117,116,116,111,110,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,49,50,48,44,32,50,48,48,44,32,50,52,41,59,13,10,32,32, + 32,32,32,32,32,32,97,117,100,105,111,83,101,116,116,105,110,103,115,66,117,116,116,111,110,45,62,99,104,97,110,103,101,87,105,100,116,104,84,111, + 70,105,116,84,101,120,116,40,41,59,13,10,32,32,32,32,32,32,32,32,107,101,121,98,111,97,114,100,67,111,109,112,111,110,101,110,116,45,62,115, + 101,116,66,111,117,110,100,115,32,40,49,48,44,32,50,48,48,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,50,48,44,32,54,48,41,59, + 13,10,32,32,32,32,32,32,32,32,119,97,118,101,102,111,114,109,67,111,109,112,111,110,101,110,116,45,62,115,101,116,66,111,117,110,100,115,32,40, + 49,48,44,32,51,48,48,44,32,52,48,48,44,32,56,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,117,112,100,97,116,101,66,117,116,116, + 111,110,115,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,117,112,100,97,116,101,66,117,116,116,111,110,115,40, + 41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,112,108,97,121,66,117,116,116,111,110,45,62,115,101,116,69,110,97,98,108,101,100, + 32,40,99,117,114,114,101,110,116,65,117,100,105,111,70,105,108,101,83,111,117,114,99,101,32,33,61,32,48,32,38,38,32,33,32,116,114,97,110,115, + 112,111,114,116,83,111,117,114,99,101,46,105,115,80,108,97,121,105,110,103,40,41,41,59,13,10,32,32,32,32,32,32,32,32,115,116,111,112,66,117, + 116,116,111,110,45,62,115,101,116,69,110,97,98,108,101,100,32,40,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46,105,115,80,108,97,121, + 105,110,103,40,41,41,59,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32, + 32,32,118,111,105,100,32,98,117,116,116,111,110,67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10,32, + 32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,98,117,116,116,111,110,32,61,61,32,112,108,97,121,66,117,116,116,111,110,41,13, + 10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46, + 115,101,116,80,111,115,105,116,105,111,110,32,40,48,46,48,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,112,111,114, + 116,83,111,117,114,99,101,46,115,116,97,114,116,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115, + 101,32,105,102,32,40,98,117,116,116,111,110,32,61,61,32,115,116,111,112,66,117,116,116,111,110,41,13,10,32,32,32,32,32,32,32,32,123,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46,115,116,111,112,40,41,59,13,10,32,32,32, + 32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,98,117,116,116,111,110,32,61,61,32,97,117,100,105,111, + 83,101,116,116,105,110,103,115,66,117,116,116,111,110,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 47,47,32,67,114,101,97,116,101,32,97,110,32,65,117,100,105,111,68,101,118,105,99,101,83,101,108,101,99,116,111,114,67,111,109,112,111,110,101,110, + 116,32,119,104,105,99,104,32,99,111,110,116,97,105,110,115,32,116,104,101,32,97,117,100,105,111,32,99,104,111,105,99,101,32,119,105,100,103,101,116, + 115,46,46,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,65,117,100,105,111,68,101,118,105,99,101,83,101,108,101,99,116,111,114,67, + 111,109,112,111,110,101,110,116,32,97,117,100,105,111,83,101,116,116,105,110,103,115,67,111,109,112,32,40,97,117,100,105,111,68,101,118,105,99,101,77, + 97,110,97,103,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,44,32,49,44,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,44,32,50,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,46,46,46,97,110,100,32,115,104,111,119,32, + 105,116,32,105,110,32,97,32,68,105,97,108,111,103,87,105,110,100,111,119,46,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,117,100, + 105,111,83,101,116,116,105,110,103,115,67,111,109,112,46,115,101,116,83,105,122,101,32,40,53,48,48,44,32,52,48,48,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,68,105,97,108,111,103,87,105,110,100,111,119,58,58,115,104,111,119,77,111,100,97,108,68,105,97,108,111,103,32, + 40,84,40,34,65,117,100,105,111,32,83,101,116,116,105,110,103,115,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,38,97,117,100,105,111,83,101,116,116,105,110,103,115, + 67,111,109,112,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,116,104,105,115,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,108,111,117,114,115,58,58,97,122,117,114,101,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,102,105,108, + 101,110,97,109,101,67,111,109,112,111,110,101,110,116,67,104,97,110,103,101,100,32,40,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116, + 42,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115,32,105,115,32,99,97,108,108,101,100,32,119,104,101, + 110,32,116,104,101,32,117,115,101,114,32,99,104,97,110,103,101,115,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,110,32,116,104,101,32,102, + 105,108,101,32,99,104,111,111,115,101,114,32,98,111,120,13,10,13,10,32,32,32,32,32,32,32,32,70,105,108,101,32,97,117,100,105,111,70,105,108, + 101,32,40,102,105,108,101,67,104,111,111,115,101,114,45,62,103,101,116,67,117,114,114,101,110,116,70,105,108,101,40,41,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,47,47,32,117,110,108,111,97,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,102,105,108,101,32,115,111,117,114,99,101, + 32,97,110,100,32,100,101,108,101,116,101,32,105,116,46,46,13,10,32,32,32,32,32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99, + 101,46,115,116,111,112,40,41,59,13,10,32,32,32,32,32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46,115,101,116,83,111, + 117,114,99,101,32,40,48,41,59,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,110,100,90,101,114,111,32,40,99,117,114,114,101,110, + 116,65,117,100,105,111,70,105,108,101,83,111,117,114,99,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,99,114,101,97,116,101,32, + 97,32,110,101,119,32,102,105,108,101,32,115,111,117,114,99,101,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46,46,13,10,13,10,32,32,32, + 32,32,32,32,32,47,47,32,103,101,116,32,97,32,102,111,114,109,97,116,32,109,97,110,97,103,101,114,32,97,110,100,32,115,101,116,32,105,116,32, + 117,112,32,119,105,116,104,32,116,104,101,32,98,97,115,105,99,32,116,121,112,101,115,32,40,119,97,118,32,97,110,100,32,97,105,102,102,41,46,13, + 10,32,32,32,32,32,32,32,32,65,117,100,105,111,70,111,114,109,97,116,77,97,110,97,103,101,114,32,102,111,114,109,97,116,77,97,110,97,103,101, + 114,59,13,10,32,32,32,32,32,32,32,32,102,111,114,109,97,116,77,97,110,97,103,101,114,46,114,101,103,105,115,116,101,114,66,97,115,105,99,70, + 111,114,109,97,116,115,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,65,117,100,105,111,70,111,114,109,97,116,82,101,97,100,101,114,42,32, + 114,101,97,100,101,114,32,61,32,102,111,114,109,97,116,77,97,110,97,103,101,114,46,99,114,101,97,116,101,82,101,97,100,101,114,70,111,114,32,40, + 97,117,100,105,111,70,105,108,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,114,101,97,100,101,114,32,33,61,32,48,41,13, + 10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,70,105,108,101,32,61,32,97,117, + 100,105,111,70,105,108,101,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,65,117,100,105,111,70,105,108,101, + 83,111,117,114,99,101,32,61,32,110,101,119,32,65,117,100,105,111,70,111,114,109,97,116,82,101,97,100,101,114,83,111,117,114,99,101,32,40,114,101, + 97,100,101,114,44,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,46,46,97,110,100,32,112,108,117, + 103,32,105,116,32,105,110,116,111,32,111,117,114,32,116,114,97,110,115,112,111,114,116,32,115,111,117,114,99,101,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,116,114,97,110,115,112,111,114,116,83,111,117,114,99,101,46,115,101,116,83,111,117,114,99,101,32,40,99,117,114,114,101,110,116,65,117, + 100,105,111,70,105,108,101,83,111,117,114,99,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,51,50,55,54,56,44,32,47,47,32,116,101,108,108,115,32,105,116,32,116,111,32,98,117,102, + 102,101,114,32,116,104,105,115,32,109,97,110,121,32,115,97,109,112,108,101,115,32,97,104,101,97,100,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,101,114,45,62,115,97,109,112, + 108,101,82,97,116,101,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,117,112,100,97,116,101,66,117,116, + 116,111,110,115,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,99,104,97,110,103,101,76,105,115,116,101,110,101, + 114,67,97,108,108,98,97,99,107,32,40,118,111,105,100,42,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,99,97,108, + 108,98,97,99,107,32,102,114,111,109,32,116,104,101,32,116,114,97,110,115,112,111,114,116,32,115,111,117,114,99,101,32,116,111,32,116,101,108,108,32, + 117,115,32,116,104,97,116,32,112,108,97,121,32,104,97,115,13,10,32,32,32,32,32,32,32,32,47,47,32,115,116,97,114,116,101,100,32,111,114,32, + 115,116,111,112,112,101,100,44,32,115,111,32,117,112,100,97,116,101,32,111,117,114,32,98,117,116,116,111,110,115,46,46,13,10,32,32,32,32,32,32, + 32,32,117,112,100,97,116,101,66,117,116,116,111,110,115,40,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109, + 112,111,110,101,110,116,42,32,99,114,101,97,116,101,65,117,100,105,111,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110, + 32,110,101,119,32,65,117,100,105,111,68,101,109,111,40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::audiodemo_cpp = (const char*) temp1; + +static const unsigned char temp2[] = {82,73,70,70,4,181,0,0,87,65,86,69,102,109,116,32,16,0,0,0,1,0,1,0,34,86,0,0,68,172,0,0,2,0,16,0,98,101,120,116, + 92,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,114,97,99,107,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,50,48,48,54,45,49,48,45,48,52,49,50,58,49,52,58,48,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,100,97,116,97,124,178,0,0,0,0,0,0,250,255,248,255,0,0,253,255,255,255,0,0,253,255,249,255,249,255,248,255, + 252,255,249,255,0,0,4,0,1,0,255,255,4,0,7,0,255,255,4,0,249,255,252,255,1,0,255,255,0,0,255,255,255,255,3,0,3,0,1,0, + 4,0,252,255,4,0,253,255,255,255,250,255,248,255,241,255,248,255,3,0,6,0,6,0,1,0,7,0,1,0,253,255,253,255,246,255,245,255,242,255, + 246,255,252,255,252,255,249,255,1,0,255,255,0,0,255,255,255,255,253,255,3,0,0,0,253,255,250,255,249,255,245,255,246,255,249,255,248,255,255,255, + 3,0,6,0,0,0,255,255,250,255,4,0,7,0,6,0,0,0,255,255,249,255,252,255,0,0,0,0,6,0,3,0,255,255,0,0,250,255,0,0, + 3,0,4,0,3,0,1,0,4,0,4,0,7,0,3,0,255,255,255,255,246,255,248,255,253,255,3,0,253,255,1,0,252,255,4,0,253,255,6,0, + 3,0,253,255,253,255,252,255,255,255,253,255,253,255,0,0,255,255,0,0,0,0,3,0,7,0,4,0,1,0,255,255,242,255,250,255,255,255,8,0, + 0,0,3,0,0,0,3,0,0,0,249,255,248,255,250,255,0,0,252,255,0,0,253,255,250,255,248,255,253,255,0,0,252,255,0,0,1,0,252,255, + 0,0,250,255,253,255,0,0,4,0,0,0,250,255,255,255,253,255,252,255,3,0,253,255,248,255,0,0,252,255,0,0,249,255,244,255,249,255,252,255, + 255,255,249,255,253,255,246,255,250,255,248,255,1,0,6,0,3,0,0,0,253,255,246,255,250,255,255,255,246,255,249,255,1,0,255,255,253,255,1,0, + 3,0,6,0,1,0,250,255,255,255,252,255,1,0,253,255,0,0,255,255,253,255,0,0,253,255,250,255,250,255,253,255,248,255,255,255,250,255,248,255, + 0,0,253,255,252,255,6,0,3,0,3,0,250,255,255,255,255,255,250,255,249,255,253,255,1,0,4,0,6,0,4,0,255,255,253,255,253,255,255,255, + 255,255,250,255,1,0,253,255,250,255,255,255,249,255,252,255,255,255,255,255,6,0,6,0,8,0,4,0,255,255,1,0,1,0,3,0,255,255,4,0, + 4,0,1,0,250,255,3,0,253,255,253,255,4,0,250,255,255,255,255,255,255,255,249,255,248,255,255,255,3,0,248,255,3,0,248,255,0,0,4,0, + 4,0,253,255,252,255,252,255,246,255,248,255,250,255,250,255,253,255,6,0,3,0,6,0,4,0,6,0,7,0,12,0,6,0,10,0,15,0,14,0, + 6,0,6,0,255,255,248,255,252,255,1,0,3,0,8,0,3,0,3,0,8,0,0,0,1,0,10,0,10,0,7,0,6,0,6,0,10,0,6,0, + 4,0,252,255,4,0,11,0,18,0,14,0,10,0,15,0,11,0,10,0,14,0,15,0,17,0,18,0,17,0,17,0,17,0,11,0,12,0,11,0, + 17,0,12,0,14,0,7,0,10,0,12,0,11,0,4,0,3,0,253,255,255,255,1,0,0,0,250,255,253,255,6,0,4,0,7,0,7,0,4,0, + 1,0,3,0,1,0,3,0,252,255,246,255,248,255,249,255,252,255,0,0,0,0,253,255,255,255,250,255,246,255,249,255,253,255,8,0,6,0,25,0, + 19,0,19,0,18,0,18,0,24,0,24,0,25,0,26,0,30,0,26,0,22,0,28,0,15,0,15,0,8,0,11,0,10,0,7,0,25,0,24,0, + 32,0,44,0,43,0,57,0,51,0,53,0,48,0,46,0,40,0,35,0,29,0,24,0,21,0,8,0,0,0,250,255,239,255,237,255,228,255,227,255, + 223,255,228,255,227,255,228,255,228,255,239,255,239,255,242,255,244,255,245,255,245,255,237,255,223,255,214,255,202,255,191,255,174,255,162,255,155,255,138,255, + 138,255,130,255,127,255,120,255,111,255,111,255,108,255,105,255,102,255,98,255,99,255,99,255,97,255,99,255,104,255,113,255,127,255,145,255,151,255,165,255, + 169,255,180,255,192,255,187,255,180,255,166,255,162,255,156,255,154,255,148,255,149,255,156,255,172,255,187,255,196,255,188,255,194,255,188,255,191,255,181,255, + 181,255,180,255,173,255,170,255,167,255,156,255,141,255,112,255,87,255,57,255,26,255,0,255,231,254,216,254,214,254,211,254,220,254,229,254,239,254,254,254, + 29,255,69,255,104,255,133,255,142,255,166,255,195,255,210,255,232,255,250,255,4,0,253,255,235,255,209,255,180,255,165,255,162,255,165,255,170,255,185,255, + 191,255,184,255,183,255,173,255,154,255,127,255,104,255,99,255,112,255,133,255,156,255,170,255,176,255,173,255,136,255,115,255,79,255,52,255,37,255,37,255, + 50,255,62,255,65,255,65,255,72,255,51,255,11,255,218,254,185,254,171,254,196,254,3,255,79,255,167,255,3,0,89,0,169,0,233,0,33,1,78,1, + 132,1,191,1,243,1,28,2,52,2,48,2,20,2,222,1,141,1,35,1,172,0,54,0,221,255,158,255,130,255,142,255,185,255,238,255,44,0,101,0, + 147,0,150,0,127,0,76,0,7,0,195,255,98,255,254,254,175,254,131,254,105,254,98,254,108,254,119,254,135,254,152,254,163,254,178,254,195,254,221,254, + 254,254,18,255,15,255,254,254,209,254,141,254,72,254,23,254,244,253,6,254,38,254,110,254,213,254,58,255,142,255,220,255,28,0,83,0,134,0,180,0, + 220,0,22,1,90,1,161,1,236,1,54,2,126,2,194,2,250,2,42,3,84,3,107,3,132,3,143,3,143,3,139,3,127,3,91,3,70,3,41,3, + 244,2,187,2,147,2,104,2,84,2,79,2,77,2,78,2,85,2,93,2,84,2,54,2,10,2,202,1,144,1,81,1,14,1,194,0,126,0,72,0, + 55,0,60,0,105,0,157,0,216,0,14,1,54,1,96,1,117,1,136,1,155,1,154,1,164,1,175,1,180,1,194,1,222,1,3,2,49,2,125,2, + 211,2,39,3,103,3,159,3,186,3,172,3,128,3,75,3,19,3,200,2,125,2,50,2,248,1,179,1,117,1,54,1,248,0,183,0,118,0,61,0, + 24,0,0,0,255,255,7,0,43,0,90,0,148,0,213,0,28,1,108,1,193,1,10,2,75,2,147,2,211,2,15,3,67,3,95,3,117,3,141,3, + 142,3,131,3,109,3,85,3,55,3,15,3,226,2,196,2,142,2,85,2,14,2,198,1,117,1,39,1,205,0,101,0,244,255,122,255,242,254,112,254, + 228,253,109,253,1,253,172,252,114,252,89,252,82,252,92,252,128,252,196,252,10,253,91,253,168,253,228,253,19,254,52,254,63,254,52,254,30,254,242,253, + 206,253,166,253,128,253,100,253,96,253,102,253,123,253,154,253,193,253,242,253,37,254,85,254,124,254,163,254,177,254,167,254,153,254,139,254,116,254,80,254, + 11,254,171,253,96,253,42,253,9,253,237,252,219,252,240,252,24,253,77,253,177,253,49,254,175,254,39,255,140,255,209,255,11,0,65,0,115,0,125,0, + 96,0,73,0,51,0,1,0,205,255,176,255,191,255,228,255,249,255,252,255,255,255,245,255,232,255,209,255,174,255,147,255,116,255,61,255,227,254,124,254, + 1,254,142,253,74,253,59,253,27,253,240,252,186,252,142,252,96,252,68,252,24,252,245,251,229,251,241,251,21,252,84,252,151,252,193,252,200,252,161,252, + 77,252,219,251,94,251,244,250,163,250,143,250,177,250,4,251,97,251,207,251,79,252,185,252,248,252,21,253,75,253,207,253,146,254,131,255,127,0,71,1, + 225,1,90,2,181,2,239,2,13,3,21,3,44,3,41,3,37,3,251,2,207,2,149,2,79,2,233,1,56,1,86,0,115,255,191,254,65,254,239,253, + 203,253,204,253,224,253,36,254,128,254,239,254,80,255,151,255,166,255,131,255,54,255,167,254,218,253,243,252,27,252,132,251,58,251,40,251,56,251,96,251, + 125,251,129,251,74,251,234,250,130,250,57,250,21,250,14,250,49,250,94,250,151,250,231,250,86,251,193,251,18,252,63,252,86,252,113,252,120,252,96,252, + 61,252,24,252,23,252,48,252,118,252,228,252,134,253,78,254,40,255,10,0,201,0,93,1,191,1,13,2,84,2,174,2,5,3,82,3,154,3,213,3, + 26,4,74,4,90,4,108,4,144,4,186,4,254,4,75,5,174,5,10,6,104,6,148,6,162,6,125,6,78,6,29,6,252,5,246,5,4,6,21,6, + 61,6,118,6,162,6,166,6,119,6,36,6,201,5,77,5,211,4,106,4,253,3,128,3,17,3,153,2,50,2,208,1,132,1,97,1,104,1,132,1, + 184,1,252,1,75,2,189,2,45,3,163,3,251,3,76,4,155,4,228,4,27,5,69,5,91,5,99,5,87,5,80,5,58,5,39,5,19,5,231,4, + 193,4,167,4,137,4,90,4,51,4,24,4,30,4,59,4,106,4,166,4,231,4,45,5,112,5,173,5,239,5,48,6,93,6,109,6,80,6,29,6, + 221,5,135,5,43,5,220,4,134,4,47,4,208,3,143,3,78,3,24,3,222,2,153,2,90,2,43,2,251,1,216,1,187,1,171,1,178,1,211,1, + 7,2,43,2,74,2,68,2,255,1,162,1,49,1,172,0,43,0,191,255,115,255,86,255,87,255,115,255,180,255,4,0,87,0,140,0,151,0,130,0, + 66,0,226,255,99,255,217,254,54,254,148,253,244,252,110,252,241,251,151,251,90,251,57,251,65,251,104,251,190,251,35,252,149,252,9,253,99,253,174,253, + 221,253,239,253,235,253,208,253,185,253,152,253,99,253,33,253,225,252,158,252,99,252,49,252,17,252,5,252,2,252,27,252,82,252,176,252,49,253,192,253, + 78,254,220,254,81,255,169,255,224,255,221,255,184,255,91,255,214,254,62,254,152,253,3,253,139,252,46,252,237,251,196,251,182,251,227,251,48,252,121,252, + 199,252,35,253,174,253,36,254,134,254,235,254,66,255,130,255,167,255,151,255,99,255,19,255,156,254,27,254,181,253,103,253,49,253,235,252,147,252,60,252, + 244,251,209,251,204,251,190,251,150,251,104,251,60,251,10,251,224,250,202,250,184,250,184,250,215,250,65,251,226,251,163,252,132,253,102,254,14,255,83,255, + 57,255,223,254,94,254,207,253,60,253,160,252,20,252,193,251,147,251,118,251,101,251,99,251,83,251,57,251,14,251,7,251,11,251,64,251,183,251,86,252, + 241,252,100,253,179,253,9,254,113,254,224,254,68,255,163,255,7,0,90,0,165,0,217,0,6,1,7,1,183,0,8,0,22,255,8,254,24,253,107,252, + 17,252,9,252,35,252,86,252,163,252,253,252,92,253,142,253,100,253,192,252,197,251,130,250,57,249,254,247,26,247,120,246,5,246,200,245,180,245,211,245, + 254,245,24,246,3,246,204,245,168,245,164,245,198,245,25,246,147,246,52,247,197,247,37,248,112,248,185,248,14,249,142,249,69,250,72,251,131,252,215,253, + 23,255,54,0,33,1,191,1,2,2,25,2,35,2,63,2,117,2,207,2,107,3,73,4,108,5,184,6,251,7,60,9,149,10,214,11,240,12,197,13, + 110,14,239,14,77,15,132,15,139,15,89,15,211,14,13,14,54,13,105,12,201,11,84,11,5,11,232,10,222,10,189,10,144,10,70,10,239,9,96,9, + 146,8,157,7,150,6,126,5,116,4,114,3,138,2,165,1,202,0,15,0,112,255,236,254,148,254,105,254,120,254,211,254,104,255,43,0,20,1,14,2, + 3,3,221,3,116,4,227,4,69,5,185,5,33,6,155,6,33,7,157,7,2,8,118,8,216,8,35,9,64,9,64,9,49,9,30,9,12,9,255,8, + 240,8,208,8,150,8,67,8,243,7,155,7,45,7,205,6,107,6,21,6,202,5,153,5,102,5,83,5,84,5,81,5,102,5,108,5,106,5,134,5, + 202,5,42,6,180,6,93,7,32,8,236,8,170,9,103,10,246,10,66,11,73,11,7,11,108,10,149,9,133,8,83,7,37,6,239,4,224,3,211,2, + 226,1,22,1,129,0,255,255,113,255,198,254,9,254,42,253,57,252,42,251,14,250,236,248,214,247,215,246,12,246,97,245,14,245,6,245,68,245,197,245, + 111,246,12,247,160,247,33,248,148,248,216,248,242,248,235,248,234,248,221,248,241,248,28,249,98,249,176,249,15,250,119,250,240,250,117,251,241,251,93,252, + 193,252,16,253,81,253,125,253,153,253,167,253,163,253,168,253,167,253,128,253,81,253,56,253,89,253,152,253,210,253,218,253,197,253,186,253,215,253,38,254, + 119,254,196,254,1,255,65,255,137,255,220,255,46,0,134,0,209,0,9,1,54,1,83,1,79,1,49,1,32,1,25,1,249,0,145,0,4,0,91,255, + 164,254,12,254,159,253,55,253,194,252,103,252,43,252,2,252,200,251,118,251,40,251,249,250,198,250,133,250,37,250,187,249,77,249,235,248,149,248,48,248, + 196,247,130,247,107,247,114,247,124,247,114,247,24,247,125,246,203,245,4,245,53,244,152,243,66,243,26,243,37,243,79,243,108,243,133,243,177,243,233,243, + 35,244,73,244,144,244,53,245,74,246,179,247,102,249,75,251,39,253,227,254,112,0,227,1,45,3,110,4,115,5,39,6,127,6,80,6,209,5,1,5, + 225,3,63,2,55,0,228,253,154,251,158,249,56,248,121,247,69,247,121,247,243,247,159,248,116,249,55,250,202,250,21,251,33,251,197,250,255,249,25,249, + 49,248,67,247,103,246,129,245,168,244,248,243,109,243,33,243,14,243,46,243,98,243,142,243,191,243,6,244,115,244,20,245,197,245,88,246,187,246,34,247, + 148,247,19,248,203,248,147,249,98,250,25,251,162,251,42,252,163,252,10,253,105,253,195,253,78,254,5,255,4,0,74,1,229,2,149,4,44,6,147,7, + 186,8,189,9,108,10,214,10,1,11,16,11,52,11,152,11,253,11,144,12,69,13,243,13,180,14,106,15,23,16,182,16,61,17,217,17,154,18,25,19, + 78,19,47,19,197,18,61,18,167,17,250,16,73,16,179,15,116,15,114,15,161,15,217,15,16,16,30,16,226,15,113,15,174,14,151,13,41,12,144,10, + 241,8,85,7,206,5,110,4,64,3,78,2,172,1,69,1,51,1,86,1,198,1,140,2,145,3,153,4,149,5,100,6,10,7,112,7,130,7,81,7, + 238,6,115,6,237,5,140,5,95,5,122,5,225,5,123,6,13,7,132,7,254,7,131,8,6,9,142,9,22,10,168,10,94,11,246,11,125,12,220,12, + 22,13,36,13,231,12,98,12,188,11,250,10,51,10,123,9,236,8,139,8,56,8,227,7,140,7,38,7,183,6,89,6,235,5,153,5,79,5,25,5, + 235,4,196,4,157,4,85,4,254,3,132,3,232,2,74,2,139,1,213,0,7,0,21,255,23,254,67,253,121,252,186,251,70,251,25,251,56,251,150,251, + 31,252,215,252,145,253,58,254,178,254,200,254,113,254,190,253,204,252,168,251,100,250,37,249,232,247,194,246,201,245,2,245,129,244,65,244,55,244,90,244, + 158,244,233,244,74,245,190,245,53,246,135,246,186,246,194,246,205,246,207,246,254,246,78,247,150,247,213,247,243,247,51,248,134,248,252,248,118,249,219,249, + 75,250,181,250,25,251,125,251,240,251,84,252,171,252,240,252,69,253,175,253,49,254,174,254,44,255,136,255,178,255,169,255,105,255,34,255,239,254,247,254, + 54,255,115,255,141,255,144,255,134,255,140,255,191,255,29,0,173,0,57,1,129,1,118,1,47,1,6,1,213,0,132,0,8,0,77,255,92,254,34,253, + 182,251,107,250,111,249,157,248,245,247,95,247,247,246,161,246,73,246,216,245,7,245,216,243,55,242,64,240,47,238,112,236,55,235,156,234,100,234,111,234, + 228,234,182,235,195,236,220,237,193,238,131,239,84,240,73,241,119,242,235,243,64,245,70,246,232,246,94,247,202,247,12,248,119,248,39,249,54,250,70,251, + 77,252,44,253,195,253,2,254,211,253,70,253,85,252,36,251,223,249,221,248,119,248,223,248,228,249,49,251,133,252,224,253,7,255,4,0,162,0,217,0, + 125,0,162,255,106,254,39,253,5,252,32,251,151,250,158,250,229,250,29,251,6,251,169,250,24,250,95,249,133,248,132,247,103,246,56,245,31,244,23,243, + 19,242,17,241,45,240,133,239,53,239,57,239,190,239,172,240,251,241,137,243,49,245,167,246,184,247,106,248,224,248,61,249,145,249,31,250,49,251,194,252, + 182,254,224,0,39,3,147,5,255,7,53,10,68,12,6,14,136,15,203,16,176,17,77,18,166,18,8,19,159,19,81,20,44,21,73,22,152,23,249,24, + 88,26,196,27,25,29,29,30,245,30,109,31,118,31,249,30,65,30,98,29,92,28,97,27,89,26,72,25,50,24,66,23,116,22,212,21,78,21,225,20, + 131,20,249,19,22,19,230,17,96,16,168,14,240,12,90,11,4,10,236,8,238,7,36,7,145,6,42,6,230,5,159,5,137,5,173,5,235,5,72,6, + 198,6,94,7,34,8,216,8,128,9,2,10,74,10,80,10,27,10,204,9,111,9,250,8,126,8,243,7,61,7,129,6,253,5,223,5,47,6,201,6, + 154,7,102,8,49,9,27,10,11,11,219,11,122,12,231,12,26,13,21,13,237,12,202,12,174,12,152,12,112,12,29,12,165,11,234,10,246,9,240,8, + 3,8,56,7,161,6,47,6,6,6,50,6,134,6,223,6,24,7,61,7,68,7,40,7,226,6,90,6,159,5,166,4,124,3,50,2,188,0,34,255, + 134,253,23,252,227,250,18,250,162,249,158,249,209,249,51,250,137,250,219,250,244,250,186,250,33,250,252,248,80,247,81,245,47,243,40,241,85,239,219,237, + 241,236,149,236,209,236,155,237,193,238,32,240,164,241,40,243,139,244,201,245,181,246,81,247,145,247,163,247,128,247,31,247,109,246,143,245,139,244,126,243, + 170,242,48,242,11,242,0,242,250,241,54,242,192,242,203,243,16,245,96,246,181,247,242,248,54,250,96,251,67,252,190,252,200,252,146,252,34,252,81,251, + 31,250,26,249,144,248,101,248,117,248,224,248,130,249,51,250,248,250,12,252,114,253,7,255,151,0,254,1,229,2,82,3,71,3,236,2,59,2,28,1, + 199,255,72,254,128,252,150,250,181,248,88,247,118,246,187,245,247,244,91,244,35,244,255,243,208,243,90,243,135,242,110,241,9,240,112,238,173,236,218,234, + 95,233,159,232,47,232,233,231,249,231,101,232,23,233,172,233,180,233,77,233,220,232,7,233,200,233,251,234,79,236,163,237,198,238,236,239,243,240,225,241, + 187,242,145,243,130,244,165,245,172,246,178,247,105,248,3,249,98,249,108,249,239,248,29,248,84,247,34,247,192,247,16,249,226,250,10,253,21,255,222,0, + 60,2,45,3,177,3,202,3,105,3,142,2,35,1,76,255,62,253,112,251,250,249,224,248,11,248,172,247,156,247,196,247,18,248,31,248,213,247,44,247, + 61,246,97,245,132,244,195,243,180,242,121,241,98,240,216,239,254,239,226,240,61,242,235,243,155,245,253,246,9,248,229,248,88,249,149,249,185,249,65,250, + 79,251,212,252,36,255,20,2,93,5,218,8,47,12,20,15,79,17,20,19,101,20,104,21,67,22,51,23,62,24,40,25,244,25,160,26,48,27,163,27, + 24,28,189,28,134,29,90,30,93,31,180,32,3,34,9,35,157,35,171,35,88,35,6,35,168,34,49,34,192,33,118,33,81,33,39,33,254,32,184,32, + 101,32,204,31,221,30,139,29,232,27,47,26,77,24,124,22,237,20,129,19,48,18,30,17,67,16,138,15,216,14,65,14,198,13,105,13,85,13,130,13, + 226,13,104,14,246,14,85,15,102,15,21,15,118,14,162,13,170,12,192,11,227,10,214,9,214,8,237,7,36,7,105,6,171,5,216,4,247,3,62,3, + 183,2,129,2,139,2,218,2,77,3,254,3,189,4,160,5,138,6,86,7,219,7,9,8,28,8,32,8,41,8,61,8,107,8,198,8,27,9,102,9, + 124,9,114,9,67,9,248,8,132,8,6,8,117,7,215,6,73,6,220,5,147,5,98,5,98,5,137,5,209,5,1,6,6,6,188,5,41,5,47,4, + 183,2,220,0,210,254,168,252,144,250,164,248,33,247,12,246,101,245,29,245,53,245,107,245,128,245,136,245,74,245,229,244,49,244,76,243,56,242,15,241, + 226,239,186,238,174,237,228,236,102,236,98,236,188,236,109,237,80,238,72,239,88,240,137,241,207,242,51,244,72,245,251,245,48,246,250,245,139,245,13,245, + 98,244,119,243,99,242,94,241,98,240,140,239,187,238,248,237,82,237,155,236,254,235,204,235,70,236,83,237,132,238,244,239,171,241,140,243,86,245,186,246, + 181,247,103,248,54,249,196,249,209,249,115,249,15,249,15,249,123,249,65,250,75,251,106,252,102,253,0,254,8,254,1,254,134,254,148,255,120,0,222,0, + 212,0,97,0,172,255,243,254,29,254,248,252,82,251,154,249,13,248,207,246,208,245,249,244,241,243,178,242,60,241,75,239,212,236,1,234,80,231,254,228, + 3,227,93,225,243,223,72,223,45,223,80,223,72,223,44,223,40,223,130,223,120,224,62,226,100,228,166,230,168,232,57,234,38,235,156,235,242,235,115,236, + 36,237,53,238,149,239,52,241,228,242,211,244,2,247,15,249,108,250,202,250,53,250,61,249,133,248,98,248,239,248,21,250,204,251,51,254,18,1,31,4, + 46,7,113,9,184,10,163,10,34,9,148,6,85,3,248,255,171,252,216,249,152,247,227,245,169,244,212,243,155,243,216,243,7,244,31,244,43,244,86,244, + 121,244,175,244,177,244,140,244,57,244,213,243,106,243,90,243,221,243,249,244,111,246,48,248,239,249,101,251,99,252,250,252,17,253,246,252,207,252,222,252, + 172,253,52,255,135,1,116,4,101,7,59,10,238,12,80,15,109,17,86,19,232,20,178,22,192,24,153,26,59,28,210,29,53,31,83,32,196,32,182,32, + 81,32,201,31,177,31,97,32,194,33,151,35,145,37,97,39,229,40,14,42,238,42,115,43,130,43,68,43,252,42,202,42,130,42,250,41,88,41,177,40, + 228,39,222,38,172,37,101,36,23,35,233,33,191,32,111,31,57,30,36,29,247,27,178,26,90,25,235,23,174,22,200,21,114,21,120,21,163,21,9,22, + 137,22,195,22,148,22,225,21,219,20,119,19,224,17,67,16,169,14,51,13,35,12,129,11,40,11,231,10,127,10,190,9,135,8,235,6,69,5,177,3, + 23,2,211,0,227,255,50,255,217,254,177,254,241,254,130,255,64,0,31,1,17,2,20,3,88,4,176,5,253,6,16,8,218,8,159,9,73,10,186,10, + 235,10,239,10,234,10,192,10,130,10,33,10,188,9,80,9,237,8,143,8,218,7,46,7,104,6,195,5,48,5,173,4,58,4,146,3,171,2,100,1, + 201,255,18,254,124,252,10,251,167,249,84,248,46,247,59,246,82,245,184,244,15,244,100,243,202,242,240,241,27,241,35,240,49,239,107,238,177,237,239,236, + 23,236,76,235,106,234,205,233,119,233,83,233,136,233,28,234,15,235,177,236,206,238,74,241,198,243,201,245,31,247,182,247,207,247,102,247,127,246,9,245, + 33,243,243,240,154,238,50,236,98,234,14,233,252,231,206,230,185,229,29,229,44,229,160,229,65,230,23,231,25,232,64,233,164,234,14,236,77,237,134,238, + 12,240,156,241,148,242,191,242,135,242,105,242,73,242,55,242,112,242,26,243,172,243,208,243,166,243,137,243,237,243,205,244,55,246,236,247,154,249,245,250, + 24,252,1,253,178,253,220,253,91,253,84,252,241,250,91,249,182,247,254,245,32,244,67,242,121,240,134,238,144,236,102,234,119,232,217,230,166,229,171,228, + 203,227,56,227,17,227,36,227,245,226,101,226,194,225,120,225,202,225,209,226,167,228,4,231,124,233,196,235,165,237,35,239,79,240,27,241,125,241,160,241, + 240,241,109,242,48,243,35,244,75,245,149,246,95,247,163,247,2,247,189,245,101,244,109,243,205,242,146,242,232,242,237,243,169,245,195,247,248,249,89,252, + 77,254,145,255,234,255,169,255,195,254,109,253,169,251,24,250,41,249,182,248,49,248,149,247,154,246,168,245,119,244,82,243,62,242,114,241,38,241,98,241, + 34,242,242,242,158,243,33,244,166,244,18,245,171,245,187,246,79,248,109,250,250,252,136,255,214,1,62,3,202,3,168,3,176,2,31,1,210,255,16,255, + 245,254,102,255,111,0,82,2,214,4,200,7,48,11,192,14,116,18,254,21,111,25,146,28,90,31,139,33,105,35,183,36,94,37,175,37,162,37,101,37, + 62,37,79,37,191,37,215,38,124,40,198,42,85,45,5,48,187,50,58,53,28,55,101,56,2,57,213,56,255,55,138,54,217,52,230,50,224,48,47,47, + 192,45,159,44,198,43,220,42,9,42,63,41,154,40,251,39,81,39,107,38,107,37,27,36,127,34,218,32,61,31,227,29,185,28,157,27,144,26,141,25, + 166,24,48,24,241,23,189,23,166,23,130,23,59,23,202,22,53,22,96,21,54,20,165,18,54,17,168,15,23,14,116,12,227,10,127,9,41,8,191,6, + 61,5,179,3,102,2,132,1,208,0,136,0,140,0,234,0,87,1,232,1,146,2,81,3,40,4,75,5,190,6,42,8,69,9,206,9,237,9,196,9, + 48,9,241,7,120,6,25,5,254,3,53,3,217,2,8,3,147,3,44,4,221,4,106,5,159,5,144,5,76,5,198,4,222,3,203,2,144,1,98,0, + 50,255,242,253,147,252,29,251,177,249,130,248,125,247,243,246,197,246,5,247,99,247,159,247,190,247,74,247,115,246,13,245,84,243,51,241,206,238,162,236, + 92,234,64,232,130,230,77,229,188,228,168,228,15,229,216,229,217,230,43,232,178,233,38,235,91,236,1,237,245,236,138,236,14,236,132,235,197,234,229,233, + 223,232,217,231,1,231,80,230,234,229,124,229,23,229,195,228,82,228,182,227,162,227,19,228,163,228,69,229,243,229,145,230,93,231,83,232,125,233,199,234, + 86,236,198,237,150,238,176,238,97,238,10,238,220,237,10,238,143,238,16,239,10,239,90,238,69,237,68,236,210,235,9,236,213,236,219,237,206,238,222,239, + 99,241,3,243,42,244,170,244,173,244,44,244,10,243,184,241,131,240,89,239,11,238,149,236,219,234,212,232,188,230,88,228,227,225,232,223,73,222,223,220, + 209,219,147,219,61,220,61,221,237,221,241,221,138,221,142,221,23,222,37,223,195,224,28,227,236,229,164,232,242,234,19,237,21,239,253,240,145,242,201,243, + 143,244,74,245,49,246,71,247,127,248,142,249,238,249,21,249,33,247,97,244,149,241,71,239,237,237,141,237,49,238,125,239,166,241,118,244,23,248,247,251, + 130,255,237,1,248,2,189,2,161,1,212,255,202,253,251,251,245,250,118,250,58,250,138,249,109,248,247,246,76,245,163,243,69,242,134,241,130,241,77,242, + 113,243,139,244,201,245,221,246,148,247,246,247,8,248,123,248,54,249,108,250,10,252,220,253,94,255,129,0,27,1,147,0,50,255,56,253,110,251,79,250, + 89,250,179,251,74,254,158,1,187,5,135,10,102,15,0,20,245,23,142,27,219,30,117,33,70,35,147,36,132,37,90,38,41,39,236,39,123,40,8,41, + 213,41,12,43,164,44,175,46,75,49,3,52,158,54,82,57,235,59,19,62,114,63,23,64,54,64,203,63,166,62,234,60,206,58,147,56,162,54,203,52, + 241,50,101,49,234,47,116,46,209,44,21,43,66,41,154,39,38,38,231,36,218,35,184,34,111,33,24,32,202,30,163,29,153,28,224,27,140,27,95,27, + 97,27,153,27,246,27,121,28,240,28,20,29,207,28,20,28,27,27,242,25,179,24,77,23,222,21,82,20,191,18,1,17,2,15,28,13,138,11,66,10, + 32,9,42,8,118,7,36,7,235,6,248,6,22,7,46,7,81,7,114,7,76,7,162,6,207,5,9,5,189,4,163,4,220,4,189,4,180,4,126,4, + 77,4,220,3,163,3,123,3,136,3,197,3,149,4,188,5,224,6,238,7,193,8,66,9,63,9,223,8,43,8,105,7,181,6,7,6,57,5,62,4, + 39,3,36,2,209,0,47,255,171,253,49,252,233,250,237,249,37,249,166,248,126,248,164,248,163,248,91,248,81,247,154,245,65,243,77,240,68,237,14,234, + 216,230,39,228,21,226,191,224,8,224,243,223,97,224,50,225,133,226,78,228,178,230,60,233,168,235,180,237,205,238,35,239,249,238,86,238,71,237,204,235, + 13,234,125,232,32,231,90,230,62,230,47,230,23,230,189,229,88,229,231,228,139,228,74,228,106,228,160,228,213,228,244,228,5,229,27,229,102,229,210,229, + 207,230,8,232,229,232,74,233,180,233,17,234,92,234,182,234,44,235,137,235,91,235,172,234,236,233,244,232,4,232,202,231,115,232,68,233,219,233,189,234, + 43,236,228,237,133,239,154,240,237,240,199,240,163,240,216,239,13,238,239,235,20,234,64,232,27,230,175,227,246,224,57,222,174,219,173,217,26,216,168,214, + 130,213,249,212,76,213,140,214,39,216,134,217,86,218,21,219,28,220,153,221,152,223,28,226,232,228,180,231,66,234,140,236,180,238,193,240,151,242,10,244, + 82,245,109,246,128,247,139,248,209,249,22,251,233,251,136,251,252,249,188,247,89,245,69,243,214,241,41,241,98,241,87,242,58,244,19,247,181,250,138,254, + 220,1,98,4,217,5,255,5,245,4,233,2,54,0,188,253,212,251,180,250,14,250,228,249,202,249,159,249,68,249,159,248,156,247,124,246,166,245,244,244, + 209,244,218,244,241,244,212,244,133,244,152,244,220,244,52,245,171,245,183,246,94,248,201,250,166,253,58,0,250,1,185,2,179,2,168,1,209,255,206,253, + 63,252,139,251,82,252,173,254,23,2,134,6,169,11,152,17,95,23,117,28,176,32,30,36,147,38,111,40,192,41,94,42,221,42,58,43,163,43,11,44, + 79,44,252,44,64,46,0,48,68,50,27,53,46,56,96,59,132,62,120,65,247,67,167,69,108,70,95,70,93,69,114,67,238,64,185,61,64,58,228,54, + 2,52,186,49,218,47,145,46,176,45,220,44,231,43,12,43,51,42,110,41,192,40,17,40,230,38,61,37,109,35,244,33,171,32,90,31,127,30,210,29, + 135,29,144,29,170,29,198,29,4,30,19,30,252,29,196,29,54,29,145,28,172,27,144,26,44,25,140,23,5,22,121,20,105,18,81,16,72,14,183,12, + 74,11,247,9,95,8,154,6,3,5,196,3,194,2,251,1,68,1,209,0,104,0,39,0,230,255,106,255,234,254,216,254,59,255,216,255,143,0,128,1, + 114,2,67,3,233,3,130,4,186,4,199,4,232,4,66,5,191,5,162,6,108,7,63,8,248,8,178,9,244,9,193,9,69,9,182,8,243,7,194,6, + 142,5,54,4,171,2,238,0,243,254,183,252,151,250,52,249,109,248,4,248,153,247,38,247,193,246,56,246,90,245,3,244,170,241,216,238,238,235,13,233, + 84,230,255,227,33,226,163,224,207,223,137,223,235,223,159,224,205,225,82,227,11,229,21,231,27,233,244,234,112,236,119,237,244,237,223,237,134,237,188,236, + 171,235,96,234,34,233,79,232,180,231,108,231,41,231,180,230,74,230,164,229,199,228,204,227,220,226,32,226,224,225,210,225,156,225,125,225,209,225,150,226, + 229,227,1,229,1,230,3,231,217,231,132,232,2,233,47,233,83,233,136,233,135,233,39,233,78,232,69,231,61,230,87,229,4,229,58,229,211,229,178,230, + 251,231,93,233,246,234,159,236,56,238,131,239,55,240,55,240,47,239,59,237,153,234,173,231,96,228,225,224,86,221,55,218,156,215,163,213,43,212,226,210, + 215,209,73,209,24,209,74,209,174,209,5,210,246,209,235,209,56,210,41,211,224,212,113,215,169,218,12,222,118,225,30,229,202,232,87,236,149,239,120,242, + 230,244,183,246,74,248,4,250,41,252,128,254,157,0,31,2,142,2,7,2,123,0,76,254,16,252,36,250,59,249,98,249,159,250,175,252,105,255,106,2, + 162,5,117,8,178,10,178,11,29,11,51,9,151,6,226,3,135,1,241,255,147,255,120,255,172,255,109,255,178,254,17,253,186,250,245,247,169,245,216,243, + 95,242,244,240,248,239,96,239,50,239,28,239,96,239,204,239,74,240,103,241,106,243,239,245,206,248,175,251,56,254,21,0,187,0,137,0,183,255,128,254, + 145,253,56,253,179,253,27,255,87,1,204,4,82,9,93,14,187,19,234,24,180,29,244,33,125,37,248,39,149,41,181,42,144,43,114,44,75,45,44,46, + 85,47,116,48,213,49,147,51,181,53,18,56,118,58,7,61,209,63,151,66,8,69,203,70,207,71,87,72,30,72,250,70,187,68,154,65,68,62,200,58, + 147,55,246,52,10,51,219,49,55,49,180,48,12,48,8,47,212,45,118,44,11,43,135,41,239,39,83,38,216,36,97,35,56,34,86,33,222,32,155,32, + 146,32,130,32,60,32,244,31,180,31,96,31,224,30,241,29,251,28,182,27,128,26,71,25,25,24,99,22,36,20,239,17,217,15,193,13,155,11,196,9, + 153,8,218,7,129,7,22,7,104,6,191,5,185,4,186,3,117,2,76,1,226,255,200,254,67,254,229,253,210,253,22,254,227,254,190,255,177,0,141,1, + 21,2,169,2,52,3,145,3,186,3,232,3,72,4,245,4,250,5,33,7,132,8,174,9,159,10,91,11,171,11,135,11,5,11,17,10,228,8,141,7, + 1,6,37,4,21,2,42,0,103,254,179,252,212,250,243,248,175,247,160,246,143,245,161,244,3,244,115,243,28,243,180,242,161,241,214,239,113,237,199,234, + 89,232,217,229,156,227,127,225,202,223,156,222,57,222,85,222,199,222,127,223,195,224,117,226,143,228,195,230,225,232,200,234,58,236,47,237,181,237,183,237, + 5,237,225,235,135,234,79,233,58,232,149,231,108,231,148,231,202,231,195,231,58,231,112,230,76,229,38,228,81,227,159,226,255,225,126,225,86,225,162,225, + 25,226,231,226,38,228,157,229,134,230,188,230,237,230,55,231,104,231,138,231,0,232,58,232,177,231,87,230,255,228,31,228,212,227,44,228,197,228,125,229, + 74,230,79,231,141,232,164,233,125,234,40,235,120,235,40,235,17,234,122,232,80,230,210,227,55,225,103,222,116,219,127,216,125,213,109,210,169,207,146,205, + 230,203,186,202,57,202,132,202,7,203,38,203,236,202,204,202,24,203,255,203,188,205,28,208,61,211,243,214,11,219,65,223,47,227,183,230,82,234,40,238, + 25,242,150,245,37,248,3,250,225,251,33,254,151,0,194,2,15,4,47,4,124,3,9,2,40,0,52,254,223,252,136,252,219,252,186,253,70,255,154,1, + 175,4,227,7,138,10,44,12,150,12,235,11,106,10,120,8,66,6,76,4,19,3,133,2,193,2,114,3,192,3,70,3,45,2,181,0,192,254,147,252, + 76,250,26,248,125,246,197,244,102,243,180,242,108,242,173,242,115,243,170,244,41,246,200,247,80,250,19,253,231,255,93,2,85,4,19,5,210,4,232,3, + 186,2,118,1,126,0,114,0,97,1,44,3,183,5,12,9,244,12,74,17,253,21,222,26,150,31,232,35,136,39,16,42,216,43,233,44,139,45,140,45, + 21,45,208,44,54,45,45,46,229,47,53,50,31,53,133,56,1,60,61,63,22,66,108,68,109,70,244,71,210,72,230,72,62,72,243,70,246,68,122,66, + 201,63,26,61,92,58,60,56,162,54,121,53,125,52,96,51,31,50,177,48,55,47,214,45,148,44,7,43,63,41,96,39,204,37,105,36,45,35,254,33, + 39,33,119,32,205,31,13,31,23,30,2,29,23,28,79,27,117,26,40,25,194,23,152,22,154,21,157,20,98,19,158,17,215,15,57,14,180,12,98,11, + 37,10,78,9,186,8,68,8,143,7,115,6,241,4,109,3,237,1,133,0,137,255,169,254,138,254,203,254,94,255,25,0,249,0,236,1,250,2,12,4, + 236,4,144,5,8,6,86,6,162,6,4,7,159,7,52,8,228,8,226,9,50,11,181,12,124,14,69,16,160,17,133,18,181,18,73,18,22,17,57,15, + 51,13,253,10,139,8,24,6,188,3,101,1,220,254,49,252,119,249,56,247,150,245,96,244,174,243,73,243,230,242,162,242,233,241,73,241,250,239,235,237, + 34,235,92,232,98,229,151,226,250,223,179,221,206,219,87,218,127,217,31,217,36,217,247,217,172,219,20,222,165,224,238,226,163,228,144,229,45,230,128,230, + 104,230,20,230,116,229,38,229,250,228,62,229,222,229,126,230,239,230,127,231,234,231,7,232,113,231,199,230,238,229,15,229,95,228,140,227,118,226,205,225, + 181,225,111,226,85,227,42,228,69,229,178,230,233,231,141,232,236,232,18,233,99,233,196,233,154,233,144,232,250,230,218,229,150,229,221,229,30,230,252,229, + 235,229,238,229,34,230,192,230,130,231,233,231,172,231,127,231,89,231,141,230,12,229,106,227,151,225,250,222,201,219,23,217,147,214,105,211,50,208,79,205, + 14,203,35,201,119,199,152,198,138,198,228,198,74,199,38,199,225,198,193,198,69,199,191,200,89,203,115,206,243,209,29,214,210,218,150,223,246,227,240,231, + 47,236,110,240,216,243,81,246,91,248,158,250,145,253,234,0,76,4,197,6,204,7,189,7,21,7,194,5,47,4,129,2,92,1,206,0,234,0,230,1, + 200,3,93,6,64,9,23,12,65,14,77,15,10,15,137,13,187,11,160,9,164,7,216,5,218,4,41,5,26,6,237,6,195,6,134,5,163,3,160,1, + 165,255,222,253,102,252,229,250,88,249,128,248,37,248,2,248,4,248,22,248,61,248,196,248,244,249,230,251,145,254,168,1,236,4,193,7,44,9,14,9, + 229,7,143,6,227,4,67,3,79,2,14,2,167,2,15,4,187,6,144,10,16,15,247,19,0,25,199,29,228,33,40,37,12,39,251,39,74,40,89,40, + 71,40,34,40,53,40,0,41,203,42,92,45,104,48,214,51,137,55,191,59,243,63,204,67,242,70,96,73,64,75,174,76,98,77,36,77,232,75,150,73, + 221,70,255,67,61,65,161,62,108,60,176,58,115,57,29,56,141,54,218,52,212,50,250,48,109,47,60,46,16,45,111,43,196,41,93,40,245,38,118,37, + 170,35,197,33,88,32,98,31,167,30,160,29,102,28,42,27,54,26,255,24,144,23,33,22,207,20,238,19,86,19,108,18,245,16,28,15,22,13,40,11, + 226,8,177,6,186,4,62,3,30,2,87,1,190,0,51,0,214,255,159,255,165,255,181,255,221,255,51,0,190,0,72,1,178,1,3,2,85,2,217,2, + 134,3,114,4,159,5,208,6,158,7,41,8,178,8,105,9,17,10,43,11,190,12,135,14,105,16,71,18,220,19,63,21,38,22,98,22,233,21,97,20, + 59,18,163,15,145,12,113,9,68,6,105,3,198,0,4,254,107,251,224,248,20,247,160,245,161,244,203,243,32,243,103,242,245,241,42,241,21,240,49,238, + 182,235,28,233,79,230,200,227,25,225,78,222,252,219,242,217,74,216,13,215,45,214,24,214,142,214,174,215,65,217,40,219,5,221,147,222,224,223,238,224, + 152,225,234,225,163,225,53,225,131,224,224,223,184,223,90,224,132,225,200,226,232,227,240,228,160,229,177,229,102,229,236,228,114,228,164,227,171,226,0,226, + 73,225,158,224,199,224,166,225,164,226,92,227,28,228,196,228,240,228,232,228,22,229,198,229,138,230,83,231,22,232,83,232,234,231,53,231,162,230,63,230, + 228,229,157,229,238,229,77,230,188,230,65,231,194,231,205,231,33,231,9,230,201,228,53,227,66,225,44,223,236,220,144,218,208,215,226,212,248,209,6,207, + 82,204,25,202,87,200,7,199,226,197,104,197,211,197,137,198,233,198,233,198,156,198,186,198,202,199,186,201,124,204,236,207,34,212,235,216,230,221,110,226, + 148,230,157,234,252,238,44,243,183,246,241,249,34,253,151,0,67,4,122,7,228,9,58,11,88,11,164,10,66,9,171,7,22,6,81,5,87,5,246,5, + 141,6,165,7,153,9,37,12,193,14,191,16,199,17,12,18,72,17,233,15,215,13,201,11,62,10,85,9,239,8,12,9,24,9,142,8,96,7,213,5, + 99,4,133,2,166,0,111,255,69,254,12,253,191,251,222,250,101,250,72,250,91,250,145,250,50,251,73,252,52,254,107,0,214,2,5,5,154,6,54,7, + 55,6,54,4,153,1,18,255,33,253,255,251,7,252,244,252,181,254,179,1,145,5,250,9,243,14,230,19,120,24,171,28,6,32,17,34,213,34,4,35, + 9,35,251,34,242,34,27,35,253,35,176,37,87,40,183,43,145,47,139,51,138,55,137,59,122,63,235,66,207,69,24,72,135,73,255,73,132,73,1,72, + 215,69,36,67,130,64,235,61,161,59,254,57,213,56,226,55,29,55,25,54,253,52,154,51,249,49,149,48,121,47,67,46,159,44,171,42,0,41,153,39, + 58,38,133,36,192,34,1,33,191,31,167,30,72,29,240,27,219,26,238,25,98,25,231,24,70,24,148,23,189,22,164,21,53,20,48,18,192,15,35,13, + 204,10,193,8,202,6,218,4,145,3,42,3,19,3,247,2,239,2,52,3,106,3,152,3,147,3,171,3,170,3,177,3,19,4,124,4,4,5,212,5, + 163,6,121,7,82,8,34,9,207,9,65,10,204,10,73,11,142,11,7,12,217,12,28,14,175,15,141,17,82,19,230,20,42,22,203,22,235,22,81,22, + 232,20,29,19,202,16,117,14,30,12,139,9,79,7,5,5,52,2,238,254,227,251,184,249,247,247,93,246,212,244,126,243,69,242,15,241,255,239,89,238, + 45,236,233,233,79,231,120,228,191,225,196,222,81,220,21,218,16,216,9,214,18,212,136,210,35,210,81,210,69,211,8,213,21,215,51,217,78,219,158,220, + 79,221,61,221,49,221,97,221,193,221,51,222,217,222,209,223,8,225,81,226,180,227,210,228,153,229,167,229,235,228,180,227,164,226,35,226,90,225,57,224, + 162,223,185,223,220,223,185,223,191,223,105,224,29,226,158,227,92,228,138,228,5,229,163,229,14,230,50,230,70,230,195,230,71,231,98,231,230,230,8,230, + 220,229,188,230,199,231,139,232,154,233,219,234,103,235,55,235,206,234,28,234,240,232,108,231,192,229,233,227,190,225,180,223,151,221,98,219,197,216,75,213, + 145,209,26,206,164,203,97,202,50,201,0,200,83,199,86,199,242,199,158,200,165,200,253,199,74,199,36,199,14,200,10,202,70,205,27,210,139,215,146,220, + 17,225,189,229,153,234,101,239,210,243,247,247,218,251,41,255,30,2,235,4,153,7,175,9,18,11,127,11,202,10,20,9,252,6,224,4,206,3,210,3, + 90,4,124,5,130,7,192,10,86,14,230,17,218,20,51,23,184,24,238,24,116,23,219,20,207,17,8,15,210,12,187,11,76,11,239,10,51,10,177,9, + 207,8,112,7,205,5,191,4,44,4,221,3,78,3,142,2,85,1,4,0,253,254,44,254,132,253,253,252,196,252,150,253,225,254,119,0,90,2,33,4, + 43,5,153,4,239,2,147,0,0,254,104,251,169,249,229,248,239,248,15,250,226,251,85,254,105,1,87,5,196,9,85,14,215,18,81,23,240,26,90,29, + 194,30,172,31,65,32,220,32,229,33,72,35,226,36,5,39,162,41,31,45,51,49,128,53,216,57,7,62,223,65,129,69,126,72,138,74,177,75,60,76, + 237,75,144,74,50,72,87,69,114,66,176,63,40,61,49,59,209,57,177,56,173,55,160,54,33,53,43,51,55,49,178,47,59,46,128,44,91,42,17,40, + 190,37,126,35,125,33,123,31,145,29,182,28,45,28,250,27,185,27,115,27,49,27,196,26,2,26,37,25,220,23,168,22,152,21,114,20,224,18,61,17, + 3,15,210,12,224,10,182,8,191,6,115,5,243,4,196,4,177,4,159,4,84,4,23,4,22,4,52,4,58,4,145,4,133,5,123,6,29,7,166,7, + 95,8,23,9,218,9,200,10,160,11,48,12,241,12,193,13,174,14,142,15,85,16,41,17,29,18,74,19,93,20,49,21,224,21,124,22,12,23,254,22, + 202,22,71,22,49,21,158,19,130,17,37,15,102,12,75,9,50,6,35,3,221,255,100,252,51,249,164,246,155,244,5,243,174,241,114,240,114,239,103,238, + 105,237,47,236,197,234,237,232,185,230,145,228,201,225,136,222,73,219,56,216,245,213,245,211,91,210,135,209,157,209,157,210,29,212,13,214,16,216,36,218, + 122,219,64,220,3,220,161,219,242,219,172,220,23,221,59,221,146,221,15,222,236,222,216,223,239,224,212,225,83,226,101,226,255,225,48,225,45,224,225,223, + 188,223,139,223,177,223,20,224,122,224,248,224,242,225,128,227,206,228,101,229,117,229,119,229,95,229,81,229,106,229,70,229,38,229,152,229,156,229,215,228, + 6,228,198,227,71,228,85,229,248,230,155,232,194,233,77,234,250,234,110,235,255,234,197,233,182,232,165,231,61,230,103,228,241,226,181,225,234,223,226,221, + 133,219,246,216,20,214,79,211,106,209,89,208,112,207,94,206,92,205,192,204,1,205,135,205,134,205,218,204,112,204,16,205,187,206,70,209,252,212,185,217, + 190,222,107,227,172,231,171,235,187,239,205,243,175,247,28,251,222,253,62,0,183,2,23,5,115,7,193,9,81,11,180,11,196,10,16,9,87,7,239,5, + 52,5,249,4,108,5,65,6,187,7,12,10,64,13,175,16,211,19,247,21,210,22,63,22,95,20,200,17,246,14,155,12,83,11,102,11,137,11,144,11, + 76,11,240,10,48,10,30,9,244,7,130,6,3,5,179,3,138,2,103,1,64,0,122,255,247,254,157,254,106,254,239,254,213,255,69,1,204,2,83,4, + 151,5,76,6,244,5,149,4,196,1,16,254,122,250,116,247,168,245,238,244,125,245,45,247,206,249,89,253,162,1,71,6,184,10,203,14,126,18,154,21, + 246,23,152,25,176,26,160,27,148,28,159,29,142,30,190,31,150,33,245,35,215,38,134,42,199,46,71,51,204,55,20,60,221,63,217,66,3,69,58,70, + 195,70,168,70,190,69,238,67,68,65,176,62,45,60,252,57,46,56,174,54,121,53,111,52,136,51,62,50,180,48,51,47,168,45,230,43,22,42,63,40, + 233,37,141,35,118,33,107,31,191,29,52,28,2,27,126,26,89,26,112,26,79,26,54,26,22,26,218,25,71,25,130,24,173,23,155,22,129,21,29,20, + 137,18,207,16,233,14,11,13,45,11,102,9,194,7,93,6,149,5,246,4,108,4,253,3,236,3,249,3,73,4,199,4,148,5,152,6,115,7,60,8, + 246,8,142,9,229,9,44,10,110,10,192,10,213,10,54,11,148,11,21,12,159,12,6,13,128,13,24,14,246,14,58,16,108,17,190,18,252,19,59,21, + 15,22,146,22,130,22,6,22,16,21,133,19,2,17,240,13,108,10,216,6,131,3,48,0,53,253,249,249,23,247,191,244,228,242,137,241,116,240,211,239, + 53,239,100,238,23,237,92,235,42,233,102,230,38,227,250,223,216,220,213,217,20,215,10,213,227,211,43,211,228,210,15,211,167,211,221,212,85,214,131,216, + 160,218,69,220,194,221,56,222,150,222,197,222,164,222,182,222,204,222,213,222,246,222,98,223,63,224,72,225,28,226,100,226,28,226,151,225,8,225,0,225, + 4,225,248,224,62,225,230,225,93,226,62,226,68,226,146,226,65,227,186,227,28,228,134,228,199,228,31,229,181,229,131,230,55,231,147,231,241,231,7,232, + 180,231,136,231,231,231,194,232,136,233,111,234,105,235,70,236,152,236,194,236,40,237,94,237,12,237,134,236,90,236,178,235,154,234,255,232,97,231,192,229, + 186,227,166,225,51,223,147,220,36,218,241,215,0,214,62,212,228,210,248,209,160,209,240,209,100,210,218,210,36,211,98,211,242,211,220,212,147,214,148,217, + 201,221,74,226,219,230,83,235,173,239,57,243,113,246,100,249,248,251,70,254,130,0,225,2,11,5,230,6,117,8,156,9,239,9,1,9,58,7,242,4, + 64,3,157,2,205,2,103,3,128,4,87,6,44,9,180,12,251,15,83,18,198,19,5,20,104,19,219,17,128,15,212,12,195,10,203,9,64,9,106,9, + 75,9,62,9,201,8,233,7,0,7,32,6,192,4,41,3,137,1,26,0,134,254,10,253,216,251,36,251,238,250,82,251,255,251,80,253,111,255,220,1, + 81,4,48,6,18,7,137,6,218,4,52,2,249,254,194,251,206,248,158,246,107,245,96,245,200,246,52,249,78,252,8,0,34,4,102,8,122,12,242,15, + 141,18,173,20,110,22,239,23,46,25,68,26,55,27,84,28,188,29,71,31,38,33,130,35,90,38,173,41,39,45,159,48,247,51,14,55,164,57,221,59, + 100,61,112,62,186,62,56,62,220,60,211,58,51,56,173,53,156,51,28,50,57,49,73,48,121,47,109,46,5,45,46,43,4,41,219,38,253,36,22,35, + 95,33,216,31,50,30,16,29,41,28,142,27,2,27,154,26,45,26,3,26,234,25,190,25,79,25,152,24,189,23,243,22,221,21,204,20,230,19,64,19, + 177,18,225,17,168,16,2,15,11,13,247,10,2,9,57,7,252,5,54,5,160,4,26,4,213,3,192,3,165,3,171,3,217,3,65,4,184,4,62,5, + 184,5,57,6,140,6,244,6,61,7,137,7,186,7,234,7,7,8,79,8,167,8,45,9,153,9,33,10,193,10,158,11,174,12,238,13,30,15,40,16, + 22,17,234,17,113,18,165,18,61,18,77,17,181,15,112,13,199,10,85,7,142,3,142,255,190,251,108,248,178,245,234,243,120,242,164,241,163,240,24,240, + 208,239,97,239,211,238,181,237,43,236,81,234,8,232,148,229,227,226,243,223,79,221,78,219,228,217,109,217,137,217,57,218,40,219,110,220,160,221,8,223, + 220,224,103,226,237,227,27,229,216,229,61,230,185,230,22,231,248,230,185,230,99,230,86,230,117,230,181,230,80,231,68,232,236,232,117,233,197,233,196,233, + 132,233,35,233,170,232,42,232,148,231,232,230,130,230,124,230,245,230,172,231,104,232,125,233,132,234,77,235,149,235,189,235,4,236,66,236,117,236,123,236, + 94,236,202,235,83,235,49,235,119,235,231,235,223,236,46,238,54,239,186,239,102,240,74,241,97,242,198,242,205,242,121,242,175,241,129,240,245,238,90,237, + 179,235,24,234,130,232,183,230,33,229,208,227,254,226,56,226,64,225,54,224,193,223,227,223,52,224,174,224,90,225,53,226,41,227,91,228,231,229,22,232, + 203,234,188,237,193,240,152,243,42,246,164,248,3,251,85,253,173,255,241,1,181,3,48,5,94,6,128,7,110,8,1,9,37,9,139,8,112,7,241,5, + 152,4,200,3,120,3,206,3,124,4,180,5,227,6,92,8,47,10,30,12,245,13,24,15,2,15,53,14,212,12,174,11,221,10,108,10,65,10,96,10, + 144,10,173,10,132,10,183,9,38,8,108,6,16,5,154,3,179,2,244,1,49,1,119,0,220,255,90,255,9,255,5,255,113,255,114,0,179,1,75,3, + 249,4,98,6,60,7,43,7,62,6,159,4,54,2,155,255,24,253,17,251,249,249,122,249,212,249,252,250,205,252,39,255,137,1,183,3,187,5,216,7, + 249,9,206,11,94,13,162,14,136,15,45,16,124,16,206,16,41,17,126,17,22,18,31,19,167,20,106,22,136,24,214,26,15,29,15,31,2,33,153,34, + 189,35,122,36,118,36,199,35,160,34,133,33,128,32,103,31,55,30,56,29,107,28,132,27,135,26,67,25,195,23,60,22,16,21,240,19,210,18,189,17, + 231,16,31,16,74,15,157,14,193,13,8,13,204,12,179,12,154,12,86,12,82,12,115,12,180,12,237,12,212,12,181,12,210,12,252,12,252,12,161,12, + 75,12,196,11,22,11,58,10,45,9,230,7,168,6,148,5,180,4,249,3,35,3,111,2,17,2,27,2,71,2,157,2,5,3,120,3,231,3,92,4, + 174,4,218,4,11,5,70,5,137,5,246,5,64,6,102,6,101,6,114,6,137,6,168,6,209,6,28,7,97,7,205,7,64,8,240,8,150,9,65,10, + 225,10,26,11,50,11,2,11,132,10,41,10,106,9,149,8,97,7,245,5,59,4,84,2,68,0,18,254,3,252,60,250,243,248,192,247,10,247,140,246, + 17,246,96,245,144,244,191,243,227,242,30,242,145,240,47,239,221,237,133,236,135,235,190,234,167,233,254,232,150,232,97,232,209,232,39,233,187,233,179,234, + 243,235,249,236,194,237,118,238,213,238,71,239,106,239,196,239,43,240,89,240,59,240,66,240,103,240,111,240,135,240,243,240,60,241,98,241,130,241,132,241, + 98,241,66,241,26,241,229,240,157,240,50,240,185,239,151,239,161,239,241,239,131,240,56,241,251,241,72,242,159,242,220,242,249,242,14,243,21,243,30,243, + 14,243,166,242,38,242,213,241,197,241,4,242,156,242,82,243,53,244,237,244,184,245,114,246,51,247,196,247,15,248,45,248,83,248,65,248,220,247,62,247, + 146,246,196,245,201,244,174,243,166,242,188,241,22,241,212,240,229,240,248,240,248,240,1,241,94,241,228,241,83,242,145,242,28,243,234,243,248,244,103,246, + 43,248,250,249,227,251,213,253,162,255,93,1,230,2,37,4,95,5,151,6,216,7,251,8,253,9,184,10,122,11,41,12,143,12,93,12,119,11,51,10, + 218,8,201,7,49,7,197,6,194,6,217,6,104,7,64,8,53,9,55,10,63,11,64,12,208,12,183,12,0,12,18,11,35,10,138,9,134,9,237,9, + 142,10,235,10,19,11,253,10,78,10,109,9,41,8,181,6,84,5,11,4,244,2,74,2,223,1,164,1,135,1,122,1,79,1,57,1,99,1,194,1, + 117,2,82,3,232,3,37,4,213,3,247,2,130,1,174,255,142,253,250,251,222,250,50,250,50,250,183,250,179,251,9,253,139,254,11,0,125,1,182,2, + 190,3,178,4,117,5,252,5,47,6,19,6,195,5,108,5,66,5,101,5,162,5,69,6,31,7,46,8,117,9,29,11,177,12,11,14,73,15,116,16, + 63,17,164,17,238,17,32,18,206,17,0,17,11,16,193,14,126,13,69,12,36,11,33,10,100,9,218,8,78,8,158,7,212,6,30,6,99,5,163,4, + 13,4,135,3,8,3,178,2,120,2,70,2,28,2,23,2,106,2,210,2,39,3,128,3,240,3,145,4,57,5,162,5,203,5,28,6,127,6,188,6, + 231,6,213,6,144,6,11,6,124,5,33,5,153,4,29,4,202,3,152,3,109,3,70,3,26,3,222,2,172,2,151,2,182,2,235,2,39,3,127,3, + 232,3,66,4,141,4,166,4,167,4,189,4,231,4,4,5,33,5,76,5,159,5,203,5,212,5,220,5,4,6,47,6,147,6,228,6,122,7,27,8, + 143,8,201,8,179,8,157,8,75,8,187,7,54,7,83,6,144,5,138,4,145,3,114,2,78,1,26,0,182,254,118,253,28,252,240,250,37,250,116,249, + 39,249,5,249,188,248,51,248,80,247,78,246,153,245,188,244,253,243,58,243,109,242,209,241,76,241,211,240,125,240,13,240,212,239,223,239,25,240,107,240, + 2,241,189,241,130,242,90,243,169,243,206,243,172,243,138,243,162,243,251,243,61,244,151,244,238,244,100,245,229,245,67,246,95,246,55,246,244,245,88,245, + 227,244,101,244,7,244,0,244,36,244,116,244,147,244,202,244,21,245,108,245,151,245,130,245,103,245,43,245,212,244,158,244,191,244,248,244,46,245,140,245, + 214,245,186,245,148,245,125,245,165,245,86,246,23,247,229,247,178,248,65,249,201,249,89,250,7,251,168,251,7,252,75,252,60,252,17,252,198,251,103,251, + 39,251,11,251,223,250,151,250,87,250,83,250,118,250,179,250,230,250,88,251,189,251,245,251,23,252,60,252,114,252,151,252,196,252,35,253,214,253,189,254, + 228,255,60,1,185,2,19,4,68,5,72,6,103,7,88,8,57,9,222,9,120,10,30,11,241,11,181,12,125,13,236,13,41,14,29,14,190,13,17,13, + 39,12,252,10,229,9,251,8,79,8,13,8,194,7,158,7,70,8,41,9,2,10,220,10,54,11,48,11,247,10,139,10,249,9,135,9,203,8,125,8, + 52,8,238,7,143,7,57,7,238,6,253,6,17,7,17,7,223,6,143,6,3,6,113,5,184,4,18,4,125,3,6,3,248,2,193,2,156,2,161,2, + 114,2,34,2,223,1,86,1,127,0,158,255,166,254,189,253,235,252,35,252,140,251,60,251,251,250,31,251,151,251,75,252,78,253,137,254,230,255,21,1, + 42,2,218,2,87,3,93,3,8,3,110,2,179,1,231,0,32,0,134,255,41,255,47,255,181,255,141,0,118,1,102,2,53,3,188,3,251,3,40,4, + 112,4,162,4,185,4,227,4,206,4,130,4,38,4,143,3,165,2,172,1,234,0,91,0,159,255,25,255,225,254,159,254,116,254,137,254,120,254,87,254, + 65,254,228,253,134,253,236,252,82,252,223,251,197,251,252,251,74,252,190,252,113,253,112,254,55,255,227,255,111,0,191,0,9,1,114,1,222,1,48,2, + 138,2,255,2,143,3,211,3,175,3,109,3,53,3,232,2,194,2,201,2,215,2,1,3,63,3,117,3,118,3,70,3,225,2,140,2,103,2,99,2, + 89,2,75,2,117,2,214,2,30,3,100,3,168,3,225,3,37,4,77,4,85,4,81,4,73,4,84,4,102,4,135,4,232,4,51,5,134,5,207,5, + 228,5,228,5,199,5,147,5,75,5,12,5,189,4,117,4,247,3,89,3,194,2,255,1,47,1,107,0,130,255,239,254,127,254,27,254,185,253,39,253, + 120,252,232,251,94,251,215,250,139,250,101,250,3,250,169,249,221,248,52,248,196,247,203,246,45,246,136,245,255,244,188,244,172,244,223,244,11,245,36,245, + 104,245,252,245,154,246,239,246,53,247,121,247,124,247,146,247,123,247,53,247,35,247,6,247,110,247,4,248,98,248,181,248,200,248,177,248,76,248,208,247, + 96,247,22,247,212,246,160,246,156,246,160,246,221,246,40,247,113,247,168,247,178,247,161,247,128,247,100,247,63,247,66,247,80,247,77,247,102,247,154,247, + 254,247,83,248,137,248,246,248,87,249,214,249,104,250,249,250,121,251,202,251,70,252,194,252,110,253,22,254,166,254,243,254,25,255,54,255,58,255,5,255, + 159,254,73,254,33,254,16,254,49,254,115,254,234,254,142,255,15,0,143,0,240,0,97,1,175,1,241,1,92,2,181,2,235,2,27,3,93,3,214,3, + 138,4,131,5,119,6,125,7,104,8,67,9,239,9,91,10,134,10,188,10,18,11,141,11,246,11,29,12,90,12,156,12,26,13,94,13,74,13,219,12, + 95,12,228,11,93,11,164,10,208,9,91,9,59,9,59,9,92,9,170,9,197,9,23,10,73,10,35,10,236,9,127,9,27,9,179,8,135,8,84,8, + 225,7,151,7,31,7,198,6,69,6,217,5,79,5,228,4,163,4,213,4,247,4,52,5,111,5,40,5,217,4,90,4,197,3,46,3,133,2,28,2, + 223,1,164,1,75,1,166,0,226,255,29,255,99,254,128,253,133,252,173,251,226,250,111,250,83,250,118,250,27,251,9,252,70,253,108,254,130,255,60,0, + 168,0,241,0,17,1,24,1,230,0,125,0,10,0,102,255,209,254,106,254,51,254,12,254,24,254,62,254,130,254,162,254,170,254,5,255,141,255,217,255, + 0,0,228,255,148,255,44,255,199,254,42,254,118,253,240,252,196,252,165,252,143,252,139,252,79,252,2,252,154,251,56,251,172,250,53,250,246,249,199,249, + 199,249,221,249,10,250,44,250,89,250,140,250,197,250,6,251,93,251,166,251,247,251,103,252,237,252,123,253,58,254,39,255,205,255,94,0,202,0,51,1, + 133,1,204,1,32,2,118,2,211,2,26,3,88,3,121,3,109,3,92,3,99,3,132,3,141,3,157,3,142,3,116,3,73,3,251,2,131,2,31,2, + 208,1,178,1,141,1,114,1,103,1,105,1,126,1,154,1,202,1,233,1,14,2,63,2,107,2,124,2,140,2,186,2,37,3,95,3,136,3,116,3, + 118,3,174,3,210,3,22,4,2,4,231,3,153,3,3,3,93,2,166,1,234,0,79,0,250,255,205,255,145,255,127,255,84,255,54,255,250,254,191,254, + 159,254,127,254,58,254,244,253,152,253,75,253,5,253,189,252,114,252,20,252,101,251,109,250,144,249,216,248,99,248,61,248,1,248,190,247,220,247,37,248, + 121,248,227,248,54,249,94,249,165,249,250,249,57,250,112,250,96,250,65,250,37,250,230,249,165,249,73,249,32,249,26,249,73,249,105,249,98,249,93,249, + 91,249,77,249,86,249,70,249,84,249,136,249,142,249,134,249,119,249,72,249,11,249,177,248,94,248,52,248,29,248,91,248,164,248,239,248,19,249,62,249, + 94,249,100,249,124,249,184,249,255,249,155,250,72,251,30,252,255,252,208,253,91,254,243,254,105,255,217,255,51,0,105,0,145,0,184,0,227,0,11,1, + 39,1,28,1,15,1,240,0,198,0,212,0,233,0,14,1,89,1,169,1,222,1,71,2,183,2,67,3,220,3,96,4,171,4,241,4,45,5,151,5, + 53,6,206,6,99,7,226,7,95,8,247,8,124,9,235,9,119,10,229,10,36,11,47,11,56,11,61,11,72,11,50,11,37,11,40,11,26,11,25,11, + 199,10,83,10,226,9,154,9,132,9,143,9,163,9,201,9,246,9,31,10,23,10,218,9,131,9,9,9,149,8,43,8,165,7,235,6,73,6,174,5, + 84,5,44,5,15,5,241,4,227,4,211,4,180,4,124,4,62,4,243,3,189,3,139,3,135,3,196,3,185,3,159,3,99,3,248,2,126,2,23,2, + 175,1,89,1,27,1,193,0,73,0,180,255,254,254,20,254,45,253,78,252,139,251,11,251,202,250,224,250,97,251,43,252,13,253,202,253,121,254,235,254, + 76,255,113,255,140,255,174,255,194,255,187,255,246,255,244,255,196,255,123,255,39,255,211,254,142,254,84,254,55,254,31,254,1,254,208,253,153,253,63,253, + 211,252,164,252,133,252,61,252,220,251,93,251,206,250,104,250,3,250,178,249,122,249,109,249,142,249,162,249,167,249,123,249,43,249,207,248,128,248,79,248, + 40,248,43,248,123,248,252,248,155,249,58,250,234,250,136,251,14,252,106,252,149,252,176,252,236,252,28,253,110,253,233,253,106,254,253,254,129,255,0,0, + 133,0,234,0,72,1,151,1,209,1,0,2,25,2,111,2,215,2,28,3,88,3,89,3,49,3,254,2,189,2,117,2,52,2,241,1,202,1,164,1, + 126,1,78,1,255,0,197,0,140,0,108,0,62,0,19,0,235,255,209,255,208,255,234,255,29,0,129,0,248,0,89,1,141,1,128,1,90,1,79,1, + 75,1,92,1,132,1,132,1,139,1,135,1,96,1,21,1,172,0,69,0,241,255,187,255,116,255,69,255,62,255,34,255,58,255,106,255,123,255,151,255, + 142,255,129,255,162,255,191,255,203,255,195,255,166,255,105,255,249,254,134,254,244,253,120,253,34,253,186,252,125,252,254,251,153,251,68,251,75,251,43,251, + 79,251,112,251,161,251,18,252,99,252,127,252,145,252,74,252,52,252,31,252,23,252,205,251,142,251,117,251,82,251,67,251,43,251,223,250,165,250,159,250, + 191,250,235,250,6,251,28,251,61,251,93,251,50,251,252,250,144,250,31,250,227,249,158,249,134,249,130,249,165,249,190,249,255,249,44,250,60,250,109,250, + 159,250,169,250,181,250,204,250,17,251,126,251,255,251,174,252,113,253,38,254,210,254,140,255,39,0,168,0,17,1,126,1,209,1,35,2,90,2,132,2, + 161,2,207,2,250,2,45,3,62,3,51,3,37,3,3,3,225,2,215,2,236,2,17,3,116,3,221,3,95,4,218,4,62,5,183,5,105,6,240,6, + 126,7,225,7,48,8,128,8,197,8,251,8,44,9,75,9,150,9,244,9,63,10,114,10,144,10,130,10,149,10,166,10,148,10,74,10,249,9,174,9, + 121,9,67,9,8,9,212,8,210,8,214,8,3,9,41,9,75,9,102,9,96,9,74,9,3,9,172,8,50,8,118,7,158,6,207,5,15,5,145,4, + 76,4,250,3,218,3,243,3,12,4,253,3,246,3,210,3,159,3,139,3,64,3,182,2,23,2,137,1,22,1,212,0,162,0,155,0,223,0,17,1, + 76,1,65,1,4,1,163,0,101,0,0,0,152,255,50,255,169,254,49,254,174,253,49,253,218,252,192,252,182,252,214,252,30,253,95,253,159,253,197,253, + 231,253,26,254,76,254,108,254,153,254,187,254,200,254,205,254,214,254,169,254,135,254,126,254,76,254,41,254,239,253,138,253,38,253,163,252,63,252,243,251, + 146,251,46,251,217,250,140,250,64,250,60,250,12,250,190,249,75,249,198,248,40,248,131,247,247,246,150,246,114,246,160,246,243,246,48,247,130,247,185,247, + 250,247,34,248,80,248,115,248,214,248,86,249,6,250,155,250,47,251,196,251,82,252,232,252,78,253,171,253,244,253,34,254,84,254,112,254,174,254,254,254, + 98,255,198,255,51,0,144,0,11,1,111,1,198,1,16,2,48,2,66,2,107,2,140,2,158,2,146,2,110,2,56,2,237,1,136,1,61,1,244,0, + 205,0,199,0,190,0,169,0,119,0,40,0,196,255,75,255,221,254,163,254,144,254,175,254,209,254,19,255,69,255,94,255,97,255,75,255,119,255,154,255, + 195,255,178,255,149,255,140,255,101,255,69,255,9,255,221,254,203,254,232,254,227,254,223,254,229,254,0,255,16,255,33,255,55,255,75,255,91,255,91,255, + 104,255,147,255,184,255,238,255,47,0,107,0,150,0,155,0,133,0,98,0,3,0,140,255,25,255,178,254,113,254,49,254,5,254,236,253,231,253,207,253, + 186,253,177,253,153,253,153,253,107,253,63,253,57,253,78,253,71,253,91,253,63,253,20,253,244,252,217,252,211,252,183,252,164,252,133,252,124,252,111,252, + 89,252,70,252,50,252,60,252,34,252,2,252,218,251,169,251,126,251,100,251,67,251,56,251,90,251,122,251,139,251,151,251,153,251,136,251,154,251,164,251, + 202,251,7,252,73,252,157,252,3,253,124,253,233,253,73,254,175,254,34,255,163,255,33,0,186,0,76,1,223,1,131,2,46,3,185,3,41,4,88,4, + 126,4,142,4,162,4,141,4,108,4,78,4,69,4,120,4,146,4,167,4,206,4,243,4,25,5,63,5,108,5,145,5,174,5,244,5,54,6,140,6, + 2,7,130,7,3,8,96,8,142,8,197,8,215,8,9,9,71,9,131,9,106,9,81,9,118,9,131,9,160,9,167,9,149,9,157,9,146,9,125,9, + 62,9,243,8,186,8,144,8,79,8,254,7,159,7,115,7,87,7,115,7,141,7,175,7,201,7,158,7,75,7,158,6,224,5,241,4,88,4,202,3, + 116,3,110,3,135,3,121,3,103,3,57,3,38,3,5,3,232,2,149,2,57,2,222,1,121,1,7,1,165,0,65,0,217,255,201,255,199,255,202,255, + 228,255,14,0,62,0,120,0,127,0,94,0,40,0,227,255,130,255,41,255,231,254,192,254,146,254,103,254,62,254,243,253,188,253,143,253,103,253,88,253, + 89,253,103,253,107,253,114,253,114,253,124,253,120,253,96,253,44,253,5,253,246,252,26,253,19,253,197,252,128,252,77,252,49,252,21,252,209,251,137,251, + 114,251,117,251,96,251,32,251,193,250,78,250,209,249,80,249,196,248,62,248,175,247,80,247,2,247,190,246,125,246,75,246,73,246,136,246,255,246,127,247, + 5,248,177,248,97,249,234,249,90,250,129,250,165,250,208,250,57,251,197,251,93,252,247,252,161,253,34,254,162,254,243,254,66,255,131,255,201,255,253,255, + 40,0,64,0,94,0,173,0,13,1,104,1,211,1,43,2,110,2,131,2,115,2,52,2,230,1,153,1,114,1,103,1,103,1,117,1,130,1,107,1, + 51,1,216,0,134,0,55,0,235,255,144,255,59,255,0,255,211,254,157,254,113,254,81,254,56,254,31,254,9,254,232,253,226,253,228,253,243,253,240,253, + 1,254,242,253,251,253,238,253,8,254,0,254,24,254,23,254,18,254,6,254,44,254,60,254,81,254,139,254,171,254,224,254,246,254,252,254,249,254,246,254, + 9,255,51,255,130,255,185,255,1,0,36,0,66,0,87,0,86,0,65,0,58,0,17,0,14,0,235,255,173,255,80,255,7,255,196,254,189,254,180,254, + 162,254,159,254,151,254,113,254,48,254,4,254,229,253,207,253,202,253,193,253,210,253,225,253,232,253,229,253,231,253,181,253,161,253,154,253,153,253,166,253, + 163,253,156,253,120,253,80,253,6,253,165,252,73,252,234,251,194,251,190,251,215,251,252,251,46,252,102,252,110,252,103,252,71,252,63,252,60,252,78,252, + 124,252,186,252,27,253,116,253,240,253,101,254,198,254,68,255,192,255,39,0,115,0,187,0,22,1,123,1,226,1,115,2,235,2,89,3,171,3,250,3, + 56,4,123,4,181,4,217,4,1,5,0,5,0,5,27,5,40,5,66,5,131,5,216,5,43,6,115,6,147,6,156,6,147,6,138,6,122,6,129,6, + 163,6,191,6,224,6,45,7,128,7,201,7,31,8,93,8,126,8,129,8,131,8,165,8,179,8,180,8,208,8,17,9,59,9,91,9,87,9,32,9, + 236,8,182,8,113,8,18,8,130,7,223,6,152,6,46,6,225,5,145,5,122,5,91,5,81,5,50,5,214,4,103,4,251,3,111,3,12,3,189,2, + 135,2,99,2,56,2,35,2,234,1,193,1,168,1,94,1,58,1,245,0,202,0,163,0,108,0,65,0,26,0,238,255,209,255,142,255,77,255,43,255, + 254,254,241,254,44,255,124,255,208,255,21,0,55,0,62,0,18,0,198,255,137,255,75,255,66,255,73,255,62,255,61,255,33,255,21,255,242,254,206,254, + 135,254,83,254,29,254,226,253,179,253,91,253,21,253,237,252,210,252,176,252,121,252,46,252,211,251,146,251,148,251,151,251,169,251,209,251,36,252,122,252, + 181,252,160,252,103,252,24,252,164,251,36,251,122,250,180,249,28,249,174,248,92,248,43,248,8,248,245,247,12,248,44,248,37,248,31,248,23,248,49,248, + 113,248,216,248,83,249,221,249,121,250,35,251,223,251,113,252,221,252,53,253,107,253,164,253,224,253,27,254,108,254,209,254,76,255,191,255,40,0,107,0, + 143,0,159,0,191,0,211,0,229,0,0,1,24,1,51,1,58,1,56,1,64,1,67,1,75,1,85,1,83,1,76,1,50,1,21,1,235,0,217,0, + 204,0,168,0,130,0,54,0,205,255,109,255,23,255,191,254,112,254,45,254,244,253,186,253,156,253,125,253,81,253,27,253,205,252,165,252,138,252,117,252, + 104,252,106,252,140,252,182,252,217,252,235,252,2,253,46,253,94,253,141,253,178,253,210,253,236,253,15,254,38,254,59,254,87,254,112,254,163,254,214,254, + 21,255,72,255,131,255,163,255,219,255,15,0,65,0,91,0,108,0,105,0,108,0,108,0,102,0,84,0,71,0,69,0,51,0,15,0,199,255,98,255, + 9,255,207,254,173,254,167,254,169,254,177,254,164,254,130,254,131,254,167,254,171,254,167,254,155,254,153,254,145,254,167,254,195,254,202,254,178,254,157,254, + 141,254,130,254,126,254,85,254,44,254,20,254,217,253,136,253,60,253,5,253,228,252,233,252,235,252,241,252,241,252,244,252,250,252,6,253,24,253,33,253, + 67,253,138,253,214,253,66,254,188,254,43,255,160,255,32,0,130,0,237,0,105,1,225,1,86,2,178,2,255,2,49,3,98,3,128,3,167,3,195,3, + 226,3,20,4,92,4,204,4,55,5,148,5,219,5,17,6,58,6,101,6,155,6,195,6,210,6,253,6,46,7,79,7,94,7,115,7,112,7,76,7, + 53,7,50,7,36,7,17,7,27,7,39,7,69,7,75,7,130,7,223,7,13,8,61,8,97,8,151,8,182,8,234,8,251,8,218,8,172,8,99,8, + 57,8,225,7,105,7,0,7,144,6,30,6,183,5,83,5,246,4,145,4,29,4,179,3,88,3,9,3,200,2,142,2,108,2,57,2,251,1,179,1, + 153,1,105,1,81,1,33,1,248,0,198,0,127,0,105,0,55,0,253,255,242,255,206,255,202,255,191,255,173,255,137,255,116,255,95,255,72,255,34,255, + 3,255,238,254,254,254,34,255,84,255,131,255,192,255,226,255,242,255,252,255,241,255,232,255,252,255,6,0,242,255,217,255,206,255,205,255,188,255,156,255, + 115,255,55,255,227,254,103,254,239,253,134,253,24,253,178,252,81,252,230,251,147,251,70,251,13,251,216,250,206,250,229,250,13,251,61,251,117,251,161,251, + 204,251,236,251,222,251,158,251,81,251,251,250,127,250,7,250,155,249,50,249,218,248,160,248,124,248,110,248,108,248,153,248,236,248,57,249,119,249,154,249, + 167,249,169,249,176,249,219,249,31,250,173,250,108,251,70,252,9,253,177,253,41,254,113,254,148,254,169,254,184,254,207,254,242,254,40,255,112,255,176,255, + 216,255,10,0,75,0,144,0,197,0,226,0,234,0,230,0,233,0,204,0,176,0,155,0,150,0,162,0,175,0,180,0,172,0,173,0,159,0,129,0, + 51,0,228,255,159,255,119,255,93,255,75,255,18,255,200,254,116,254,19,254,196,253,114,253,56,253,30,253,239,252,208,252,157,252,107,252,77,252,30,252, + 248,251,211,251,197,251,186,251,186,251,227,251,16,252,102,252,179,252,10,253,88,253,146,253,188,253,220,253,239,253,12,254,56,254,85,254,148,254,223,254, + 69,255,156,255,230,255,24,0,69,0,105,0,114,0,118,0,102,0,98,0,107,0,111,0,123,0,116,0,102,0,69,0,29,0,4,0,3,0,248,255, + 206,255,177,255,112,255,58,255,29,255,245,254,15,255,62,255,95,255,133,255,167,255,141,255,120,255,117,255,90,255,65,255,47,255,33,255,52,255,70,255, + 95,255,95,255,43,255,12,255,247,254,234,254,224,254,151,254,109,254,90,254,49,254,33,254,243,253,178,253,152,253,148,253,145,253,127,253,130,253,153,253, + 226,253,48,254,135,254,235,254,79,255,187,255,51,0,168,0,27,1,147,1,244,1,72,2,142,2,218,2,28,3,56,3,59,3,44,3,41,3,63,3, + 114,3,167,3,235,3,59,4,126,4,223,4,59,5,165,5,15,6,94,6,183,6,248,6,46,7,68,7,96,7,117,7,162,7,194,7,200,7,220,7, + 216,7,200,7,194,7,153,7,96,7,86,7,78,7,89,7,105,7,122,7,155,7,225,7,43,8,96,8,142,8,147,8,143,8,122,8,67,8,247,7, + 136,7,248,6,118,6,32,6,198,5,120,5,55,5,210,4,108,4,4,4,181,3,75,3,218,2,120,2,16,2,166,1,96,1,38,1,9,1,244,0, + 217,0,208,0,170,0,109,0,50,0,242,255,170,255,115,255,84,255,63,255,69,255,52,255,58,255,44,255,23,255,242,254,202,254,191,254,188,254,191,254, + 193,254,210,254,220,254,243,254,29,255,79,255,130,255,149,255,165,255,191,255,212,255,237,255,241,255,248,255,24,0,66,0,73,0,97,0,87,0,47,0, + 8,0,201,255,137,255,58,255,192,254,42,254,139,253,254,252,132,252,32,252,194,251,97,251,17,251,215,250,134,250,103,250,85,250,115,250,152,250,179,250, + 190,250,190,250,194,250,213,250,219,250,216,250,198,250,180,250,150,250,122,250,69,250,40,250,6,250,252,249,36,250,65,250,87,250,98,250,121,250,159,250, + 188,250,215,250,0,251,71,251,153,251,234,251,46,252,117,252,196,252,52,253,179,253,58,254,162,254,234,254,36,255,75,255,93,255,105,255,94,255,97,255, + 112,255,148,255,188,255,239,255,39,0,116,0,181,0,234,0,0,1,247,0,211,0,157,0,105,0,54,0,6,0,223,255,202,255,208,255,202,255,169,255, + 138,255,75,255,0,255,177,254,112,254,72,254,37,254,29,254,37,254,23,254,242,253,171,253,116,253,44,253,219,252,158,252,97,252,67,252,71,252,96,252, + 95,252,85,252,73,252,31,252,25,252,13,252,20,252,59,252,120,252,182,252,19,253,92,253,146,253,200,253,242,253,42,254,90,254,121,254,171,254,221,254, + 34,255,102,255,183,255,244,255,61,0,122,0,162,0,176,0,159,0,154,0,158,0,150,0,140,0,141,0,108,0,69,0,55,0,32,0,25,0,1,0, + 12,0,18,0,22,0,22,0,1,0,231,255,196,255,183,255,219,255,14,0,72,0,89,0,98,0,48,0,250,255,217,255,176,255,162,255,129,255,133,255, + 160,255,185,255,224,255,239,255,238,255,213,255,165,255,145,255,93,255,57,255,26,255,47,255,57,255,22,255,207,254,121,254,48,254,251,253,11,254,33,254, + 72,254,123,254,216,254,44,255,134,255,216,255,57,0,157,0,248,0,85,1,190,1,43,2,139,2,214,2,253,2,20,3,31,3,49,3,67,3,75,3, + 96,3,160,3,222,3,30,4,87,4,121,4,170,4,217,4,29,5,120,5,219,5,58,6,123,6,201,6,252,6,17,7,46,7,42,7,50,7,72,7, + 100,7,132,7,144,7,165,7,168,7,162,7,194,7,168,7,161,7,162,7,161,7,122,7,68,7,42,7,32,7,45,7,65,7,82,7,61,7,18,7, + 219,6,134,6,40,6,178,5,37,5,149,4,19,4,152,3,57,3,2,3,218,2,219,2,203,2,133,2,23,2,136,1,7,1,133,0,48,0,253,255, + 244,255,212,255,221,255,199,255,191,255,178,255,159,255,144,255,127,255,105,255,98,255,88,255,83,255,72,255,62,255,62,255,40,255,14,255,238,254,220,254, + 205,254,216,254,1,255,21,255,50,255,69,255,86,255,113,255,147,255,147,255,137,255,129,255,145,255,163,255,173,255,174,255,188,255,206,255,241,255,15,0, + 21,0,248,255,187,255,112,255,16,255,166,254,60,254,206,253,109,253,19,253,175,252,78,252,7,252,175,251,65,251,216,250,111,250,17,250,237,249,228,249, + 249,249,54,250,104,250,163,250,213,250,233,250,251,250,229,250,253,250,50,251,110,251,165,251,211,251,229,251,244,251,248,251,16,252,14,252,6,252,248,251, + 251,251,18,252,38,252,66,252,124,252,205,252,30,253,105,253,154,253,171,253,178,253,204,253,240,253,37,254,94,254,174,254,254,254,65,255,109,255,133,255, + 123,255,106,255,105,255,104,255,115,255,165,255,235,255,72,0,147,0,187,0,194,0,168,0,109,0,46,0,219,255,145,255,75,255,40,255,7,255,239,254, + 228,254,192,254,152,254,102,254,49,254,253,253,190,253,148,253,134,253,127,253,107,253,102,253,99,253,73,253,27,253,217,252,114,252,57,252,32,252,41,252, + 57,252,84,252,113,252,110,252,106,252,75,252,63,252,56,252,81,252,131,252,193,252,255,252,87,253,161,253,221,253,12,254,52,254,120,254,171,254,247,254, + 72,255,151,255,250,255,64,0,122,0,154,0,181,0,176,0,177,0,172,0,180,0,176,0,179,0,166,0,173,0,170,0,175,0,183,0,145,0,134,0, + 136,0,132,0,152,0,172,0,176,0,180,0,180,0,180,0,154,0,133,0,129,0,141,0,147,0,136,0,141,0,94,0,39,0,248,255,212,255,230,255, + 234,255,11,0,54,0,87,0,101,0,98,0,71,0,25,0,231,255,198,255,209,255,232,255,231,255,227,255,239,255,206,255,160,255,88,255,33,255,254,254, + 4,255,40,255,80,255,158,255,230,255,64,0,136,0,169,0,222,0,13,1,75,1,151,1,229,1,59,2,129,2,217,2,17,3,51,3,55,3,41,3, + 46,3,93,3,125,3,168,3,208,3,217,3,239,3,8,4,23,4,62,4,87,4,160,4,1,5,119,5,205,5,8,6,64,6,104,6,126,6,133,6, + 137,6,162,6,180,6,212,6,252,6,27,7,72,7,86,7,50,7,251,6,162,6,65,6,244,5,188,5,141,5,97,5,41,5,249,4,234,4,206,4, + 192,4,188,4,182,4,146,4,69,4,228,3,110,3,241,2,96,2,252,1,208,1,184,1,212,1,222,1,189,1,94,1,251,0,115,0,238,255,133,255, + 63,255,16,255,3,255,5,255,29,255,95,255,131,255,144,255,136,255,116,255,90,255,84,255,75,255,59,255,61,255,75,255,106,255,134,255,141,255,149,255, + 142,255,156,255,145,255,122,255,105,255,87,255,93,255,84,255,97,255,113,255,162,255,210,255,250,255,248,255,235,255,202,255,176,255,134,255,84,255,50,255, + 47,255,69,255,72,255,41,255,0,255,211,254,170,254,101,254,9,254,178,253,92,253,255,252,150,252,35,252,178,251,79,251,3,251,208,250,176,250,144,250, + 108,250,85,250,89,250,93,250,108,250,123,250,177,250,247,250,46,251,94,251,154,251,191,251,234,251,75,252,146,252,200,252,255,252,42,253,89,253,128,253, + 128,253,131,253,127,253,121,253,112,253,114,253,134,253,163,253,190,253,229,253,249,253,253,253,1,254,4,254,8,254,18,254,38,254,70,254,120,254,181,254, + 231,254,30,255,76,255,109,255,160,255,194,255,196,255,205,255,216,255,212,255,217,255,235,255,250,255,242,255,226,255,183,255,124,255,69,255,7,255,213,254, + 180,254,128,254,84,254,37,254,8,254,226,253,202,253,182,253,189,253,185,253,167,253,167,253,148,253,125,253,94,253,49,253,27,253,13,253,15,253,1,253, + 9,253,13,253,5,253,17,253,5,253,251,252,255,252,251,252,254,252,27,253,64,253,112,253,152,253,196,253,246,253,40,254,81,254,116,254,156,254,228,254, + 44,255,112,255,209,255,36,0,122,0,176,0,201,0,201,0,191,0,199,0,184,0,206,0,206,0,224,0,233,0,2,1,7,1,6,1,7,1,9,1, + 17,1,9,1,25,1,29,1,21,1,22,1,13,1,14,1,0,1,212,0,183,0,114,0,61,0,25,0,255,255,10,0,29,0,65,0,78,0,84,0, + 82,0,82,0,115,0,101,0,93,0,87,0,84,0,90,0,82,0,96,0,82,0,86,0,105,0,125,0,145,0,154,0,159,0,136,0,87,0,39,0, + 226,255,185,255,184,255,216,255,244,255,28,0,64,0,100,0,129,0,169,0,209,0,27,1,108,1,219,1,72,2,178,2,15,3,66,3,96,3,128,3, + 139,3,146,3,175,3,185,3,192,3,213,3,244,3,249,3,250,3,6,4,29,4,45,4,73,4,110,4,166,4,0,5,66,5,130,5,178,5,214,5, + 10,6,50,6,76,6,97,6,101,6,123,6,126,6,129,6,98,6,75,6,19,6,221,5,137,5,65,5,225,4,146,4,77,4,0,4,189,3,125,3, + 75,3,28,3,5,3,215,2,199,2,176,2,164,2,120,2,66,2,241,1,151,1,65,1,234,0,163,0,126,0,66,0,24,0,230,255,178,255,109,255, + 37,255,250,254,196,254,182,254,187,254,206,254,205,254,228,254,241,254,243,254,252,254,18,255,51,255,113,255,167,255,202,255,223,255,239,255,4,0,6,0, + 7,0,255,255,241,255,224,255,212,255,201,255,180,255,166,255,154,255,174,255,198,255,252,255,33,0,65,0,65,0,35,0,246,255,220,255,166,255,123,255, + 76,255,47,255,0,255,246,254,232,254,206,254,184,254,138,254,70,254,2,254,186,253,112,253,46,253,214,252,142,252,92,252,49,252,28,252,2,252,216,251, + 193,251,166,251,136,251,104,251,75,251,42,251,25,251,27,251,42,251,67,251,104,251,166,251,255,251,99,252,196,252,33,253,121,253,202,253,13,254,67,254, + 108,254,135,254,163,254,181,254,181,254,167,254,149,254,119,254,98,254,77,254,56,254,33,254,27,254,30,254,48,254,56,254,65,254,76,254,77,254,91,254, + 113,254,135,254,171,254,217,254,14,255,73,255,98,255,124,255,117,255,113,255,83,255,77,255,65,255,39,255,43,255,54,255,57,255,66,255,66,255,50,255, + 15,255,223,254,164,254,105,254,55,254,6,254,228,253,210,253,185,253,164,253,154,253,141,253,135,253,113,253,94,253,99,253,109,253,123,253,112,253,98,253, + 88,253,81,253,88,253,103,253,134,253,153,253,172,253,182,253,199,253,207,253,224,253,0,254,29,254,59,254,98,254,139,254,187,254,223,254,30,255,75,255, + 140,255,210,255,8,0,69,0,100,0,115,0,139,0,152,0,161,0,176,0,194,0,204,0,224,0,249,0,29,1,51,1,92,1,133,1,157,1,183,1, + 200,1,197,1,180,1,165,1,140,1,125,1,121,1,89,1,64,1,31,1,238,0,181,0,118,0,54,0,3,0,228,255,228,255,245,255,24,0,68,0, + 94,0,91,0,72,0,54,0,51,0,54,0,46,0,54,0,79,0,120,0,159,0,170,0,186,0,175,0,183,0,188,0,215,0,224,0,233,0,219,0, + 206,0,148,0,91,0,36,0,0,0,241,255,249,255,22,0,68,0,127,0,198,0,255,0,85,1,147,1,234,1,34,2,85,2,154,2,219,2,28,3, + 96,3,159,3,183,3,220,3,251,3,38,4,58,4,55,4,41,4,29,4,18,4,9,4,9,4,20,4,74,4,126,4,202,4,27,5,81,5,142,5, + 173,5,183,5,202,5,213,5,230,5,237,5,228,5,201,5,183,5,144,5,122,5,91,5,43,5,228,4,144,4,40,4,200,3,118,3,24,3,200,2, + 104,2,27,2,200,1,125,1,76,1,33,1,21,1,10,1,20,1,28,1,244,0,183,0,97,0,17,0,181,255,102,255,50,255,15,255,247,254,238,254, + 235,254,229,254,211,254,195,254,169,254,134,254,117,254,101,254,88,254,110,254,159,254,195,254,250,254,48,255,94,255,122,255,144,255,165,255,178,255,174,255, + 173,255,173,255,165,255,140,255,134,255,129,255,130,255,140,255,178,255,219,255,232,255,248,255,6,0,14,0,29,0,24,0,0,0,248,255,234,255,198,255, + 149,255,98,255,65,255,21,255,211,254,152,254,88,254,16,254,203,253,171,253,132,253,100,253,85,253,82,253,88,253,98,253,74,253,48,253,243,252,215,252, + 199,252,183,252,187,252,168,252,160,252,138,252,133,252,106,252,71,252,54,252,60,252,73,252,103,252,142,252,197,252,28,253,130,253,221,253,40,254,92,254, + 134,254,173,254,216,254,0,255,30,255,54,255,58,255,70,255,61,255,43,255,16,255,249,254,229,254,213,254,200,254,187,254,167,254,130,254,103,254,87,254, + 70,254,83,254,110,254,128,254,139,254,142,254,133,254,123,254,121,254,116,254,108,254,115,254,138,254,180,254,202,254,227,254,241,254,249,254,235,254,223,254, + 192,254,180,254,152,254,134,254,102,254,69,254,41,254,249,253,211,253,186,253,166,253,125,253,94,253,70,253,63,253,60,253,46,253,63,253,81,253,102,253, + 116,253,125,253,132,253,113,253,112,253,124,253,142,253,190,253,249,253,40,254,94,254,138,254,157,254,170,254,184,254,213,254,246,254,52,255,112,255,165,255, + 224,255,19,0,50,0,57,0,93,0,118,0,130,0,148,0,150,0,141,0,159,0,186,0,213,0,242,0,17,1,60,1,108,1,150,1,189,1,202,1, + 193,1,187,1,169,1,150,1,125,1,99,1,68,1,45,1,18,1,251,0,212,0,180,0,134,0,90,0,68,0,32,0,255,255,223,255,198,255,178,255, + 195,255,191,255,201,255,202,255,220,255,234,255,6,0,58,0,104,0,126,0,151,0,190,0,217,0,0,1,21,1,36,1,35,1,29,1,27,1,22,1, + 20,1,27,1,252,0,241,0,219,0,194,0,155,0,141,0,158,0,204,0,21,1,79,1,100,1,133,1,171,1,191,1,222,1,254,1,30,2,74,2, + 153,2,229,2,41,3,118,3,156,3,195,3,231,3,253,3,20,4,37,4,33,4,37,4,56,4,48,4,63,4,78,4,84,4,98,4,109,4,130,4, + 155,4,199,4,242,4,8,5,11,5,239,4,218,4,204,4,185,4,166,4,141,4,113,4,76,4,31,4,236,3,160,3,67,3,240,2,142,2,66,2, + 219,1,140,1,60,1,238,0,159,0,97,0,57,0,32,0,24,0,12,0,6,0,237,255,199,255,136,255,77,255,18,255,223,254,198,254,178,254,167,254, + 157,254,157,254,138,254,123,254,112,254,69,254,62,254,78,254,92,254,115,254,134,254,156,254,187,254,232,254,21,255,62,255,104,255,112,255,119,255,108,255, + 90,255,72,255,45,255,36,255,50,255,88,255,137,255,163,255,195,255,209,255,248,255,15,0,18,0,26,0,50,0,79,0,80,0,71,0,30,0,230,255, + 172,255,97,255,18,255,196,254,139,254,102,254,67,254,54,254,22,254,243,253,196,253,160,253,132,253,112,253,113,253,117,253,152,253,189,253,210,253,220,253, + 213,253,192,253,181,253,177,253,179,253,196,253,210,253,211,253,221,253,222,253,211,253,213,253,220,253,221,253,221,253,229,253,238,253,5,254,19,254,56,254, + 99,254,141,254,171,254,200,254,245,254,16,255,65,255,119,255,158,255,181,255,206,255,214,255,224,255,228,255,212,255,194,255,151,255,111,255,65,255,16,255, + 216,254,170,254,131,254,127,254,134,254,141,254,141,254,134,254,120,254,105,254,91,254,83,254,77,254,96,254,137,254,167,254,193,254,207,254,214,254,227,254, + 213,254,202,254,177,254,139,254,109,254,73,254,45,254,27,254,249,253,218,253,195,253,177,253,174,253,166,253,160,253,152,253,136,253,130,253,110,253,125,253, + 142,253,167,253,217,253,240,253,239,253,243,253,240,253,253,253,19,254,52,254,102,254,142,254,184,254,245,254,27,255,83,255,112,255,134,255,167,255,187,255, + 226,255,248,255,35,0,78,0,116,0,147,0,168,0,180,0,186,0,199,0,216,0,227,0,231,0,255,0,14,1,31,1,50,1,75,1,114,1,135,1, + 144,1,140,1,122,1,89,1,56,1,24,1,253,0,233,0,202,0,177,0,150,0,132,0,116,0,100,0,101,0,91,0,76,0,48,0,6,0,232,255, + 172,255,129,255,113,255,129,255,165,255,208,255,6,0,40,0,62,0,102,0,141,0,204,0,240,0,21,1,65,1,101,1,125,1,130,1,141,1,144,1, + 136,1,158,1,172,1,190,1,176,1,191,1,204,1,204,1,204,1,186,1,171,1,136,1,137,1,160,1,183,1,197,1,225,1,250,1,28,2,52,2, + 86,2,146,2,185,2,228,2,48,3,96,3,136,3,186,3,243,3,70,4,121,4,170,4,195,4,189,4,167,4,148,4,130,4,90,4,54,4,29,4, + 26,4,30,4,51,4,69,4,73,4,87,4,96,4,96,4,74,4,33,4,240,3,164,3,113,3,62,3,35,3,236,2,192,2,142,2,85,2,18,2, + 172,1,86,1,0,1,170,0,104,0,39,0,238,255,173,255,116,255,81,255,50,255,41,255,16,255,242,254,199,254,160,254,130,254,90,254,73,254,56,254, + 55,254,62,254,70,254,87,254,85,254,98,254,109,254,126,254,133,254,139,254,137,254,121,254,134,254,148,254,155,254,184,254,200,254,211,254,231,254,235,254, + 234,254,223,254,209,254,221,254,246,254,14,255,68,255,113,255,152,255,185,255,214,255,242,255,8,0,11,0,7,0,22,0,26,0,8,0,228,255,187,255, + 148,255,102,255,30,255,243,254,191,254,156,254,124,254,105,254,80,254,67,254,54,254,51,254,62,254,59,254,48,254,44,254,34,254,22,254,15,254,9,254, + 24,254,45,254,65,254,102,254,141,254,177,254,203,254,234,254,7,255,26,255,33,255,12,255,249,254,241,254,228,254,223,254,207,254,180,254,171,254,160,254, + 149,254,124,254,105,254,113,254,131,254,174,254,227,254,23,255,79,255,140,255,188,255,219,255,227,255,235,255,230,255,227,255,220,255,210,255,187,255,160,255, + 130,255,88,255,39,255,241,254,184,254,144,254,116,254,96,254,83,254,80,254,92,254,113,254,124,254,128,254,120,254,115,254,106,254,88,254,78,254,80,254, + 90,254,95,254,112,254,128,254,146,254,138,254,119,254,63,254,4,254,218,253,192,253,181,253,175,253,174,253,177,253,189,253,207,253,206,253,184,253,175,253, + 168,253,163,253,156,253,157,253,152,253,170,253,184,253,208,253,244,253,22,254,52,254,112,254,169,254,217,254,11,255,45,255,99,255,144,255,165,255,184,255, + 205,255,237,255,12,0,43,0,75,0,107,0,129,0,175,0,206,0,231,0,255,0,11,1,18,1,38,1,54,1,54,1,50,1,38,1,31,1,11,1, + 11,1,14,1,20,1,29,1,32,1,11,1,231,0,186,0,143,0,104,0,89,0,71,0,73,0,76,0,76,0,72,0,61,0,39,0,8,0,238,255, + 224,255,228,255,213,255,209,255,188,255,188,255,198,255,230,255,19,0,58,0,111,0,127,0,175,0,220,0,233,0,33,1,71,1,126,1,176,1,225,1, + 3,2,32,2,46,2,56,2,63,2,77,2,88,2,84,2,85,2,79,2,74,2,45,2,21,2,247,1,243,1,243,1,237,1,244,1,6,2,39,2, + 89,2,132,2,150,2,171,2,192,2,230,2,6,3,34,3,98,3,160,3,214,3,6,4,31,4,36,4,42,4,27,4,12,4,0,4,242,3,236,3, + 229,3,221,3,210,3,186,3,161,3,141,3,123,3,113,3,88,3,60,3,27,3,233,2,165,2,103,2,52,2,240,1,180,1,146,1,107,1,79,1, + 57,1,17,1,215,0,155,0,82,0,253,255,177,255,115,255,57,255,12,255,221,254,199,254,169,254,153,254,128,254,98,254,94,254,74,254,66,254,58,254, + 65,254,58,254,56,254,56,254,66,254,94,254,113,254,139,254,166,254,184,254,206,254,207,254,203,254,187,254,173,254,156,254,119,254,110,254,110,254,130,254, + 146,254,171,254,210,254,0,255,27,255,48,255,65,255,84,255,113,255,147,255,159,255,160,255,174,255,173,255,170,255,145,255,126,255,117,255,129,255,156,255, + 177,255,183,255,187,255,160,255,127,255,73,255,11,255,228,254,193,254,191,254,211,254,221,254,223,254,205,254,196,254,182,254,171,254,153,254,141,254,135,254, + 152,254,175,254,203,254,223,254,239,254,16,255,51,255,73,255,94,255,112,255,140,255,169,255,174,255,170,255,160,255,133,255,99,255,66,255,27,255,3,255, + 235,254,234,254,227,254,217,254,218,254,221,254,228,254,241,254,3,255,26,255,45,255,61,255,65,255,75,255,84,255,99,255,122,255,127,255,126,255,124,255, + 113,255,102,255,73,255,57,255,36,255,9,255,225,254,175,254,133,254,102,254,83,254,85,254,98,254,109,254,113,254,121,254,106,254,106,254,95,254,70,254, + 40,254,26,254,11,254,8,254,0,254,8,254,22,254,58,254,62,254,62,254,52,254,27,254,254,253,222,253,195,253,178,253,177,253,181,253,192,253,215,253, + 228,253,247,253,251,253,249,253,250,253,254,253,4,254,11,254,29,254,62,254,106,254,155,254,202,254,0,255,48,255,81,255,124,255,162,255,213,255,250,255, + 33,0,53,0,80,0,101,0,127,0,157,0,186,0,205,0,231,0,4,1,25,1,49,1,67,1,75,1,87,1,87,1,81,1,68,1,47,1,39,1, + 27,1,10,1,244,0,223,0,191,0,154,0,127,0,115,0,105,0,101,0,102,0,104,0,94,0,79,0,50,0,14,0,242,255,226,255,221,255,232,255, + 244,255,24,0,40,0,53,0,51,0,51,0,36,0,18,0,25,0,42,0,65,0,97,0,141,0,175,0,223,0,241,0,21,1,69,1,111,1,150,1, + 168,1,205,1,245,1,25,2,66,2,88,2,107,2,100,2,118,2,117,2,107,2,85,2,70,2,57,2,42,2,34,2,6,2,12,2,31,2,46,2, + 78,2,93,2,113,2,135,2,154,2,181,2,200,2,223,2,240,2,246,2,255,2,10,3,27,3,60,3,74,3,95,3,121,3,150,3,167,3,177,3, + 170,3,164,3,168,3,172,3,165,3,132,3,96,3,34,3,229,2,174,2,120,2,66,2,23,2,240,1,186,1,140,1,87,1,32,1,241,0,197,0, + 147,0,120,0,98,0,73,0,37,0,4,0,214,255,181,255,123,255,75,255,8,255,229,254,189,254,153,254,144,254,135,254,127,254,134,254,133,254,119,254, + 108,254,98,254,102,254,110,254,119,254,116,254,109,254,105,254,96,254,108,254,138,254,151,254,169,254,200,254,214,254,211,254,191,254,157,254,133,254,133,254, + 148,254,175,254,205,254,0,255,61,255,102,255,108,255,115,255,112,255,97,255,80,255,52,255,22,255,8,255,245,254,4,255,15,255,32,255,45,255,47,255, + 66,255,84,255,108,255,136,255,149,255,162,255,162,255,152,255,145,255,133,255,116,255,95,255,75,255,73,255,63,255,68,255,59,255,54,255,66,255,76,255, + 90,255,109,255,129,255,140,255,141,255,133,255,119,255,126,255,137,255,149,255,160,255,173,255,210,255,235,255,246,255,244,255,219,255,185,255,163,255,142,255, + 126,255,105,255,111,255,105,255,102,255,102,255,87,255,73,255,50,255,25,255,253,254,211,254,203,254,207,254,224,254,241,254,252,254,12,255,14,255,33,255, + 43,255,45,255,40,255,23,255,21,255,18,255,12,255,5,255,247,254,224,254,202,254,162,254,123,254,85,254,62,254,44,254,41,254,56,254,67,254,92,254, + 106,254,103,254,87,254,59,254,24,254,12,254,1,254,12,254,40,254,81,254,120,254,139,254,152,254,128,254,91,254,69,254,38,254,6,254,233,253,236,253, + 231,253,246,253,16,254,41,254,69,254,85,254,92,254,131,254,142,254,163,254,174,254,213,254,1,255,23,255,51,255,98,255,162,255,227,255,3,0,43,0, + 79,0,108,0,139,0,173,0,190,0,204,0,229,0,244,0,251,0,6,1,7,1,9,1,25,1,39,1,49,1,68,1,90,1,104,1,97,1,87,1, + 51,1,9,1,224,0,195,0,169,0,147,0,144,0,130,0,127,0,119,0,101,0,80,0,47,0,7,0,231,255,206,255,203,255,210,255,212,255,231,255, + 235,255,235,255,253,255,1,0,17,0,32,0,58,0,84,0,101,0,114,0,123,0,130,0,148,0,177,0,205,0,244,0,28,1,60,1,85,1,97,1, + 110,1,129,1,166,1,202,1,236,1,0,2,24,2,59,2,81,2,96,2,104,2,96,2,89,2,81,2,95,2,99,2,118,2,128,2,139,2,149,2, + 128,2,129,2,140,2,142,2,158,2,175,2,172,2,158,2,139,2,121,2,121,2,110,2,103,2,131,2,160,2,192,2,221,2,248,2,28,3,62,3, + 92,3,116,3,116,3,107,3,75,3,46,3,241,2,199,2,153,2,111,2,59,2,250,1,183,1,115,1,60,1,15,1,224,0,184,0,150,0,98,0, + 69,0,26,0,226,255,180,255,129,255,109,255,95,255,93,255,84,255,66,255,45,255,29,255,7,255,245,254,210,254,198,254,181,254,174,254,171,254,175,254, + 175,254,162,254,149,254,144,254,139,254,138,254,127,254,137,254,126,254,103,254,70,254,40,254,40,254,54,254,67,254,101,254,139,254,184,254,225,254,247,254, + 249,254,253,254,5,255,8,255,5,255,249,254,249,254,9,255,15,255,12,255,242,254,229,254,210,254,189,254,177,254,187,254,195,254,193,254,211,254,228,254, + 236,254,250,254,19,255,65,255,117,255,156,255,185,255,210,255,223,255,214,255,201,255,181,255,160,255,160,255,170,255,188,255,202,255,219,255,219,255,241,255, + 245,255,245,255,231,255,227,255,223,255,220,255,208,255,203,255,196,255,199,255,206,255,226,255,231,255,238,255,224,255,224,255,224,255,228,255,224,255,235,255, + 235,255,230,255,231,255,230,255,226,255,205,255,178,255,142,255,108,255,66,255,19,255,241,254,223,254,199,254,181,254,170,254,167,254,187,254,187,254,192,254, + 203,254,223,254,231,254,250,254,252,254,253,254,3,255,254,254,1,255,246,254,235,254,203,254,169,254,130,254,102,254,69,254,51,254,38,254,41,254,38,254, + 52,254,60,254,69,254,85,254,92,254,108,254,108,254,113,254,109,254,110,254,123,254,146,254,159,254,192,254,214,254,216,254,207,254,187,254,156,254,113,254, + 90,254,56,254,55,254,52,254,65,254,85,254,131,254,180,254,209,254,252,254,16,255,40,255,54,255,83,255,129,255,167,255,224,255,14,0,46,0,86,0, + 111,0,137,0,165,0,181,0,187,0,195,0,208,0,217,0,233,0,240,0,241,0,251,0,253,0,6,1,13,1,17,1,9,1,255,0,238,0,235,0, + 222,0,217,0,204,0,193,0,180,0,180,0,170,0,166,0,169,0,151,0,134,0,90,0,35,0,250,255,205,255,191,255,188,255,190,255,195,255,199,255, + 192,255,187,255,188,255,191,255,206,255,232,255,15,0,50,0,101,0,150,0,191,0,217,0,247,0,10,1,7,1,2,1,252,0,252,0,20,1,43,1, + 75,1,105,1,125,1,137,1,151,1,161,1,191,1,227,1,255,1,3,2,14,2,27,2,48,2,84,2,100,2,113,2,131,2,158,2,175,2,169,2, + 174,2,157,2,162,2,144,2,125,2,78,2,45,2,34,2,5,2,254,1,240,1,254,1,2,2,21,2,46,2,45,2,71,2,96,2,115,2,158,2, + 179,2,192,2,194,2,179,2,176,2,139,2,115,2,86,2,57,2,20,2,230,1,178,1,126,1,82,1,25,1,230,0,173,0,114,0,76,0,33,0, + 253,255,212,255,160,255,120,255,94,255,63,255,45,255,19,255,15,255,9,255,9,255,14,255,21,255,15,255,15,255,0,255,236,254,232,254,228,254,238,254, + 231,254,221,254,203,254,182,254,146,254,124,254,101,254,103,254,108,254,109,254,119,254,110,254,92,254,74,254,74,254,84,254,110,254,157,254,206,254,7,255, + 41,255,55,255,62,255,54,255,41,255,12,255,236,254,206,254,185,254,184,254,184,254,175,254,175,254,185,254,195,254,200,254,213,254,217,254,228,254,216,254, + 242,254,1,255,21,255,29,255,61,255,98,255,144,255,188,255,216,255,232,255,244,255,3,0,4,0,246,255,237,255,246,255,3,0,29,0,50,0,55,0, + 53,0,37,0,25,0,22,0,10,0,8,0,1,0,1,0,10,0,7,0,3,0,0,0,252,255,235,255,230,255,228,255,239,255,7,0,28,0,37,0, + 46,0,39,0,33,0,8,0,252,255,221,255,199,255,180,255,155,255,141,255,120,255,99,255,70,255,43,255,11,255,229,254,207,254,188,254,175,254,167,254, + 169,254,178,254,192,254,213,254,234,254,252,254,247,254,241,254,235,254,227,254,214,254,206,254,189,254,177,254,164,254,144,254,141,254,110,254,90,254,58,254, + 31,254,20,254,33,254,51,254,90,254,121,254,157,254,193,254,216,254,221,254,218,254,210,254,221,254,224,254,223,254,245,254,4,255,22,255,32,255,30,255, + 9,255,250,254,224,254,207,254,198,254,198,254,199,254,211,254,250,254,43,255,75,255,111,255,152,255,203,255,227,255,253,255,21,0,47,0,72,0,97,0, + 123,0,145,0,159,0,173,0,183,0,184,0,190,0,183,0,183,0,199,0,219,0,251,0,20,1,28,1,20,1,252,0,224,0,198,0,166,0,141,0, + 129,0,126,0,133,0,154,0,172,0,195,0,206,0,198,0,176,0,133,0,90,0,43,0,14,0,246,255,232,255,223,255,206,255,194,255,187,255,163,255, + 160,255,159,255,165,255,172,255,196,255,220,255,12,0,62,0,120,0,166,0,206,0,249,0,17,1,32,1,36,1,43,1,57,1,64,1,79,1,78,1, + 76,1,71,1,81,1,86,1,97,1,123,1,135,1,150,1,157,1,176,1,197,1,225,1,245,1,9,2,42,2,75,2,118,2,140,2,143,2,149,2, + 151,2,157,2,161,2,124,2,100,2,67,2,36,2,3,2,232,1,205,1,194,1,197,1,196,1,211,1,215,1,244,1,17,2,42,2,61,2,61,2, + 61,2,46,2,20,2,10,2,240,1,230,1,211,1,197,1,178,1,164,1,143,1,123,1,96,1,74,1,35,1,253,0,216,0,169,0,104,0,29,0, + 202,255,136,255,93,255,69,255,50,255,41,255,41,255,33,255,29,255,12,255,239,254,220,254,202,254,205,254,214,254,236,254,245,254,7,255,19,255,18,255, + 12,255,239,254,206,254,170,254,133,254,94,254,78,254,60,254,40,254,37,254,41,254,63,254,98,254,116,254,139,254,157,254,175,254,185,254,191,254,209,254, + 220,254,229,254,232,254,245,254,246,254,234,254,232,254,214,254,193,254,173,254,173,254,171,254,166,254,156,254,156,254,173,254,180,254,210,254,231,254,247,254, + 15,255,33,255,52,255,76,255,101,255,117,255,141,255,177,255,196,255,227,255,245,255,14,0,36,0,46,0,48,0,57,0,65,0,80,0,86,0,84,0, + 82,0,80,0,80,0,73,0,64,0,60,0,53,0,53,0,57,0,53,0,44,0,50,0,53,0,61,0,44,0,37,0,35,0,39,0,50,0,57,0, + 75,0,89,0,91,0,68,0,36,0,0,0,228,255,201,255,190,255,181,255,173,255,174,255,170,255,154,255,129,255,104,255,76,255,48,255,27,255,253,254, + 238,254,234,254,234,254,229,254,234,254,236,254,234,254,229,254,217,254,203,254,198,254,189,254,199,254,202,254,207,254,207,254,192,254,162,254,139,254,121,254, + 123,254,112,254,108,254,117,254,119,254,121,254,145,254,157,254,173,254,202,254,234,254,4,255,29,255,44,255,48,255,62,255,65,255,51,255,43,255,44,255, + 43,255,48,255,51,255,55,255,57,255,51,255,45,255,51,255,63,255,70,255,102,255,138,255,177,255,220,255,252,255,28,0,46,0,65,0,89,0,98,0, + 111,0,122,0,132,0,147,0,162,0,176,0,190,0,195,0,201,0,199,0,205,0,212,0,209,0,206,0,209,0,204,0,183,0,172,0,145,0,123,0, + 109,0,97,0,108,0,114,0,144,0,159,0,162,0,162,0,137,0,115,0,75,0,51,0,29,0,17,0,255,255,234,255,212,255,180,255,167,255,162,255, + 156,255,160,255,173,255,181,255,206,255,238,255,24,0,65,0,104,0,133,0,166,0,188,0,217,0,224,0,249,0,15,1,47,1,78,1,100,1,108,1, + 119,1,126,1,123,1,125,1,119,1,107,1,107,1,122,1,144,1,155,1,179,1,191,1,226,1,233,1,248,1,0,2,5,2,17,2,38,2,64,2, + 81,2,81,2,81,2,64,2,54,2,23,2,252,1,250,1,247,1,241,1,227,1,214,1,208,1,198,1,190,1,187,1,191,1,202,1,208,1,205,1, + 189,1,176,1,151,1,114,1,89,1,61,1,45,1,42,1,21,1,18,1,24,1,25,1,15,1,11,1,255,0,231,0,186,0,130,0,68,0,252,255, + 195,255,159,255,129,255,102,255,72,255,51,255,37,255,21,255,18,255,11,255,247,254,238,254,232,254,234,254,223,254,223,254,220,254,216,254,221,254,220,254, + 218,254,210,254,187,254,188,254,157,254,126,254,83,254,59,254,29,254,23,254,19,254,23,254,54,254,87,254,126,254,148,254,160,254,175,254,180,254,185,254, + 187,254,187,254,196,254,203,254,207,254,217,254,228,254,242,254,236,254,236,254,238,254,249,254,247,254,245,254,228,254,220,254,217,254,224,254,231,254,0,255, + 23,255,62,255,94,255,120,255,144,255,180,255,199,255,232,255,6,0,21,0,48,0,62,0,73,0,90,0,87,0,91,0,98,0,101,0,107,0,109,0, + 109,0,108,0,101,0,87,0,86,0,87,0,86,0,90,0,83,0,78,0,80,0,84,0,93,0,109,0,111,0,109,0,97,0,87,0,79,0,72,0, + 55,0,57,0,57,0,44,0,43,0,37,0,17,0,248,255,228,255,205,255,198,255,187,255,173,255,166,255,162,255,154,255,145,255,131,255,117,255,106,255, + 87,255,72,255,45,255,9,255,245,254,224,254,213,254,211,254,203,254,189,254,187,254,188,254,196,254,193,254,202,254,209,254,207,254,191,254,187,254,181,254, + 180,254,174,254,162,254,171,254,177,254,181,254,175,254,175,254,170,254,175,254,203,254,235,254,21,255,57,255,91,255,120,255,124,255,124,255,104,255,80,255, + 69,255,58,255,55,255,63,255,73,255,106,255,126,255,151,255,167,255,176,255,174,255,188,255,212,255,246,255,11,0,36,0,47,0,60,0,66,0,71,0, + 71,0,72,0,83,0,86,0,94,0,118,0,133,0,139,0,161,0,175,0,180,0,188,0,180,0,166,0,148,0,139,0,129,0,120,0,132,0,129,0, + 140,0,143,0,151,0,151,0,136,0,127,0,115,0,104,0,87,0,79,0,66,0,64,0,55,0,50,0,30,0,17,0,245,255,216,255,191,255,180,255, + 184,255,188,255,208,255,228,255,250,255,19,0,42,0,64,0,76,0,93,0,116,0,130,0,145,0,173,0,208,0,231,0,10,1,36,1,53,1,81,1, + 107,1,126,1,139,1,151,1,165,1,169,1,164,1,162,1,146,1,141,1,140,1,154,1,165,1,171,1,176,1,179,1,168,1,165,1,168,1,171,1, + 182,1,183,1,196,1,205,1,211,1,200,1,193,1,183,1,178,1,173,1,191,1,209,1,208,1,200,1,205,1,194,1,171,1,148,1,123,1,99,1, + 64,1,35,1,7,1,241,0,222,0,206,0,199,0,184,0,177,0,165,0,159,0,163,0,155,0,157,0,155,0,137,0,105,0,73,0,32,0,3,0, + 230,255,209,255,188,255,173,255,154,255,123,255,79,255,47,255,25,255,11,255,15,255,25,255,37,255,41,255,30,255,14,255,249,254,218,254,187,254,177,254, + 166,254,163,254,162,254,163,254,151,254,139,254,130,254,105,254,91,254,76,254,66,254,67,254,76,254,96,254,117,254,108,254,102,254,92,254,95,254,102,254, + 120,254,141,254,159,254,189,254,206,254,217,254,216,254,231,254,245,254,12,255,18,255,27,255,37,255,48,255,39,255,26,255,3,255,246,254,3,255,5,255, + 29,255,50,255,83,255,122,255,159,255,196,255,230,255,0,0,32,0,58,0,84,0,109,0,134,0,145,0,145,0,143,0,130,0,136,0,136,0,136,0, + 144,0,162,0,159,0,150,0,143,0,134,0,134,0,122,0,118,0,133,0,139,0,130,0,130,0,130,0,137,0,140,0,133,0,129,0,125,0,107,0, + 97,0,66,0,43,0,21,0,250,255,231,255,245,255,241,255,250,255,10,0,12,0,18,0,250,255,230,255,202,255,183,255,170,255,156,255,155,255,148,255, + 147,255,134,255,112,255,91,255,65,255,41,255,1,255,220,254,184,254,159,254,139,254,144,254,169,254,188,254,210,254,224,254,224,254,216,254,200,254,205,254, + 205,254,209,254,211,254,217,254,232,254,232,254,235,254,238,254,249,254,254,254,7,255,14,255,25,255,33,255,57,255,81,255,102,255,123,255,126,255,133,255, + 140,255,129,255,124,255,126,255,137,255,141,255,156,255,181,255,196,255,220,255,244,255,7,0,29,0,39,0,30,0,25,0,15,0,22,0,22,0,19,0, + 29,0,42,0,47,0,65,0,75,0,82,0,87,0,87,0,94,0,96,0,102,0,109,0,115,0,120,0,126,0,118,0,111,0,104,0,109,0,107,0, + 109,0,122,0,122,0,127,0,137,0,133,0,126,0,102,0,68,0,58,0,43,0,33,0,26,0,26,0,22,0,14,0,252,255,238,255,238,255,246,255, + 3,0,8,0,15,0,32,0,42,0,47,0,55,0,61,0,66,0,79,0,86,0,104,0,116,0,139,0,163,0,201,0,222,0,3,1,42,1,71,1, + 87,1,108,1,128,1,158,1,179,1,196,1,205,1,211,1,215,1,204,1,200,1,175,1,153,1,122,1,97,1,83,1,75,1,83,1,90,1,105,1, + 107,1,119,1,122,1,123,1,126,1,118,1,129,1,137,1,157,1,175,1,172,1,182,1,178,1,173,1,173,1,166,1,161,1,150,1,126,1,82,1, + 36,1,238,0,188,0,154,0,122,0,118,0,108,0,107,0,107,0,108,0,105,0,105,0,89,0,66,0,54,0,47,0,33,0,32,0,24,0,25,0, + 24,0,10,0,8,0,249,255,221,255,185,255,141,255,106,255,79,255,65,255,54,255,58,255,55,255,45,255,30,255,21,255,14,255,234,254,209,254,184,254, + 169,254,138,254,123,254,117,254,113,254,116,254,115,254,119,254,119,254,121,254,121,254,108,254,101,254,96,254,92,254,80,254,60,254,54,254,41,254,30,254, + 45,254,70,254,108,254,137,254,167,254,193,254,220,254,246,254,7,255,25,255,41,255,57,255,63,255,59,255,51,255,45,255,40,255,58,255,73,255,97,255, + 117,255,140,255,169,255,188,255,198,255,206,255,224,255,249,255,24,0,55,0,89,0,125,0,151,0,169,0,175,0,162,0,157,0,144,0,150,0,155,0, + 172,0,186,0,184,0,195,0,195,0,190,0,198,0,193,0,202,0,199,0,191,0,177,0,170,0,166,0,158,0,155,0,151,0,137,0,129,0,118,0, + 101,0,82,0,60,0,40,0,26,0,14,0,7,0,253,255,244,255,248,255,3,0,19,0,33,0,37,0,35,0,29,0,11,0,246,255,231,255,213,255, + 199,255,188,255,167,255,149,255,131,255,102,255,79,255,55,255,27,255,0,255,225,254,193,254,199,254,193,254,203,254,217,254,216,254,223,254,225,254,228,254, + 228,254,229,254,243,254,246,254,253,254,15,255,23,255,43,255,62,255,73,255,84,255,99,255,95,255,104,255,98,255,98,255,93,255,97,255,93,255,109,255, + 116,255,138,255,152,255,167,255,181,255,187,255,195,255,188,255,192,255,199,255,210,255,226,255,235,255,249,255,0,0,8,0,17,0,6,0,253,255,253,255, + 255,255,252,255,7,0,11,0,26,0,30,0,50,0,61,0,68,0,72,0,72,0,68,0,64,0,53,0,62,0,60,0,71,0,80,0,98,0,104,0, + 101,0,109,0,108,0,102,0,94,0,76,0,60,0,55,0,35,0,35,0,32,0,22,0,21,0,11,0,252,255,241,255,231,255,237,255,239,255,255,255, + 19,0,36,0,48,0,47,0,50,0,46,0,32,0,24,0,29,0,36,0,46,0,55,0,82,0,108,0,139,0,162,0,191,0,215,0,238,0,10,1, + 36,1,76,1,112,1,150,1,176,1,184,1,187,1,194,1,193,1,191,1,193,1,189,1,178,1,157,1,135,1,103,1,71,1,54,1,43,1,45,1, + 36,1,46,1,47,1,45,1,46,1,49,1,65,1,93,1,94,1,105,1,126,1,140,1,132,1,128,1,136,1,130,1,118,1,92,1,74,1,36,1, + 0,1,220,0,188,0,150,0,112,0,79,0,51,0,42,0,28,0,24,0,8,0,1,0,252,255,244,255,234,255,235,255,224,255,219,255,223,255,238,255, + 245,255,3,0,7,0,3,0,231,255,210,255,191,255,178,255,154,255,137,255,122,255,98,255,83,255,68,255,43,255,22,255,253,254,234,254,211,254,195,254, + 192,254,170,254,167,254,151,254,139,254,128,254,117,254,108,254,109,254,120,254,123,254,135,254,127,254,108,254,102,254,94,254,81,254,87,254,77,254,77,254, + 80,254,92,254,92,254,115,254,127,254,155,254,185,254,216,254,246,254,19,255,37,255,51,255,52,255,54,255,58,255,51,255,61,255,83,255,119,255,163,255, + 203,255,235,255,250,255,7,0,0,0,241,255,238,255,245,255,6,0,17,0,36,0,72,0,102,0,126,0,145,0,151,0,159,0,162,0,169,0,170,0, + 170,0,170,0,183,0,199,0,220,0,216,0,227,0,222,0,229,0,238,0,229,0,216,0,204,0,181,0,172,0,165,0,150,0,148,0,130,0,111,0, + 93,0,76,0,62,0,46,0,36,0,30,0,26,0,22,0,19,0,14,0,26,0,25,0,26,0,21,0,21,0,22,0,33,0,36,0,30,0,15,0, + 253,255,224,255,194,255,163,255,133,255,116,255,95,255,88,255,77,255,65,255,54,255,44,255,33,255,18,255,1,255,243,254,220,254,214,254,213,254,214,254, + 227,254,239,254,4,255,16,255,32,255,50,255,63,255,76,255,98,255,119,255,147,255,159,255,170,255,190,255,187,255,188,255,159,255,160,255,159,255,155,255, + 158,255,165,255,169,255,185,255,206,255,234,255,242,255,0,0,252,255,234,255,223,255,212,255,202,255,201,255,194,255,212,255,230,255,249,255,11,0,24,0, + 18,0,11,0,1,0,248,255,250,255,10,0,17,0,30,0,57,0,66,0,71,0,79,0,66,0,64,0,54,0,40,0,40,0,36,0,48,0,75,0, + 87,0,97,0,97,0,98,0,82,0,62,0,36,0,11,0,253,255,249,255,10,0,29,0,36,0,29,0,19,0,3,0,245,255,235,255,237,255,241,255, + 250,255,6,0,19,0,28,0,25,0,32,0,35,0,22,0,29,0,28,0,28,0,42,0,53,0,73,0,93,0,112,0,145,0,163,0,188,0,220,0, + 252,0,29,1,51,1,68,1,82,1,100,1,114,1,121,1,132,1,139,1,146,1,137,1,130,1,119,1,110,1,101,1,90,1,76,1,50,1,36,1, + 7,1,249,0,249,0,242,0,242,0,255,0,252,0,11,1,13,1,31,1,32,1,49,1,54,1,53,1,56,1,57,1,56,1,38,1,24,1,6,1, + 242,0,226,0,198,0,177,0,150,0,134,0,109,0,73,0,35,0,7,0,241,255,224,255,210,255,202,255,195,255,196,255,192,255,202,255,212,255,213,255, + 231,255,230,255,231,255,220,255,214,255,209,255,203,255,201,255,191,255,180,255,180,255,172,255,154,255,133,255,102,255,73,255,39,255,5,255,235,254,207,254, + 191,254,185,254,188,254,195,254,181,254,171,254,170,254,153,254,135,254,113,254,91,254,87,254,87,254,92,254,106,254,124,254,133,254,127,254,128,254,113,254, + 103,254,94,254,95,254,112,254,127,254,151,254,169,254,191,254,210,254,223,254,246,254,4,255,37,255,44,255,51,255,61,255,81,255,97,255,133,255,173,255, + 210,255,248,255,24,0,40,0,43,0,40,0,25,0,14,0,12,0,14,0,24,0,35,0,62,0,87,0,101,0,111,0,136,0,150,0,151,0,154,0, + 155,0,165,0,177,0,193,0,206,0,230,0,229,0,230,0,235,0,234,0,227,0,222,0,209,0,215,0,206,0,194,0,179,0,166,0,141,0,122,0, + 104,0,96,0,84,0,76,0,64,0,58,0,53,0,50,0,48,0,42,0,29,0,21,0,11,0,1,0,246,255,235,255,232,255,242,255,244,255,248,255, + 253,255,242,255,221,255,212,255,184,255,165,255,149,255,138,255,129,255,126,255,126,255,134,255,129,255,113,255,99,255,75,255,54,255,40,255,22,255,12,255, + 254,254,253,254,14,255,23,255,25,255,47,255,69,255,99,255,131,255,147,255,176,255,202,255,214,255,230,255,232,255,241,255,248,255,249,255,11,0,11,0, + 14,0,12,0,245,255,238,255,237,255,232,255,224,255,221,255,228,255,245,255,248,255,235,255,231,255,227,255,223,255,213,255,209,255,195,255,201,255,208,255, + 216,255,237,255,246,255,0,0,6,0,4,0,4,0,7,0,10,0,22,0,22,0,36,0,51,0,54,0,57,0,61,0,64,0,61,0,55,0,54,0, + 62,0,61,0,60,0,54,0,47,0,33,0,24,0,7,0,6,0,15,0,15,0,15,0,26,0,29,0,24,0,18,0,12,0,3,0,4,0,249,255, + 253,255,3,0,7,0,10,0,8,0,6,0,6,0,10,0,17,0,35,0,44,0,61,0,89,0,93,0,101,0,114,0,126,0,145,0,169,0,183,0, + 206,0,244,0,14,1,29,1,45,1,45,1,38,1,43,1,54,1,58,1,63,1,57,1,63,1,69,1,74,1,86,1,79,1,81,1,74,1,61,1, + 36,1,17,1,244,0,231,0,219,0,220,0,226,0,238,0,235,0,234,0,233,0,229,0,231,0,241,0,241,0,253,0,245,0,240,0,240,0,230,0, + 226,0,206,0,198,0,183,0,169,0,145,0,126,0,107,0,73,0,48,0,26,0,242,255,213,255,201,255,190,255,185,255,184,255,185,255,180,255,190,255, + 206,255,209,255,201,255,187,255,166,255,165,255,156,255,165,255,162,255,165,255,180,255,178,255,167,255,159,255,142,255,112,255,91,255,61,255,29,255,1,255, + 229,254,214,254,188,254,171,254,169,254,153,254,151,254,146,254,135,254,126,254,113,254,112,254,109,254,102,254,96,254,102,254,126,254,135,254,145,254,148,254, + 145,254,144,254,149,254,151,254,138,254,146,254,155,254,167,254,188,254,196,254,207,254,224,254,235,254,7,255,34,255,61,255,91,255,129,255,165,255,201,255, + 226,255,241,255,0,0,8,0,19,0,17,0,17,0,33,0,37,0,47,0,53,0,62,0,69,0,79,0,97,0,91,0,105,0,116,0,118,0,129,0, + 137,0,147,0,162,0,177,0,186,0,195,0,195,0,195,0,205,0,201,0,208,0,205,0,204,0,206,0,198,0,191,0,186,0,187,0,175,0,168,0, + 152,0,133,0,111,0,107,0,104,0,100,0,84,0,76,0,55,0,43,0,28,0,17,0,7,0,10,0,248,255,248,255,241,255,242,255,234,255,219,255, + 212,255,202,255,191,255,185,255,185,255,169,255,170,255,174,255,177,255,181,255,188,255,187,255,174,255,160,255,151,255,134,255,124,255,105,255,104,255,94,255, + 73,255,61,255,50,255,45,255,44,255,79,255,81,255,93,255,113,255,133,255,160,255,187,255,209,255,234,255,244,255,252,255,15,0,40,0,55,0,71,0, + 89,0,80,0,83,0,64,0,44,0,17,0,253,255,239,255,228,255,221,255,216,255,221,255,219,255,234,255,237,255,234,255,230,255,220,255,220,255,212,255, + 198,255,191,255,194,255,206,255,212,255,238,255,250,255,12,0,24,0,25,0,22,0,19,0,14,0,11,0,15,0,25,0,35,0,43,0,51,0,61,0, + 61,0,53,0,40,0,21,0,12,0,3,0,253,255,6,0,14,0,32,0,26,0,25,0,22,0,22,0,6,0,255,255,252,255,0,0,0,0,3,0, + 7,0,7,0,11,0,6,0,1,0,255,255,250,255,249,255,255,255,18,0,39,0,53,0,84,0,107,0,120,0,127,0,137,0,150,0,158,0,173,0, + 186,0,197,0,217,0,229,0,244,0,255,0,4,1,17,1,27,1,27,1,28,1,15,1,15,1,25,1,38,1,42,1,57,1,58,1,63,1,51,1, + 40,1,29,1,17,1,255,0,237,0,226,0,216,0,209,0,205,0,201,0,193,0,187,0,175,0,169,0,166,0,162,0,162,0,162,0,165,0,168,0, + 168,0,173,0,172,0,158,0,150,0,139,0,133,0,129,0,123,0,114,0,100,0,72,0,47,0,3,0,227,255,203,255,192,255,195,255,185,255,187,255, + 180,255,173,255,170,255,162,255,152,255,145,255,138,255,134,255,133,255,129,255,144,255,148,255,156,255,147,255,145,255,141,255,136,255,115,255,81,255,57,255, + 33,255,4,255,231,254,203,254,182,254,171,254,170,254,174,254,173,254,171,254,166,254,163,254,151,254,134,254,127,254,127,254,133,254,139,254,141,254,151,254, + 151,254,156,254,152,254,156,254,167,254,177,254,184,254,196,254,207,254,205,254,216,254,227,254,241,254,4,255,30,255,57,255,97,255,130,255,169,255,191,255, + 206,255,210,255,213,255,210,255,213,255,216,255,220,255,234,255,11,0,37,0,68,0,90,0,102,0,102,0,119,0,120,0,118,0,122,0,109,0,104,0, + 120,0,127,0,143,0,151,0,162,0,175,0,186,0,191,0,188,0,191,0,198,0,206,0,212,0,220,0,226,0,216,0,205,0,195,0,180,0,172,0, + 162,0,157,0,151,0,148,0,133,0,119,0,107,0,89,0,73,0,65,0,47,0,33,0,15,0,4,0,255,255,246,255,241,255,235,255,223,255,208,255, + 210,255,202,255,195,255,184,255,181,255,177,255,173,255,174,255,177,255,173,255,188,255,191,255,192,255,198,255,194,255,184,255,173,255,166,255,158,255,154,255, + 154,255,142,255,134,255,127,255,123,255,126,255,116,255,129,255,129,255,144,255,158,255,177,255,195,255,206,255,228,255,249,255,14,0,36,0,51,0,69,0, + 83,0,79,0,82,0,79,0,66,0,58,0,51,0,42,0,24,0,4,0,244,255,238,255,234,255,227,255,227,255,228,255,231,255,228,255,221,255,216,255, + 216,255,205,255,196,255,191,255,192,255,192,255,203,255,214,255,235,255,245,255,3,0,17,0,14,0,14,0,253,255,253,255,252,255,244,255,250,255,7,0, + 17,0,26,0,24,0,26,0,18,0,14,0,8,0,4,0,0,0,255,255,3,0,0,0,1,0,0,0,255,255,1,0,1,0,0,0,7,0,8,0, + 11,0,14,0,17,0,11,0,3,0,7,0,1,0,1,0,11,0,17,0,37,0,51,0,60,0,68,0,78,0,87,0,116,0,137,0,150,0,163,0, + 173,0,179,0,186,0,197,0,195,0,199,0,209,0,220,0,219,0,229,0,222,0,231,0,231,0,241,0,242,0,247,0,0,1,3,1,253,0,4,1, + 13,1,13,1,13,1,3,1,4,1,0,1,235,0,216,0,202,0,197,0,180,0,172,0,162,0,147,0,133,0,114,0,105,0,89,0,80,0,78,0, + 72,0,84,0,101,0,114,0,118,0,122,0,130,0,125,0,118,0,107,0,93,0,71,0,57,0,40,0,21,0,252,255,220,255,198,255,181,255,173,255, + 159,255,163,255,156,255,148,255,140,255,129,255,120,255,109,255,105,255,104,255,102,255,104,255,112,255,109,255,112,255,111,255,101,255,90,255,68,255,47,255, + 29,255,8,255,254,254,252,254,239,254,235,254,227,254,223,254,216,254,213,254,216,254,210,254,196,254,184,254,167,254,149,254,137,254,130,254,128,254,138,254, + 135,254,135,254,139,254,149,254,160,254,178,254,195,254,209,254,220,254,232,254,241,254,253,254,1,255,14,255,39,255,59,255,94,255,120,255,138,255,166,255, + 183,255,194,255,199,255,202,255,201,255,212,255,216,255,221,255,245,255,7,0,26,0,55,0,97,0,134,0,157,0,172,0,172,0,161,0,145,0,123,0, + 108,0,105,0,111,0,129,0,152,0,172,0,206,0,223,0,230,0,224,0,223,0,209,0,197,0,194,0,188,0,197,0,191,0,197,0,195,0,201,0, + 184,0,188,0,184,0,179,0,166,0,150,0,137,0,129,0,108,0,91,0,78,0,66,0,57,0,46,0,33,0,22,0,7,0,249,255,237,255,216,255, + 202,255,192,255,192,255,192,255,201,255,212,255,210,255,209,255,209,255,206,255,203,255,201,255,205,255,210,255,213,255,223,255,227,255,230,255,221,255,213,255, + 208,255,196,255,199,255,212,255,208,255,217,255,216,255,219,255,220,255,209,255,208,255,212,255,206,255,205,255,219,255,235,255,253,255,11,0,28,0,35,0, + 44,0,46,0,54,0,61,0,60,0,60,0,53,0,40,0,39,0,32,0,26,0,18,0,17,0,11,0,3,0,253,255,239,255,237,255,231,255,231,255, + 220,255,216,255,209,255,208,255,206,255,214,255,216,255,216,255,223,255,221,255,230,255,232,255,234,255,244,255,250,255,3,0,252,255,255,255,246,255,248,255, + 255,255,0,0,4,0,11,0,17,0,19,0,28,0,22,0,21,0,22,0,24,0,14,0,19,0,22,0,24,0,25,0,17,0,28,0,21,0,28,0, + 36,0,33,0,32,0,35,0,32,0,32,0,30,0,29,0,32,0,42,0,53,0,53,0,57,0,69,0,75,0,86,0,93,0,109,0,123,0,139,0, + 158,0,169,0,175,0,193,0,198,0,201,0,204,0,201,0,206,0,201,0,206,0,202,0,217,0,223,0,222,0,217,0,216,0,220,0,217,0,222,0, + 222,0,216,0,220,0,229,0,226,0,231,0,219,0,206,0,201,0,170,0,152,0,133,0,107,0,91,0,80,0,64,0,58,0,53,0,46,0,53,0, + 57,0,61,0,60,0,60,0,71,0,71,0,69,0,62,0,60,0,54,0,50,0,43,0,28,0,18,0,10,0,255,255,239,255,216,255,202,255,183,255, + 176,255,176,255,166,255,162,255,155,255,147,255,144,255,136,255,120,255,99,255,83,255,66,255,63,255,62,255,58,255,55,255,54,255,58,255,57,255,55,255, + 39,255,32,255,26,255,23,255,5,255,7,255,253,254,14,255,8,255,9,255,4,255,253,254,239,254,223,254,205,254,191,254,180,254,166,254,169,254,169,254, + 166,254,167,254,173,254,174,254,170,254,175,254,177,254,184,254,199,254,210,254,223,254,239,254,4,255,15,255,40,255,62,255,77,255,91,255,101,255,115,255, + 126,255,140,255,159,255,176,255,190,255,210,255,223,255,235,255,244,255,0,0,11,0,26,0,46,0,60,0,84,0,102,0,125,0,141,0,162,0,159,0, + 155,0,141,0,133,0,143,0,151,0,166,0,190,0,205,0,219,0,224,0,226,0,216,0,206,0,199,0,191,0,186,0,180,0,172,0,172,0,169,0, + 180,0,179,0,177,0,180,0,175,0,165,0,154,0,144,0,132,0,111,0,96,0,86,0,80,0,79,0,72,0,57,0,40,0,19,0,253,255,244,255, + 224,255,220,255,217,255,203,255,212,255,220,255,217,255,223,255,227,255,232,255,232,255,228,255,230,255,224,255,234,255,230,255,234,255,237,255,244,255,252,255, + 3,0,12,0,14,0,12,0,6,0,255,255,0,0,246,255,245,255,248,255,239,255,235,255,245,255,248,255,0,0,6,0,11,0,6,0,14,0,6,0, + 17,0,28,0,29,0,29,0,36,0,32,0,26,0,26,0,17,0,18,0,21,0,14,0,15,0,12,0,3,0,7,0,253,255,237,255,223,255,210,255, + 213,255,213,255,208,255,210,255,199,255,194,255,194,255,194,255,190,255,194,255,201,255,210,255,217,255,230,255,230,255,231,255,234,255,235,255,235,255,232,255, + 235,255,238,255,245,255,255,255,8,0,18,0,25,0,21,0,19,0,19,0,28,0,33,0,47,0,47,0,55,0,66,0,62,0,60,0,55,0,54,0, + 53,0,50,0,51,0,51,0,54,0,55,0,61,0,54,0,42,0,30,0,18,0,28,0,26,0,43,0,55,0,73,0,83,0,94,0,108,0,116,0, + 137,0,144,0,161,0,175,0,186,0,198,0,197,0,194,0,197,0,193,0,197,0,197,0,205,0,201,0,205,0,204,0,199,0,193,0,186,0,198,0, + 204,0,193,0,193,0,187,0,187,0,180,0,173,0,170,0,168,0,155,0,140,0,112,0,91,0,60,0,39,0,28,0,32,0,33,0,43,0,47,0, + 47,0,44,0,32,0,29,0,12,0,10,0,255,255,0,0,1,0,245,255,246,255,241,255,244,255,244,255,237,255,227,255,227,255,216,255,208,255,199,255, + 185,255,173,255,165,255,160,255,163,255,156,255,154,255,142,255,129,255,106,255,83,255,62,255,41,255,36,255,27,255,30,255,32,255,41,255,41,255,50,255, + 50,255,62,255,52,255,44,255,51,255,40,255,41,255,36,255,34,255,27,255,18,255,12,255,4,255,253,254,250,254,243,254,234,254,223,254,210,254,206,254, + 210,254,216,254,217,254,207,254,203,254,193,254,198,254,195,254,200,254,223,254,231,254,250,254,15,255,33,255,40,255,52,255,65,255,73,255,73,255,81,255, + 98,255,116,255,144,255,170,255,184,255,209,255,228,255,245,255,252,255,14,0,19,0,29,0,30,0,42,0,57,0,73,0,101,0,122,0,147,0,175,0, + 193,0,208,0,209,0,205,0,194,0,191,0,194,0,201,0,205,0,217,0,220,0,227,0,224,0,213,0,202,0,191,0,188,0,190,0,191,0,195,0, + 194,0,186,0,180,0,181,0,177,0,176,0,162,0,166,0,151,0,143,0,127,0,122,0,109,0,97,0,82,0,66,0,58,0,47,0,25,0,15,0, + 6,0,0,0,252,255,242,255,228,255,216,255,212,255,219,255,228,255,230,255,238,255,244,255,0,0,248,255,241,255,242,255,238,255,248,255,250,255,3,0, + 17,0,25,0,21,0,30,0,29,0,35,0,32,0,35,0,29,0,21,0,14,0,10,0,11,0,15,0,25,0,21,0,24,0,26,0,22,0,24,0, + 18,0,14,0,8,0,8,0,255,255,3,0,7,0,15,0,21,0,18,0,25,0,35,0,36,0,35,0,28,0,19,0,10,0,249,255,238,255,221,255, + 219,255,214,255,209,255,195,255,190,255,178,255,169,255,169,255,167,255,167,255,184,255,201,255,216,255,227,255,239,255,235,255,230,255,220,255,217,255,217,255, + 223,255,242,255,250,255,0,0,14,0,22,0,26,0,25,0,26,0,25,0,24,0,28,0,37,0,50,0,65,0,69,0,90,0,93,0,98,0,98,0, + 89,0,80,0,78,0,75,0,69,0,72,0,65,0,61,0,48,0,37,0,30,0,25,0,28,0,26,0,36,0,47,0,57,0,71,0,79,0,91,0, + 107,0,122,0,140,0,143,0,145,0,152,0,155,0,158,0,172,0,181,0,172,0,176,0,170,0,175,0,169,0,180,0,176,0,175,0,179,0,168,0, + 173,0,175,0,168,0,158,0,150,0,145,0,133,0,119,0,102,0,93,0,76,0,72,0,57,0,54,0,53,0,39,0,36,0,32,0,22,0,15,0, + 11,0,10,0,1,0,241,255,227,255,209,255,191,255,183,255,174,255,169,255,176,255,183,255,185,255,183,255,185,255,195,255,198,255,190,255,190,255,187,255, + 178,255,177,255,173,255,176,255,177,255,158,255,144,255,119,255,94,255,75,255,59,255,55,255,51,255,48,255,50,255,32,255,26,255,18,255,26,255,33,255, + 47,255,55,255,59,255,59,255,73,255,69,255,59,255,50,255,45,255,41,255,37,255,33,255,27,255,21,255,23,255,23,255,19,255,22,255,12,255,9,255, + 8,255,0,255,247,254,236,254,234,254,223,254,220,254,214,254,218,254,227,254,229,254,247,254,0,255,12,255,23,255,25,255,26,255,40,255,48,255,61,255, + 70,255,91,255,116,255,142,255,167,255,191,255,208,255,224,255,238,255,252,255,14,0,22,0,36,0,46,0,60,0,79,0,96,0,104,0,123,0,141,0, + 173,0,186,0,201,0,213,0,230,0,237,0,231,0,229,0,215,0,202,0,194,0,187,0,193,0,202,0,215,0,215,0,212,0,201,0,201,0,204,0, + 201,0,191,0,188,0,186,0,190,0,183,0,175,0,169,0,166,0,159,0,148,0,139,0,140,0,120,0,105,0,86,0,76,0,62,0,57,0,46,0, + 44,0,35,0,28,0,12,0,6,0,252,255,252,255,241,255,239,255,244,255,244,255,248,255,0,0,10,0,12,0,25,0,37,0,42,0,46,0,48,0, + 37,0,30,0,30,0,35,0,35,0,40,0,44,0,47,0,58,0,72,0,71,0,72,0,65,0,58,0,51,0,42,0,39,0,37,0,29,0,30,0, + 35,0,28,0,15,0,17,0,12,0,12,0,14,0,17,0,24,0,29,0,33,0,37,0,36,0,28,0,24,0,24,0,12,0,4,0,253,255,239,255, + 226,255,219,255,202,255,198,255,198,255,199,255,194,255,190,255,187,255,190,255,190,255,191,255,187,255,198,255,195,255,201,255,209,255,217,255,227,255,237,255, + 239,255,244,255,250,255,255,255,0,0,10,0,17,0,29,0,39,0,47,0,43,0,54,0,57,0,62,0,78,0,82,0,94,0,100,0,104,0,98,0, + 102,0,97,0,96,0,84,0,82,0,76,0,68,0,64,0,60,0,54,0,57,0,50,0,51,0,46,0,42,0,40,0,37,0,47,0,51,0,65,0, + 79,0,83,0,101,0,111,0,125,0,139,0,148,0,148,0,152,0,155,0,157,0,161,0,162,0,165,0,169,0,173,0,176,0,175,0,172,0,165,0, + 161,0,152,0,148,0,139,0,134,0,126,0,114,0,94,0,76,0,61,0,54,0,39,0,39,0,46,0,39,0,40,0,33,0,29,0,22,0,4,0, + 241,255,216,255,203,255,188,255,173,255,172,255,159,255,165,255,159,255,145,255,145,255,145,255,142,255,134,255,136,255,144,255,151,255,165,255,163,255,162,255, + 158,255,154,255,156,255,144,255,136,255,123,255,119,255,108,255,95,255,86,255,79,255,81,255,73,255,63,255,61,255,57,255,54,255,48,255,51,255,54,255, + 44,255,43,255,47,255,44,255,48,255,57,255,62,255,68,255,63,255,59,255,54,255,54,255,55,255,57,255,58,255,62,255,54,255,61,255,65,255,58,255, + 50,255,36,255,23,255,9,255,8,255,3,255,1,255,7,255,7,255,3,255,0,255,243,254,242,254,239,254,1,255,14,255,26,255,43,255,57,255,70,255, + 84,255,81,255,101,255,112,255,133,255,147,255,165,255,177,255,194,255,201,255,224,255,234,255,6,0,30,0,51,0,72,0,93,0,109,0,123,0,125,0, + 141,0,151,0,175,0,186,0,205,0,219,0,234,0,235,0,230,0,220,0,213,0,209,0,202,0,204,0,201,0,209,0,216,0,216,0,213,0,204,0, + 206,0,194,0,183,0,184,0,179,0,186,0,181,0,173,0,165,0,155,0,147,0,130,0,125,0,129,0,122,0,120,0,119,0,105,0,107,0,89,0, + 78,0,66,0,51,0,46,0,40,0,35,0,33,0,25,0,17,0,15,0,14,0,11,0,4,0,15,0,25,0,22,0,21,0,28,0,26,0,35,0, + 33,0,39,0,36,0,35,0,29,0,32,0,37,0,40,0,53,0,65,0,78,0,79,0,79,0,83,0,86,0,72,0,68,0,62,0,46,0,36,0, + 40,0,37,0,42,0,37,0,42,0,62,0,55,0,57,0,60,0,55,0,55,0,46,0,43,0,33,0,28,0,19,0,17,0,253,255,245,255,244,255, + 234,255,220,255,208,255,208,255,201,255,201,255,205,255,205,255,216,255,216,255,212,255,203,255,191,255,187,255,178,255,177,255,183,255,196,255,208,255,227,255, + 237,255,252,255,255,255,253,255,252,255,4,0,11,0,15,0,26,0,28,0,47,0,61,0,69,0,80,0,83,0,80,0,75,0,79,0,78,0,68,0, + 75,0,75,0,80,0,86,0,83,0,89,0,86,0,84,0,84,0,78,0,71,0,69,0,61,0,58,0,54,0,46,0,50,0,51,0,48,0,50,0, + 58,0,61,0,72,0,75,0,87,0,94,0,100,0,114,0,119,0,122,0,126,0,136,0,137,0,152,0,151,0,158,0,154,0,155,0,158,0,157,0, + 155,0,151,0,147,0,139,0,122,0,97,0,91,0,68,0,65,0,53,0,43,0,32,0,30,0,26,0,30,0,30,0,22,0,30,0,17,0,253,255, + 237,255,214,255,194,255,172,255,165,255,155,255,149,255,145,255,144,255,148,255,138,255,133,255,124,255,120,255,123,255,126,255,117,255,122,255,115,255,117,255, + 117,255,117,255,116,255,115,255,115,255,117,255,120,255,126,255,133,255,127,255,123,255,115,255,104,255,95,255,81,255,91,255,90,255,80,255,81,255,75,255, + 70,255,63,255,61,255,55,255,47,255,43,255,52,255,54,255,65,255,66,255,81,255,81,255,80,255,75,255,81,255,83,255,75,255,79,255,73,255,68,255, + 55,255,47,255,39,255,26,255,25,255,15,255,19,255,12,255,22,255,23,255,21,255,9,255,3,255,252,254,252,254,250,254,1,255,14,255,23,255,36,255, + 43,255,55,255,69,255,88,255,104,255,116,255,126,255,130,255,155,255,177,255,198,255,221,255,238,255,7,0,29,0,50,0,69,0,97,0,114,0,126,0, + 139,0,140,0,145,0,161,0,170,0,179,0,195,0,201,0,212,0,219,0,222,0,217,0,213,0,206,0,211,0,211,0,206,0,205,0,215,0,223,0, + 220,0,223,0,205,0,198,0,187,0,184,0,175,0,169,0,162,0,159,0,154,0,143,0,134,0,129,0,127,0,126,0,122,0,130,0,122,0,119,0, + 104,0,94,0,80,0,75,0,61,0,51,0,51,0,42,0,37,0,37,0,35,0,30,0,25,0,30,0,24,0,33,0,30,0,25,0,25,0,28,0, + 29,0,36,0,37,0,44,0,58,0,71,0,73,0,75,0,78,0,75,0,71,0,76,0,71,0,76,0,82,0,72,0,76,0,64,0,51,0,48,0, + 43,0,42,0,39,0,50,0,58,0,64,0,73,0,79,0,80,0,71,0,55,0,50,0,46,0,28,0,24,0,19,0,12,0,7,0,253,255,245,255, + 231,255,223,255,223,255,216,255,219,255,216,255,223,255,224,255,221,255,213,255,202,255,195,255,187,255,178,255,183,255,184,255,181,255,185,255,191,255,202,255, + 212,255,226,255,232,255,252,255,1,0,8,0,11,0,18,0,25,0,29,0,46,0,53,0,60,0,58,0,54,0,54,0,54,0,57,0,51,0,60,0, + 60,0,60,0,68,0,61,0,62,0,73,0,76,0,76,0,82,0,83,0,75,0,71,0,60,0,55,0,46,0,47,0,47,0,51,0,54,0,60,0, + 47,0,51,0,53,0,55,0,58,0,55,0,68,0,79,0,89,0,97,0,104,0,120,0,132,0,134,0,141,0,139,0,140,0,139,0,148,0,148,0, + 140,0,136,0,125,0,116,0,96,0,91,0,78,0,66,0,51,0,46,0,40,0,32,0,26,0,14,0,10,0,6,0,0,0,245,255,232,255,219,255, + 205,255,184,255,170,255,165,255,156,255,158,255,154,255,141,255,142,255,138,255,129,255,129,255,130,255,124,255,117,255,101,255,91,255,97,255,91,255,95,255, + 98,255,99,255,108,255,115,255,116,255,124,255,129,255,129,255,129,255,138,255,140,255,140,255,136,255,140,255,141,255,142,255,126,255,119,255,117,255,109,255, + 109,255,94,255,83,255,81,255,75,255,72,255,65,255,69,255,66,255,68,255,70,255,76,255,76,255,87,255,97,255,94,255,91,255,80,255,77,255,77,255, + 70,255,73,255,66,255,63,255,63,255,50,255,40,255,30,255,25,255,19,255,26,255,32,255,18,255,21,255,14,255,8,255,9,255,14,255,21,255,32,255, + 47,255,57,255,73,255,90,255,106,255,116,255,123,255,136,255,147,255,163,255,183,255,202,255,234,255,6,0,18,0,33,0,54,0,65,0,87,0,97,0, + 116,0,134,0,144,0,154,0,152,0,161,0,169,0,175,0,191,0,212,0,217,0,227,0,219,0,222,0,212,0,204,0,213,0,209,0,213,0,212,0, + 212,0,211,0,208,0,204,0,193,0,181,0,173,0,166,0,154,0,148,0,141,0,140,0,133,0,125,0,129,0,123,0,132,0,118,0,127,0,120,0, + 120,0,118,0,108,0,105,0,94,0,84,0,71,0,61,0,60,0,50,0,61,0,47,0,46,0,40,0,40,0,32,0,40,0,39,0,30,0,32,0, + 28,0,29,0,35,0,48,0,61,0,61,0,66,0,79,0,83,0,83,0,78,0,75,0,60,0,62,0,58,0,61,0,64,0,66,0,68,0,68,0, + 66,0,68,0,72,0,73,0,73,0,76,0,79,0,83,0,83,0,82,0,72,0,66,0,58,0,57,0,48,0,35,0,32,0,15,0,18,0,10,0, + 248,255,253,255,245,255,239,255,235,255,230,255,231,255,228,255,226,255,216,255,206,255,198,255,187,255,181,255,184,255,187,255,190,255,194,255,198,255,206,255, + 216,255,227,255,241,255,245,255,253,255,8,0,19,0,29,0,33,0,33,0,29,0,26,0,17,0,17,0,22,0,15,0,22,0,36,0,33,0,35,0, + 44,0,50,0,61,0,64,0,75,0,78,0,83,0,79,0,79,0,76,0,80,0,79,0,79,0,82,0,73,0,68,0,65,0,55,0,57,0,44,0, + 48,0,43,0,48,0,51,0,57,0,53,0,51,0,48,0,55,0,72,0,84,0,96,0,107,0,115,0,119,0,119,0,130,0,130,0,133,0,136,0, + 136,0,127,0,123,0,104,0,93,0,83,0,73,0,62,0,48,0,47,0,33,0,26,0,14,0,255,255,250,255,246,255,226,255,206,255,180,255,180,255, + 170,255,170,255,170,255,162,255,159,255,155,255,147,255,148,255,136,255,124,255,116,255,111,255,104,255,97,255,91,255,97,255,95,255,97,255,97,255,91,255, + 87,255,88,255,97,255,98,255,101,255,112,255,116,255,116,255,120,255,126,255,129,255,148,255,160,255,173,255,176,255,178,255,172,255,170,255,162,255,152,255, + 136,255,120,255,111,255,116,255,111,255,106,255,111,255,108,255,97,255,94,255,88,255,84,255,87,255,86,255,87,255,93,255,97,255,98,255,87,255,88,255, + 86,255,87,255,88,255,91,255,91,255,80,255,80,255,70,255,55,255,36,255,37,255,48,255,40,255,44,255,41,255,40,255,41,255,44,255,36,255,40,255, + 52,255,63,255,73,255,90,255,98,255,106,255,123,255,129,255,149,255,160,255,178,255,198,255,221,255,237,255,6,0,21,0,25,0,43,0,54,0,75,0, + 98,0,107,0,115,0,125,0,126,0,143,0,155,0,163,0,175,0,191,0,209,0,213,0,206,0,211,0,213,0,205,0,208,0,209,0,215,0,212,0, + 215,0,215,0,213,0,198,0,188,0,177,0,163,0,150,0,150,0,139,0,144,0,145,0,144,0,141,0,145,0,139,0,139,0,136,0,133,0,123,0, + 126,0,111,0,104,0,105,0,98,0,91,0,84,0,75,0,62,0,55,0,48,0,51,0,48,0,42,0,44,0,40,0,37,0,42,0,35,0,28,0, + 29,0,32,0,39,0,39,0,51,0,72,0,69,0,79,0,86,0,82,0,84,0,87,0,83,0,72,0,66,0,55,0,58,0,61,0,62,0,62,0, + 84,0,83,0,80,0,82,0,72,0,65,0,65,0,69,0,71,0,69,0,71,0,68,0,64,0,66,0,66,0,66,0,65,0,57,0,44,0,28,0, + 17,0,8,0,8,0,7,0,252,255,248,255,239,255,232,255,221,255,213,255,205,255,198,255,202,255,202,255,201,255,202,255,208,255,209,255,203,255,206,255, + 210,255,223,255,234,255,237,255,242,255,245,255,252,255,6,0,253,255,1,0,12,0,1,0,8,0,4,0,4,0,3,0,11,0,17,0,21,0,26,0, + 30,0,35,0,48,0,61,0,64,0,58,0,58,0,54,0,54,0,57,0,58,0,54,0,60,0,65,0,62,0,65,0,64,0,65,0,55,0,55,0, + 47,0,43,0,37,0,35,0,26,0,28,0,29,0,26,0,26,0,37,0,46,0,53,0,69,0,82,0,86,0,93,0,100,0,111,0,118,0,109,0, + 105,0,101,0,96,0,84,0,72,0,72,0,62,0,51,0,36,0,26,0,21,0,11,0,6,0,248,255,232,255,220,255,203,255,183,255,177,255,160,255, + 154,255,148,255,149,255,151,255,154,255,141,255,133,255,123,255,115,255,120,255,113,255,112,255,112,255,104,255,101,255,95,255,94,255,88,255,90,255,90,255, + 86,255,90,255,88,255,95,255,102,255,104,255,108,255,115,255,111,255,122,255,131,255,149,255,170,255,181,255,187,255,192,255,196,255,195,255,202,255,194,255, + 192,255,180,255,169,255,162,255,155,255,147,255,142,255,134,255,133,255,123,255,120,255,109,255,98,255,91,255,93,255,93,255,80,255,80,255,84,255,93,255, + 98,255,102,255,111,255,116,255,112,255,109,255,97,255,87,255,70,255,58,255,47,255,37,255,34,255,39,255,50,255,63,255,66,255,70,255,76,255,79,255, + 87,255,86,255,95,255,102,255,111,255,127,255,144,255,156,255,167,255,176,255,195,255,216,255,227,255,244,255,250,255,4,0,14,0,22,0,35,0,42,0, + 48,0,65,0,75,0,79,0,94,0,111,0,119,0,144,0,144,0,163,0,175,0,180,0,186,0,194,0,195,0,197,0,198,0,202,0,208,0,206,0, + 209,0,206,0,204,0,199,0,190,0,180,0,161,0,150,0,139,0,139,0,143,0,145,0,150,0,147,0,150,0,148,0,147,0,136,0,114,0,112,0, + 119,0,112,0,107,0,105,0,100,0,91,0,84,0,72,0,69,0,60,0,68,0,62,0,58,0,58,0,54,0,43,0,43,0,43,0,43,0,36,0, + 39,0,36,0,42,0,48,0,55,0,53,0,65,0,62,0,72,0,78,0,76,0,71,0,73,0,80,0,72,0,66,0,64,0,65,0,64,0,65,0, + 65,0,61,0,62,0,73,0,69,0,71,0,80,0,86,0,84,0,91,0,93,0,97,0,96,0,93,0,83,0,86,0,76,0,66,0,64,0,57,0, + 42,0,36,0,25,0,25,0,15,0,12,0,4,0,245,255,242,255,235,255,230,255,228,255,226,255,226,255,230,255,227,255,234,255,227,255,220,255,231,255, + 235,255,230,255,231,255,238,255,235,255,238,255,241,255,238,255,242,255,248,255,241,255,242,255,237,255,237,255,244,255,250,255,253,255,1,0,14,0,22,0, + 25,0,30,0,37,0,47,0,55,0,39,0,43,0,47,0,47,0,54,0,64,0,58,0,61,0,65,0,64,0,53,0,57,0,54,0,57,0,55,0, + 42,0,37,0,43,0,32,0,22,0,12,0,10,0,17,0,26,0,40,0,42,0,48,0,46,0,61,0,61,0,65,0,76,0,75,0,82,0,75,0, + 73,0,79,0,71,0,61,0,58,0,47,0,44,0,40,0,32,0,25,0,14,0,6,0,245,255,226,255,214,255,203,255,190,255,174,255,165,255,148,255, + 142,255,137,255,137,255,126,255,123,255,120,255,113,255,104,255,102,255,95,255,98,255,95,255,97,255,99,255,109,255,102,255,104,255,95,255,97,255,94,255, + 95,255,94,255,97,255,98,255,104,255,106,255,115,255,119,255,119,255,133,255,144,255,149,255,165,255,174,255,191,255,198,255,209,255,208,255,205,255,205,255, + 203,255,195,255,194,255,194,255,190,255,178,255,167,255,156,255,154,255,136,255,130,255,123,255,120,255,117,255,105,255,98,255,91,255,88,255,87,255,90,255, + 99,255,105,255,113,255,122,255,126,255,120,255,122,255,115,255,105,255,95,255,86,255,77,255,72,255,72,255,61,255,68,255,68,255,80,255,87,255,104,255, + 98,255,109,255,109,255,115,255,127,255,134,255,149,255,169,255,183,255,199,255,214,255,223,255,227,255,239,255,239,255,253,255,7,0,11,0,17,0,29,0, + 35,0,40,0,43,0,55,0,68,0,72,0,82,0,93,0,115,0,127,0,136,0,150,0,161,0,172,0,181,0,184,0,193,0,187,0,184,0,184,0, + 176,0,181,0,183,0,183,0,181,0,173,0,170,0,159,0,147,0,130,0,130,0,133,0,136,0,134,0,141,0,134,0,130,0,129,0,120,0,107,0, + 107,0,100,0,100,0,96,0,94,0,80,0,80,0,76,0,69,0,65,0,62,0,65,0,71,0,72,0,68,0,69,0,66,0,66,0,53,0,47,0, + 44,0,55,0,54,0,53,0,51,0,54,0,51,0,53,0,64,0,71,0,64,0,57,0,64,0,69,0,76,0,80,0,73,0,69,0,64,0,62,0, + 53,0,53,0,50,0,58,0,66,0,66,0,80,0,89,0,100,0,100,0,109,0,116,0,118,0,114,0,107,0,108,0,96,0,101,0,78,0,78,0, + 66,0,71,0,69,0,55,0,46,0,39,0,22,0,10,0,253,255,245,255,237,255,235,255,237,255,241,255,244,255,242,255,249,255,242,255,238,255,237,255, + 234,255,237,255,238,255,224,255,228,255,230,255,232,255,231,255,231,255,230,255,230,255,242,255,237,255,241,255,239,255,245,255,255,255,1,0,3,0,14,0, + 22,0,25,0,29,0,28,0,35,0,33,0,40,0,37,0,36,0,29,0,29,0,26,0,37,0,43,0,46,0,53,0,61,0,60,0,64,0,55,0, + 48,0,44,0,39,0,29,0,24,0,29,0,29,0,33,0,26,0,36,0,36,0,37,0,48,0,50,0,50,0,50,0,51,0,54,0,51,0,53,0, + 57,0,51,0,48,0,43,0,42,0,35,0,26,0,26,0,24,0,18,0,8,0,0,0,238,255,227,255,217,255,199,255,192,255,184,255,173,255,169,255, + 155,255,141,255,130,255,120,255,119,255,115,255,117,255,115,255,116,255,112,255,113,255,106,255,109,255,109,255,109,255,119,255,123,255,129,255,131,255,130,255, + 126,255,124,255,108,255,111,255,119,255,120,255,123,255,133,255,144,255,147,255,149,255,156,255,163,255,178,255,180,255,185,255,191,255,201,255,209,255,217,255, + 217,255,221,255,221,255,223,255,219,255,212,255,202,255,188,255,183,255,169,255,154,255,140,255,129,255,130,255,123,255,123,255,122,255,117,255,115,255,111,255, + 117,255,117,255,116,255,111,255,120,255,119,255,126,255,117,255,113,255,113,255,116,255,106,255,106,255,94,255,93,255,98,255,94,255,102,255,102,255,120,255, + 117,255,117,255,131,255,137,255,142,255,151,255,159,255,173,255,185,255,194,255,199,255,217,255,226,255,227,255,242,255,252,255,3,0,12,0,8,0,18,0, + 22,0,32,0,37,0,43,0,53,0,55,0,68,0,72,0,82,0,93,0,100,0,109,0,120,0,141,0,144,0,169,0,168,0,168,0,165,0,168,0, + 159,0,154,0,148,0,158,0,162,0,170,0,161,0,165,0,158,0,148,0,141,0,134,0,132,0,125,0,127,0,115,0,116,0,120,0,108,0,94,0, + 86,0,89,0,80,0,76,0,71,0,64,0,64,0,60,0,62,0,65,0,58,0,58,0,65,0,65,0,66,0,75,0,69,0,72,0,79,0,73,0, + 66,0,61,0,60,0,54,0,62,0,61,0,65,0,54,0,55,0,50,0,53,0,50,0,44,0,42,0,43,0,48,0,51,0,50,0,54,0,53,0, + 57,0,58,0,50,0,46,0,51,0,51,0,55,0,68,0,80,0,89,0,100,0,107,0,118,0,127,0,120,0,108,0,105,0,97,0,80,0,71,0, + 64,0,66,0,76,0,69,0,75,0,69,0,60,0,46,0,30,0,19,0,1,0,248,255,244,255,242,255,241,255,249,255,246,255,246,255,248,255,238,255, + 235,255,227,255,220,255,214,255,213,255,224,255,224,255,228,255,235,255,228,255,234,255,228,255,234,255,234,255,232,255,246,255,250,255,249,255,255,255,0,0, + 0,0,4,0,3,0,0,0,0,0,7,0,10,0,8,0,17,0,19,0,24,0,22,0,29,0,28,0,32,0,32,0,43,0,48,0,48,0,43,0, + 40,0,36,0,33,0,29,0,37,0,36,0,33,0,36,0,32,0,35,0,32,0,33,0,29,0,26,0,28,0,25,0,36,0,46,0,42,0,33,0, + 28,0,30,0,29,0,25,0,25,0,14,0,18,0,17,0,6,0,1,0,253,255,245,255,239,255,230,255,224,255,216,255,203,255,201,255,190,255,181,255, + 162,255,147,255,129,255,126,255,126,255,124,255,119,255,120,255,127,255,119,255,119,255,126,255,124,255,124,255,129,255,131,255,137,255,138,255,138,255,142,255, + 145,255,138,255,138,255,136,255,140,255,145,255,144,255,147,255,149,255,152,255,159,255,165,255,166,255,174,255,180,255,174,255,184,255,190,255,196,255,208,255, + 216,255,221,255,223,255,231,255,227,255,227,255,216,255,212,255,203,255,191,255,184,255,172,255,169,255,159,255,145,255,138,255,137,255,133,255,130,255,127,255, + 122,255,123,255,123,255,123,255,116,255,123,255,113,255,119,255,120,255,124,255,117,255,131,255,129,255,123,255,127,255,130,255,129,255,137,255,136,255,144,255, + 141,255,145,255,142,255,145,255,151,255,163,255,178,255,191,255,198,255,214,255,216,255,220,255,223,255,230,255,232,255,244,255,1,0,11,0,18,0,28,0, + 22,0,29,0,29,0,35,0,39,0,44,0,54,0,62,0,69,0,83,0,86,0,91,0,97,0,104,0,109,0,132,0,133,0,143,0,140,0,141,0, + 141,0,137,0,145,0,143,0,141,0,144,0,141,0,139,0,148,0,144,0,140,0,126,0,126,0,130,0,119,0,119,0,114,0,105,0,100,0,96,0, + 90,0,83,0,80,0,83,0,76,0,71,0,62,0,58,0,50,0,46,0,44,0,48,0,48,0,55,0,58,0,64,0,75,0,78,0,78,0,76,0, + 76,0,73,0,66,0,65,0,61,0,58,0,55,0,60,0,68,0,69,0,64,0,55,0,47,0,44,0,42,0,35,0,36,0,33,0,37,0,44,0, + 50,0,51,0,53,0,55,0,46,0,60,0,61,0,72,0,71,0,73,0,82,0,97,0,104,0,105,0,109,0,112,0,115,0,111,0,115,0,105,0, + 101,0,86,0,73,0,68,0,73,0,68,0,58,0,55,0,53,0,39,0,36,0,24,0,17,0,12,0,7,0,255,255,239,255,231,255,231,255,228,255, + 224,255,220,255,220,255,220,255,217,255,219,255,228,255,224,255,224,255,230,255,232,255,235,255,237,255,238,255,244,255,239,255,241,255,230,255,244,255,244,255, + 241,255,239,255,242,255,242,255,245,255,246,255,6,0,0,0,12,0,7,0,8,0,3,0,11,0,8,0,17,0,18,0,19,0,24,0,26,0,22,0, + 24,0,26,0,25,0,26,0,29,0,42,0,40,0,42,0,37,0,44,0,44,0,33,0,37,0,28,0,26,0,22,0,12,0,19,0,18,0,22,0, + 18,0,14,0,12,0,14,0,19,0,17,0,12,0,10,0,4,0,3,0,0,0,253,255,237,255,231,255,227,255,216,255,206,255,198,255,185,255,177,255, + 166,255,158,255,149,255,151,255,138,255,140,255,140,255,144,255,136,255,136,255,134,255,134,255,137,255,137,255,137,255,142,255,154,255,149,255,152,255,149,255, + 155,255,154,255,156,255,155,255,155,255,156,255,151,255,152,255,158,255,158,255,162,255,169,255,172,255,176,255,170,255,169,255,174,255,178,255,183,255,184,255, + 190,255,196,255,209,255,216,255,217,255,209,255,213,255,214,255,214,255,214,255,199,255,201,255,201,255,191,255,180,255,173,255,160,255,155,255,145,255,136,255, + 133,255,134,255,133,255,130,255,130,255,133,255,133,255,129,255,126,255,127,255,127,255,131,255,127,255,131,255,136,255,141,255,149,255,155,255,166,255,173,255, + 170,255,178,255,170,255,176,255,184,255,184,255,185,255,198,255,199,255,206,255,220,255,231,255,232,255,241,255,237,255,245,255,249,255,253,255,3,0,10,0, + 19,0,29,0,35,0,32,0,30,0,42,0,44,0,54,0,54,0,55,0,65,0,71,0,82,0,87,0,98,0,107,0,108,0,116,0,130,0,130,0, + 130,0,129,0,134,0,127,0,127,0,127,0,118,0,127,0,126,0,126,0,126,0,123,0,118,0,118,0,115,0,105,0,107,0,100,0,86,0,86,0, + 89,0,82,0,79,0,75,0,73,0,75,0,76,0,61,0,60,0,43,0,39,0,35,0,42,0,50,0,51,0,57,0,66,0,71,0,73,0,68,0, + 71,0,73,0,66,0,65,0,53,0,61,0,61,0,60,0,54,0,57,0,57,0,51,0,50,0,40,0,42,0,39,0,35,0,35,0,33,0,29,0, + 32,0,42,0,40,0,48,0,46,0,55,0,57,0,69,0,76,0,80,0,79,0,86,0,93,0,101,0,105,0,101,0,108,0,115,0,111,0,108,0, + 112,0,112,0,111,0,104,0,104,0,86,0,75,0,71,0,64,0,61,0,54,0,40,0,35,0,18,0,12,0,3,0,252,255,238,255,237,255,228,255, + 219,255,212,255,199,255,202,255,203,255,209,255,216,255,217,255,220,255,221,255,224,255,228,255,226,255,231,255,239,255,242,255,239,255,242,255,242,255,246,255, + 230,255,234,255,234,255,228,255,228,255,231,255,237,255,246,255,1,0,3,0,6,0,11,0,3,0,3,0,250,255,252,255,253,255,1,0,3,0,6,0, + 11,0,12,0,14,0,28,0,24,0,35,0,32,0,24,0,15,0,21,0,15,0,10,0,12,0,18,0,22,0,18,0,19,0,19,0,10,0,7,0, + 10,0,15,0,8,0,1,0,12,0,4,0,0,0,252,255,255,255,244,255,246,255,238,255,234,255,227,255,221,255,213,255,208,255,198,255,191,255,188,255, + 181,255,174,255,177,255,167,255,163,255,162,255,159,255,162,255,158,255,156,255,145,255,145,255,144,255,142,255,144,255,145,255,141,255,151,255,160,255,170,255, + 170,255,167,255,167,255,173,255,181,255,187,255,183,255,187,255,178,255,173,255,169,255,169,255,170,255,176,255,183,255,181,255,190,255,188,255,196,255,203,255, + 209,255,205,255,205,255,209,255,209,255,214,255,214,255,206,255,210,255,206,255,203,255,209,255,206,255,196,255,199,255,199,255,198,255,183,255,174,255,165,255, + 156,255,152,255,148,255,144,255,149,255,148,255,152,255,147,255,142,255,133,255,138,255,138,255,136,255,142,255,144,255,140,255,148,255,142,255,154,255,160,255, + 170,255,177,255,176,255,183,255,183,255,190,255,194,255,198,255,212,255,217,255,223,255,224,255,238,255,238,255,242,255,248,255,250,255,248,255,253,255,6,0, + 12,0,17,0,21,0,21,0,32,0,37,0,43,0,48,0,53,0,58,0,62,0,68,0,75,0,84,0,94,0,100,0,105,0,115,0,112,0,112,0, + 119,0,120,0,122,0,125,0,120,0,129,0,127,0,123,0,120,0,109,0,114,0,109,0,112,0,109,0,111,0,107,0,102,0,90,0,91,0,83,0, + 82,0,75,0,69,0,68,0,72,0,75,0,75,0,80,0,76,0,76,0,64,0,61,0,50,0,55,0,54,0,61,0,61,0,69,0,66,0,66,0, + 55,0,65,0,65,0,55,0,57,0,55,0,50,0,43,0,43,0,50,0,51,0,47,0,48,0,51,0,54,0,53,0,53,0,54,0,51,0,48,0, + 43,0,46,0,39,0,37,0,37,0,50,0,54,0,65,0,66,0,72,0,69,0,71,0,79,0,86,0,82,0,89,0,84,0,94,0,94,0,94,0, + 93,0,94,0,93,0,96,0,93,0,89,0,91,0,90,0,78,0,69,0,61,0,50,0,37,0,24,0,11,0,6,0,249,255,246,255,230,255,231,255, + 226,255,212,255,212,255,208,255,198,255,199,255,201,255,203,255,205,255,210,255,216,255,217,255,220,255,216,255,217,255,226,255,216,255,216,255,232,255,228,255, + 227,255,231,255,232,255,234,255,230,255,235,255,232,255,230,255,237,255,238,255,244,255,245,255,244,255,248,255,246,255,249,255,1,0,4,0,14,0,6,0, + 7,0,8,0,8,0,10,0,17,0,21,0,17,0,21,0,11,0,6,0,7,0,3,0,8,0,4,0,7,0,17,0,19,0,19,0,19,0,15,0, + 19,0,10,0,6,0,7,0,7,0,6,0,4,0,250,255,241,255,244,255,227,255,224,255,219,255,217,255,210,255,210,255,210,255,206,255,202,255,209,255, + 210,255,209,255,205,255,199,255,203,255,195,255,192,255,184,255,176,255,170,255,172,255,166,255,170,255,163,255,158,255,162,255,169,255,172,255,183,255,177,255, + 180,255,185,255,185,255,185,255,190,255,184,255,185,255,194,255,191,255,184,255,181,255,181,255,174,255,177,255,181,255,185,255,194,255,188,255,201,255,210,255, + 209,255,210,255,205,255,209,255,201,255,206,255,212,255,210,255,210,255,209,255,206,255,205,255,196,255,196,255,195,255,201,255,196,255,192,255,196,255,178,255, + 176,255,177,255,170,255,167,255,166,255,166,255,163,255,165,255,167,255,162,255,159,255,155,255,148,255,142,255,147,255,147,255,151,255,147,255,158,255,165,255, + 173,255,173,255,178,255,184,255,190,255,195,255,199,255,201,255,210,255,217,255,220,255,226,255,228,255,235,255,238,255,241,255,249,255,0,0,7,0,8,0, + 12,0,17,0,18,0,28,0,25,0,24,0,28,0,29,0,35,0,47,0,58,0,58,0,65,0,76,0,84,0,84,0,91,0,94,0,91,0,96,0, + 102,0,107,0,107,0,111,0,112,0,122,0,120,0,123,0,126,0,118,0,108,0,101,0,89,0,97,0,91,0,90,0,91,0,97,0,91,0,82,0, + 73,0,64,0,61,0,65,0,57,0,62,0,64,0,66,0,79,0,80,0,80,0,78,0,75,0,75,0,71,0,64,0,64,0,60,0,62,0,62,0, + 58,0,57,0,60,0,60,0,54,0,50,0,46,0,47,0,47,0,37,0,39,0,39,0,39,0,43,0,50,0,47,0,46,0,48,0,54,0,51,0, + 43,0,40,0,30,0,37,0,42,0,48,0,53,0,61,0,55,0,62,0,66,0,75,0,78,0,80,0,82,0,93,0,96,0,93,0,94,0,93,0, + 96,0,93,0,89,0,87,0,87,0,87,0,79,0,78,0,80,0,68,0,60,0,50,0,36,0,26,0,12,0,12,0,3,0,249,255,242,255,239,255, + 239,255,228,255,226,255,219,255,210,255,208,255,206,255,196,255,194,255,196,255,201,255,208,255,205,255,208,255,205,255,205,255,209,255,209,255,208,255,214,255, + 221,255,226,255,227,255,234,255,237,255,241,255,246,255,246,255,242,255,249,255,248,255,252,255,1,0,255,255,0,0,253,255,6,0,3,0,7,0,6,0, + 0,0,10,0,12,0,17,0,11,0,8,0,4,0,3,0,255,255,252,255,6,0,4,0,7,0,4,0,0,0,6,0,8,0,11,0,14,0,21,0, + 19,0,15,0,14,0,14,0,10,0,1,0,249,255,245,255,234,255,230,255,228,255,232,255,220,255,223,255,216,255,217,255,208,255,206,255,209,255,206,255, + 205,255,205,255,205,255,201,255,199,255,201,255,198,255,201,255,198,255,194,255,190,255,184,255,191,255,191,255,187,255,187,255,187,255,188,255,194,255,192,255, + 192,255,192,255,187,255,192,255,191,255,191,255,194,255,192,255,185,255,188,255,191,255,194,255,191,255,187,255,187,255,192,255,191,255,195,255,199,255,202,255, + 212,255,219,255,214,255,216,255,206,255,206,255,210,255,212,255,209,255,205,255,206,255,203,255,205,255,198,255,196,255,201,255,198,255,191,255,192,255,191,255, + 195,255,191,255,187,255,181,255,183,255,184,255,187,255,188,255,190,255,184,255,183,255,173,255,178,255,170,255,167,255,159,255,165,255,165,255,167,255,174,255, + 181,255,188,255,184,255,198,255,196,255,195,255,196,255,203,255,205,255,214,255,220,255,223,255,234,255,237,255,235,255,244,255,250,255,255,255,4,0,18,0, + 12,0,11,0,15,0,25,0,37,0,35,0,39,0,48,0,43,0,43,0,44,0,53,0,57,0,62,0,61,0,68,0,71,0,72,0,76,0,79,0, + 87,0,90,0,96,0,102,0,97,0,98,0,101,0,115,0,120,0,125,0,119,0,107,0,105,0,105,0,90,0,87,0,93,0,90,0,94,0,97,0, + 93,0,80,0,80,0,73,0,65,0,60,0,64,0,61,0,66,0,73,0,76,0,78,0,84,0,82,0,80,0,75,0,73,0,71,0,65,0,65,0, + 62,0,51,0,48,0,48,0,46,0,44,0,40,0,47,0,44,0,44,0,43,0,50,0,44,0,40,0,39,0,42,0,42,0,46,0,40,0,40,0, + 30,0,37,0,36,0,37,0,39,0,48,0,47,0,51,0,55,0,58,0,65,0,66,0,73,0,80,0,84,0,91,0,84,0,94,0,93,0,83,0, + 83,0,82,0,82,0,75,0,71,0,66,0,60,0,60,0,62,0,50,0,36,0,28,0,18,0,11,0,4,0,1,0,0,0,0,0,253,255,246,255, + 237,255,228,255,224,255,220,255,214,255,206,255,198,255,201,255,199,255,201,255,194,255,194,255,196,255,195,255,202,255,196,255,199,255,201,255,208,255,206,255, + 214,255,221,255,224,255,220,255,221,255,228,255,227,255,234,255,239,255,252,255,249,255,1,0,1,0,252,255,253,255,249,255,255,255,3,0,253,255,0,0, + 1,0,7,0,4,0,12,0,7,0,7,0,7,0,7,0,3,0,244,255,253,255,248,255,249,255,245,255,0,0,0,0,3,0,11,0,12,0,12,0, + 15,0,6,0,3,0,6,0,253,255,249,255,245,255,245,255,244,255,244,255,241,255,234,255,230,255,226,255,216,255,217,255,208,255,208,255,206,255,216,255, + 219,255,210,255,216,255,205,255,210,255,213,255,213,255,208,255,206,255,202,255,203,255,196,255,187,255,185,255,190,255,181,255,181,255,192,255,187,255,190,255, + 195,255,199,255,203,255,202,255,190,255,199,255,203,255,198,255,194,255,187,255,188,255,187,255,191,255,187,255,188,255,180,255,191,255,184,255,190,255,187,255, + 195,255,198,255,202,255,202,255,209,255,208,255,210,255,213,255,212,255,212,255,214,255,216,255,206,255,213,255,210,255,208,255,205,255,202,255,198,255,203,255, + 199,255,195,255,194,255,191,255,192,255,190,255,183,255,191,255,187,255,187,255,180,255,177,255,173,255,167,255,169,255,166,255,173,255,178,255,180,255,181,255, + 188,255,194,255,198,255,196,255,203,255,203,255,199,255,199,255,206,255,213,255,213,255,219,255,230,255,231,255,242,255,242,255,242,255,250,255,252,255,7,0, + 15,0,19,0,30,0,30,0,26,0,30,0,30,0,30,0,42,0,47,0,55,0,54,0,51,0,61,0,55,0,64,0,62,0,62,0,65,0,76,0, + 75,0,79,0,82,0,82,0,82,0,86,0,84,0,83,0,89,0,97,0,90,0,101,0,100,0,97,0,101,0,102,0,97,0,97,0,94,0,84,0, + 90,0,76,0,72,0,80,0,72,0,76,0,64,0,61,0,60,0,61,0,58,0,75,0,75,0,75,0,79,0,69,0,71,0,66,0,57,0,53,0, + 48,0,50,0,51,0,46,0,42,0,46,0,53,0,47,0,47,0,42,0,37,0,36,0,32,0,32,0,33,0,35,0,36,0,39,0,29,0,28,0, + 30,0,32,0,28,0,29,0,32,0,33,0,35,0,44,0,51,0,55,0,64,0,68,0,69,0,80,0,83,0,86,0,82,0,79,0,87,0,83,0, + 72,0,62,0,64,0,57,0,58,0,61,0,64,0,66,0,62,0,53,0,44,0,30,0,25,0,21,0,18,0,255,255,255,255,250,255,245,255,245,255, + 244,255,234,255,231,255,228,255,217,255,213,255,210,255,213,255,212,255,210,255,214,255,206,255,209,255,209,255,205,255,206,255,206,255,198,255,205,255,206,255, + 206,255,205,255,212,255,216,255,217,255,227,255,231,255,235,255,242,255,244,255,0,0,3,0,0,0,4,0,6,0,4,0,7,0,255,255,0,0,255,255, + 6,0,8,0,14,0,15,0,17,0,18,0,8,0,3,0,0,0,1,0,4,0,7,0,7,0,4,0,3,0,4,0,1,0,250,255,11,0,12,0, + 10,0,7,0,255,255,3,0,250,255,241,255,234,255,237,255,230,255,238,255,237,255,241,255,237,255,235,255,238,255,228,255,228,255,226,255,219,255,212,255, + 217,255,221,255,208,255,212,255,212,255,209,255,201,255,210,255,210,255,206,255,210,255,205,255,203,255,194,255,196,255,190,255,192,255,194,255,196,255,198,255, + 199,255,196,255,192,255,194,255,190,255,195,255,198,255,188,255,184,255,180,255,181,255,187,255,195,255,196,255,191,255,195,255,195,255,188,255,188,255,187,255, + 185,255,194,255,191,255,195,255,196,255,199,255,195,255,201,255,201,255,205,255,201,255,202,255,203,255,213,255,216,255,213,255,212,255,208,255,199,255,198,255, + 209,255,209,255,209,255,210,255,208,255,206,255,199,255,191,255,176,255,172,255,172,255,176,255,187,255,178,255,185,255,187,255,184,255,185,255,191,255,195,255, + 195,255,202,255,203,255,210,255,210,255,208,255,212,255,213,255,219,255,226,255,230,255,231,255,232,255,234,255,238,255,234,255,237,255,245,255,255,255,4,0, + 7,0,12,0,12,0,24,0,24,0,26,0,28,0,30,0,33,0,33,0,33,0,39,0,47,0,43,0,48,0,55,0,60,0,61,0,61,0,57,0, + 57,0,57,0,55,0,57,0,68,0,69,0,71,0,71,0,72,0,78,0,72,0,82,0,83,0,93,0,96,0,93,0,93,0,89,0,87,0,89,0, + 91,0,82,0,83,0,84,0,78,0,76,0,71,0,69,0,75,0,68,0,69,0,71,0,68,0,78,0,69,0,65,0,69,0,61,0,64,0,64,0, + 53,0,57,0,58,0,47,0,54,0,51,0,55,0,46,0,43,0,43,0,43,0,33,0,36,0,32,0,30,0,29,0,29,0,22,0,14,0,14,0, + 21,0,36,0,39,0,36,0,35,0,40,0,43,0,42,0,42,0,48,0,60,0,48,0,54,0,66,0,55,0,62,0,62,0,62,0,69,0,64,0, + 66,0,65,0,64,0,62,0,64,0,64,0,58,0,46,0,51,0,47,0,40,0,35,0,30,0,19,0,15,0,8,0,1,0,255,255,238,255,238,255, + 238,255,237,255,239,255,235,255,232,255,226,255,228,255,221,255,213,255,219,255,213,255,212,255,208,255,205,255,213,255,212,255,212,255,216,255,213,255,209,255, + 206,255,206,255,214,255,216,255,219,255,220,255,228,255,234,255,244,255,246,255,255,255,1,0,1,0,8,0,4,0,4,0,12,0,14,0,12,0,10,0, + 15,0,22,0,18,0,28,0,24,0,21,0,15,0,18,0,12,0,14,0,17,0,17,0,19,0,19,0,17,0,12,0,4,0,1,0,0,0,249,255, + 252,255,1,0,3,0,250,255,248,255,248,255,242,255,237,255,237,255,227,255,230,255,231,255,235,255,235,255,238,255,230,255,235,255,219,255,221,255,227,255, + 228,255,221,255,210,255,209,255,210,255,210,255,210,255,212,255,216,255,208,255,209,255,195,255,195,255,195,255,196,255,196,255,191,255,187,255,195,255,198,255, + 201,255,203,255,206,255,196,255,195,255,205,255,201,255,195,255,194,255,191,255,195,255,192,255,190,255,190,255,187,255,195,255,198,255,196,255,196,255,192,255, + 192,255,187,255,195,255,195,255,195,255,202,255,206,255,210,255,208,255,212,255,206,255,205,255,213,255,213,255,217,255,223,255,223,255,223,255,228,255,227,255, + 220,255,221,255,216,255,217,255,223,255,212,255,203,255,201,255,195,255,196,255,190,255,192,255,191,255,191,255,188,255,192,255,194,255,201,255,201,255,205,255, + 206,255,209,255,209,255,216,255,210,255,212,255,217,255,221,255,220,255,226,255,230,255,235,255,241,255,242,255,245,255,250,255,237,255,241,255,250,255,252,255, + 7,0,11,0,18,0,18,0,29,0,24,0,24,0,33,0,32,0,36,0,35,0,33,0,39,0,48,0,46,0,43,0,44,0,60,0,64,0,57,0, + 62,0,68,0,62,0,60,0,64,0,66,0,65,0,61,0,73,0,75,0,78,0,72,0,79,0,75,0,83,0,76,0,83,0,86,0,80,0,86,0, + 89,0,90,0,90,0,87,0,89,0,84,0,87,0,83,0,82,0,82,0,71,0,65,0,61,0,60,0,54,0,55,0,60,0,60,0,66,0,64,0, + 69,0,61,0,57,0,61,0,48,0,42,0,32,0,37,0,36,0,39,0,39,0,39,0,37,0,36,0,36,0,24,0,28,0,25,0,24,0,25,0, + 22,0,28,0,33,0,28,0,30,0,33,0,33,0,35,0,35,0,37,0,39,0,36,0,33,0,30,0,33,0,33,0,33,0,30,0,33,0,32,0, + 43,0,40,0,40,0,44,0,44,0,40,0,42,0,33,0,32,0,28,0,28,0,22,0,30,0,28,0,24,0,15,0,6,0,3,0,253,255,244,255, + 237,255,226,255,221,255,226,255,226,255,223,255,234,255,226,255,230,255,228,255,220,255,212,255,212,255,212,255,208,255,203,255,203,255,206,255,210,255,213,255, + 220,255,230,255,224,255,223,255,227,255,226,255,226,255,226,255,231,255,238,255,237,255,238,255,241,255,245,255,250,255,0,0,250,255,255,255,7,0,11,0, + 15,0,15,0,15,0,17,0,14,0,15,0,30,0,25,0,24,0,21,0,22,0,24,0,24,0,12,0,18,0,15,0,15,0,7,0,8,0,7,0, + 0,0,252,255,246,255,245,255,244,255,252,255,248,255,237,255,239,255,244,255,238,255,237,255,237,255,235,255,230,255,231,255,221,255,228,255,232,255,234,255, + 232,255,231,255,226,255,228,255,219,255,214,255,216,255,216,255,212,255,212,255,212,255,205,255,210,255,206,255,195,255,199,255,187,255,190,255,190,255,187,255, + 188,255,196,255,201,255,205,255,209,255,194,255,190,255,199,255,192,255,191,255,181,255,181,255,183,255,181,255,183,255,185,255,191,255,199,255,195,255,190,255, + 188,255,185,255,190,255,194,255,192,255,192,255,195,255,202,255,205,255,205,255,206,255,213,255,212,255,210,255,208,255,209,255,210,255,217,255,213,255,213,255, + 219,255,221,255,219,255,219,255,217,255,213,255,208,255,203,255,201,255,198,255,196,255,195,255,192,255,194,255,196,255,192,255,192,255,198,255,203,255,205,255, + 213,255,213,255,220,255,227,255,234,255,231,255,227,255,235,255,237,255,238,255,245,255,245,255,249,255,248,255,248,255,253,255,255,255,4,0,4,0,3,0, + 0,0,3,0,8,0,10,0,17,0,15,0,26,0,32,0,33,0,32,0,30,0,29,0,39,0,40,0,37,0,39,0,37,0,50,0,53,0,62,0, + 60,0,54,0,61,0,65,0,66,0,66,0,69,0,64,0,60,0,64,0,71,0,76,0,73,0,78,0,83,0,80,0,76,0,78,0,83,0,82,0, + 79,0,87,0,80,0,76,0,78,0,82,0,86,0,90,0,83,0,76,0,72,0,61,0,61,0,57,0,61,0,53,0,55,0,68,0,72,0,69,0, + 66,0,66,0,60,0,48,0,51,0,47,0,39,0,42,0,42,0,46,0,47,0,42,0,37,0,35,0,39,0,32,0,28,0,28,0,19,0,19,0, + 29,0,28,0,35,0,28,0,32,0,32,0,37,0,36,0,39,0,32,0,35,0,25,0,14,0,18,0,17,0,24,0,24,0,35,0,30,0,29,0, + 33,0,33,0,30,0,32,0,30,0,24,0,21,0,21,0,21,0,22,0,18,0,14,0,12,0,8,0,14,0,10,0,8,0,8,0,1,0,1,0, + 250,255,241,255,237,255,234,255,231,255,234,255,237,255,231,255,221,255,217,255,220,255,223,255,224,255,226,255,228,255,224,255,221,255,219,255,214,255,220,255, + 220,255,227,255,226,255,228,255,227,255,230,255,228,255,232,255,232,255,234,255,235,255,239,255,245,255,249,255,255,255,3,0,6,0,11,0,18,0,24,0, + 19,0,18,0,19,0,26,0,24,0,26,0,24,0,24,0,29,0,36,0,26,0,29,0,25,0,19,0,18,0,18,0,12,0,17,0,11,0,10,0, + 8,0,12,0,7,0,255,255,246,255,241,255,242,255,244,255,246,255,246,255,245,255,242,255,235,255,228,255,230,255,223,255,226,255,227,255,230,255,237,255, + 232,255,230,255,231,255,231,255,232,255,231,255,213,255,212,255,206,255,196,255,196,255,194,255,192,255,195,255,194,255,195,255,192,255,188,255,195,255,195,255, + 190,255,187,255,183,255,191,255,187,255,190,255,190,255,187,255,190,255,187,255,188,255,187,255,188,255,190,255,188,255,192,255,194,255,191,255,194,255,190,255, + 191,255,191,255,192,255,187,255,190,255,190,255,190,255,201,255,203,255,198,255,203,255,206,255,209,255,212,255,210,255,206,255,201,255,209,255,210,255,213,255, + 217,255,217,255,214,255,214,255,217,255,219,255,216,255,210,255,208,255,212,255,213,255,208,255,213,255,210,255,209,255,208,255,206,255,209,255,212,255,210,255, + 214,255,219,255,221,255,220,255,228,255,231,255,238,255,238,255,234,255,239,255,238,255,246,255,244,255,244,255,250,255,4,0,255,255,253,255,1,0,4,0, + 3,0,14,0,14,0,18,0,19,0,19,0,29,0,24,0,24,0,21,0,29,0,33,0,39,0,39,0,42,0,46,0,48,0,46,0,47,0,51,0, + 39,0,50,0,50,0,61,0,57,0,66,0,61,0,62,0,64,0,62,0,61,0,61,0,66,0,68,0,71,0,79,0,79,0,80,0,75,0,76,0, + 75,0,73,0,83,0,91,0,86,0,93,0,83,0,73,0,83,0,84,0,80,0,79,0,79,0,73,0,71,0,69,0,68,0,58,0,57,0,54,0, + 62,0,61,0,58,0,57,0,55,0,57,0,54,0,51,0,48,0,39,0,36,0,32,0,33,0,33,0,33,0,36,0,32,0,37,0,32,0,32,0, + 29,0,25,0,19,0,21,0,19,0,22,0,22,0,21,0,18,0,24,0,21,0,21,0,19,0,18,0,17,0,15,0,15,0,11,0,14,0,19,0, + 10,0,11,0,10,0,15,0,8,0,14,0,11,0,14,0,14,0,11,0,6,0,8,0,10,0,8,0,4,0,6,0,1,0,3,0,1,0,253,255, + 255,255,249,255,241,255,231,255,232,255,232,255,231,255,230,255,231,255,228,255,230,255,228,255,241,255,232,255,232,255,230,255,231,255,235,255,242,255,238,255, + 232,255,227,255,231,255,238,255,239,255,235,255,237,255,235,255,238,255,241,255,244,255,249,255,246,255,253,255,4,0,14,0,14,0,12,0,17,0,14,0, + 24,0,24,0,22,0,25,0,22,0,25,0,21,0,21,0,24,0,30,0,30,0,30,0,36,0,24,0,19,0,24,0,21,0,21,0,11,0,12,0, + 10,0,8,0,8,0,1,0,3,0,1,0,3,0,255,255,249,255,249,255,241,255,238,255,237,255,239,255,238,255,230,255,231,255,230,255,232,255,228,255, + 234,255,234,255,231,255,235,255,237,255,228,255,224,255,213,255,217,255,210,255,210,255,214,255,212,255,214,255,206,255,205,255,198,255,198,255,196,255,191,255, + 184,255,174,255,170,255,173,255,187,255,184,255,180,255,178,255,177,255,178,255,187,255,198,255,194,255,195,255,192,255,195,255,203,255,198,255,192,255,196,255, + 198,255,198,255,188,255,198,255,196,255,203,255,206,255,209,255,199,255,198,255,199,255,206,255,214,255,210,255,212,255,213,255,213,255,220,255,217,255,217,255, + 214,255,214,255,206,255,209,255,208,255,210,255,217,255,216,255,216,255,219,255,220,255,223,255,223,255,221,255,223,255,220,255,220,255,216,255,219,255,216,255, + 217,255,219,255,226,255,232,255,228,255,231,255,234,255,244,255,237,255,234,255,235,255,248,255,248,255,250,255,255,255,6,0,0,0,14,0,17,0,12,0, + 14,0,18,0,15,0,18,0,19,0,19,0,18,0,14,0,22,0,19,0,26,0,24,0,29,0,33,0,35,0,37,0,37,0,42,0,44,0,43,0, + 47,0,46,0,50,0,48,0,47,0,51,0,57,0,60,0,57,0,65,0,62,0,65,0,66,0,58,0,61,0,64,0,66,0,68,0,65,0,66,0, + 68,0,66,0,73,0,76,0,76,0,78,0,76,0,69,0,69,0,78,0,72,0,69,0,66,0,66,0,61,0,61,0,58,0,69,0,57,0,57,0, + 53,0,54,0,46,0,46,0,46,0,47,0,48,0,40,0,47,0,42,0,46,0,40,0,39,0,46,0,47,0,46,0,40,0,37,0,33,0,30,0, + 35,0,25,0,26,0,24,0,12,0,14,0,10,0,12,0,14,0,8,0,14,0,10,0,10,0,12,0,15,0,12,0,11,0,14,0,7,0,11,0, + 1,0,1,0,0,0,255,255,252,255,8,0,3,0,3,0,4,0,250,255,252,255,252,255,252,255,249,255,252,255,253,255,252,255,249,255,250,255,252,255, + 245,255,248,255,248,255,239,255,242,255,238,255,235,255,230,255,235,255,232,255,230,255,228,255,228,255,235,255,226,255,238,255,231,255,227,255,226,255,230,255, + 230,255,235,255,230,255,231,255,230,255,239,255,232,255,239,255,237,255,238,255,241,255,238,255,250,255,4,0,3,0,10,0,8,0,7,0,10,0,12,0, + 17,0,22,0,19,0,19,0,29,0,21,0,26,0,25,0,21,0,24,0,28,0,28,0,33,0,25,0,28,0,24,0,24,0,18,0,14,0,14,0, + 10,0,6,0,3,0,3,0,3,0,252,255,250,255,246,255,246,255,248,255,242,255,238,255,241,255,242,255,244,255,242,255,237,255,237,255,230,255,232,255, + 234,255,228,255,224,255,223,255,226,255,220,255,221,255,226,255,224,255,221,255,219,255,212,255,205,255,208,255,201,255,199,255,198,255,201,255,192,255,192,255, + 185,255,188,255,181,255,180,255,177,255,181,255,180,255,184,255,181,255,178,255,195,255,201,255,202,255,195,255,187,255,191,255,199,255,195,255,202,255,203,255, + 205,255,202,255,208,255,213,255,203,255,210,255,206,255,209,255,209,255,208,255,203,255,203,255,202,255,212,255,213,255,224,255,227,255,214,255,221,255,219,255, + 223,255,219,255,212,255,220,255,216,255,219,255,219,255,224,255,228,255,216,255,223,255,220,255,228,255,227,255,230,255,228,255,227,255,224,255,219,255,224,255, + 223,255,221,255,226,255,227,255,234,255,239,255,241,255,245,255,249,255,255,255,6,0,255,255,0,0,1,0,253,255,0,0,0,0,4,0,15,0,11,0, + 7,0,14,0,14,0,24,0,26,0,28,0,18,0,26,0,22,0,21,0,22,0,18,0,22,0,28,0,26,0,25,0,29,0,37,0,37,0,37,0, + 44,0,40,0,47,0,48,0,55,0,55,0,55,0,54,0,62,0,62,0,60,0,66,0,68,0,64,0,60,0,65,0,64,0,57,0,60,0,57,0, + 60,0,64,0,64,0,66,0,73,0,76,0,76,0,75,0,73,0,76,0,75,0,75,0,75,0,73,0,71,0,78,0,72,0,68,0,64,0,64,0, + 57,0,48,0,47,0,48,0,46,0,46,0,42,0,40,0,42,0,43,0,47,0,47,0,42,0,33,0,30,0,29,0,32,0,29,0,29,0,29,0, + 29,0,24,0,28,0,22,0,21,0,19,0,22,0,17,0,19,0,12,0,15,0,10,0,17,0,11,0,7,0,6,0,6,0,6,0,4,0,11,0, + 10,0,8,0,3,0,255,255,253,255,248,255,249,255,248,255,249,255,246,255,252,255,249,255,245,255,250,255,249,255,246,255,248,255,245,255,241,255,246,255, + 248,255,246,255,246,255,252,255,250,255,252,255,252,255,237,255,242,255,235,255,241,255,241,255,239,255,231,255,232,255,234,255,238,255,228,255,231,255,227,255, + 239,255,242,255,238,255,234,255,230,255,238,255,239,255,234,255,237,255,238,255,248,255,255,255,248,255,250,255,250,255,3,0,4,0,10,0,3,0,8,0, + 252,255,7,0,10,0,12,0,11,0,15,0,24,0,19,0,28,0,30,0,32,0,33,0,30,0,25,0,21,0,25,0,25,0,21,0,18,0,18,0, + 14,0,12,0,21,0,17,0,8,0,7,0,6,0,252,255,250,255,246,255,249,255,252,255,249,255,249,255,242,255,235,255,238,255,244,255,242,255,241,255, + 234,255,235,255,232,255,231,255,221,255,214,255,224,255,224,255,223,255,228,255,226,255,227,255,221,255,220,255,226,255,219,255,208,255,206,255,202,255,199,255, + 195,255,191,255,187,255,187,255,177,255,180,255,181,255,184,255,185,255,184,255,190,255,195,255,195,255,201,255,203,255,202,255,201,255,199,255,205,255,205,255, + 209,255,209,255,216,255,216,255,209,255,208,255,214,255,210,255,216,255,214,255,214,255,208,255,210,255,216,255,217,255,221,255,220,255,223,255,221,255,219,255, + 221,255,221,255,227,255,214,255,217,255,216,255,216,255,221,255,224,255,226,255,228,255,228,255,226,255,234,255,231,255,220,255,227,255,230,255,230,255,235,255, + 234,255,235,255,238,255,244,255,238,255,239,255,239,255,245,255,241,255,246,255,244,255,250,255,253,255,0,0,0,0,253,255,3,0,8,0,6,0,15,0, + 10,0,12,0,11,0,15,0,11,0,15,0,21,0,24,0,15,0,15,0,18,0,25,0,24,0,30,0,22,0,32,0,28,0,29,0,37,0,36,0, + 36,0,36,0,35,0,35,0,43,0,43,0,46,0,43,0,43,0,46,0,37,0,44,0,47,0,46,0,48,0,53,0,53,0,54,0,57,0,53,0, + 54,0,48,0,53,0,53,0,58,0,51,0,54,0,55,0,55,0,62,0,61,0,61,0,62,0,57,0,55,0,51,0,57,0,50,0,51,0,53,0, + 51,0,54,0,48,0,48,0,42,0,43,0,46,0,44,0,39,0,32,0,33,0,35,0,32,0,36,0,29,0,28,0,28,0,24,0,28,0,28,0, + 25,0,24,0,22,0,24,0,17,0,15,0,17,0,18,0,17,0,8,0,6,0,4,0,4,0,6,0,6,0,12,0,11,0,11,0,6,0,255,255, + 252,255,246,255,252,255,249,255,239,255,239,255,234,255,244,255,238,255,241,255,242,255,245,255,246,255,244,255,248,255,249,255,245,255,245,255,241,255,242,255, + 241,255,249,255,250,255,248,255,248,255,249,255,250,255,246,255,237,255,241,255,239,255,238,255,234,255,238,255,237,255,237,255,238,255,231,255,237,255,231,255, + 231,255,234,255,235,255,231,255,239,255,244,255,245,255,245,255,246,255,249,255,253,255,249,255,252,255,250,255,1,0,3,0,252,255,252,255,0,0,1,0, + 7,0,15,0,15,0,10,0,17,0,17,0,28,0,22,0,30,0,30,0,32,0,37,0,30,0,36,0,30,0,25,0,21,0,18,0,19,0,24,0, + 24,0,26,0,21,0,25,0,11,0,10,0,8,0,255,255,0,0,253,255,249,255,253,255,246,255,248,255,245,255,237,255,239,255,237,255,234,255,232,255, + 239,255,238,255,231,255,234,255,226,255,231,255,231,255,237,255,237,255,234,255,231,255,226,255,210,255,209,255,214,255,213,255,214,255,214,255,217,255,213,255, + 206,255,201,255,196,255,190,255,183,255,183,255,184,255,187,255,191,255,185,255,194,255,199,255,202,255,205,255,195,255,202,255,203,255,209,255,208,255,214,255, + 219,255,223,255,214,255,216,255,210,255,216,255,219,255,219,255,223,255,219,255,223,255,216,255,217,255,220,255,223,255,221,255,221,255,227,255,228,255,217,255, + 220,255,223,255,221,255,228,255,226,255,230,255,226,255,232,255,231,255,228,255,238,255,232,255,234,255,238,255,245,255,246,255,249,255,244,255,249,255,245,255, + 248,255,241,255,245,255,248,255,248,255,249,255,246,255,248,255,246,255,249,255,252,255,245,255,3,0,255,255,0,0,255,255,1,0,4,0,4,0,4,0, + 6,0,7,0,6,0,8,0,18,0,21,0,24,0,19,0,26,0,22,0,15,0,22,0,22,0,19,0,25,0,25,0,36,0,26,0,22,0,24,0, + 30,0,22,0,32,0,30,0,35,0,32,0,39,0,36,0,35,0,39,0,46,0,43,0,43,0,46,0,43,0,46,0,53,0,48,0,48,0,58,0, + 60,0,50,0,50,0,50,0,55,0,53,0,44,0,46,0,50,0,60,0,62,0,60,0,60,0,61,0,53,0,48,0,48,0,50,0,48,0,46,0, + 48,0,50,0,48,0,50,0,47,0,44,0,43,0,39,0,32,0,36,0,26,0,29,0,25,0,21,0,17,0,21,0,18,0,26,0,19,0,18,0, + 15,0,18,0,17,0,15,0,12,0,11,0,10,0,14,0,15,0,11,0,15,0,19,0,12,0,7,0,4,0,1,0,8,0,8,0,8,0,3,0, + 4,0,253,255,250,255,246,255,252,255,248,255,244,255,238,255,238,255,235,255,232,255,235,255,237,255,237,255,231,255,234,255,239,255,238,255,249,255,252,255, + 252,255,0,0,250,255,255,255,0,0,1,0,252,255,248,255,241,255,238,255,237,255,235,255,230,255,237,255,237,255,239,255,241,255,237,255,237,255,226,255, + 234,255,234,255,238,255,238,255,242,255,239,255,241,255,246,255,244,255,244,255,249,255,0,0,248,255,3,0,3,0,7,0,8,0,7,0,10,0,0,0, + 4,0,8,0,6,0,7,0,12,0,15,0,24,0,19,0,22,0,24,0,22,0,25,0,26,0,22,0,24,0,25,0,28,0,22,0,18,0,18,0, + 11,0,15,0,21,0,21,0,18,0,15,0,8,0,12,0,4,0,7,0,10,0,1,0,250,255,246,255,244,255,235,255,235,255,235,255,232,255,239,255, + 234,255,231,255,239,255,248,255,241,255,241,255,238,255,230,255,227,255,226,255,217,255,223,255,220,255,223,255,221,255,216,255,212,255,209,255,199,255,199,255, + 205,255,206,255,202,255,201,255,212,255,205,255,202,255,203,255,205,255,210,255,208,255,206,255,208,255,208,255,209,255,203,255,206,255,213,255,208,255,212,255, + 214,255,213,255,217,255,214,255,220,255,213,255,214,255,213,255,219,255,221,255,220,255,223,255,230,255,224,255,224,255,231,255,230,255,226,255,230,255,227,255, + 234,255,231,255,230,255,235,255,228,255,224,255,227,255,231,255,231,255,232,255,234,255,238,255,241,255,231,255,231,255,235,255,242,255,237,255,238,255,241,255, + 248,255,246,255,244,255,250,255,249,255,248,255,248,255,245,255,250,255,253,255,246,255,1,0,0,0,255,255,253,255,248,255,245,255,249,255,250,255,248,255, + 248,255,255,255,255,255,4,0,1,0,6,0,8,0,8,0,10,0,10,0,12,0,18,0,25,0,26,0,22,0,30,0,25,0,28,0,24,0,28,0, + 29,0,33,0,28,0,29,0,32,0,22,0,25,0,33,0,32,0,35,0,37,0,36,0,29,0,28,0,28,0,32,0,37,0,37,0,43,0,43,0, + 48,0,46,0,44,0,36,0,33,0,32,0,33,0,36,0,46,0,42,0,47,0,48,0,48,0,46,0,36,0,42,0,32,0,37,0,33,0,29,0, + 40,0,39,0,39,0,33,0,37,0,36,0,32,0,30,0,28,0,28,0,29,0,29,0,25,0,18,0,14,0,15,0,18,0,17,0,10,0,15,0, + 8,0,4,0,17,0,12,0,19,0,15,0,11,0,17,0,14,0,19,0,17,0,14,0,7,0,8,0,14,0,10,0,12,0,14,0,11,0,8,0, + 11,0,0,0,4,0,248,255,245,255,241,255,238,255,239,255,238,255,237,255,245,255,246,255,238,255,238,255,238,255,241,255,242,255,244,255,250,255,0,0, + 246,255,1,0,252,255,0,0,253,255,252,255,255,255,255,255,252,255,248,255,250,255,250,255,246,255,250,255,244,255,244,255,245,255,242,255,237,255,234,255, + 241,255,239,255,239,255,239,255,239,255,237,255,249,255,248,255,255,255,248,255,249,255,244,255,249,255,252,255,252,255,0,0,3,0,7,0,4,0,7,0, + 14,0,8,0,14,0,18,0,12,0,15,0,17,0,26,0,19,0,19,0,19,0,24,0,22,0,25,0,32,0,26,0,30,0,24,0,22,0,22,0, + 19,0,22,0,22,0,18,0,18,0,25,0,12,0,7,0,10,0,11,0,11,0,7,0,255,255,252,255,253,255,250,255,250,255,245,255,244,255,245,255, + 244,255,242,255,237,255,241,255,231,255,235,255,230,255,221,255,224,255,223,255,224,255,232,255,227,255,221,255,217,255,219,255,213,255,221,255,214,255,216,255, + 210,255,210,255,202,255,202,255,196,255,202,255,209,255,210,255,210,255,217,255,214,255,219,255,212,255,213,255,213,255,214,255,214,255,209,255,209,255,209,255, + 212,255,210,255,216,255,216,255,216,255,217,255,227,255,226,255,228,255,228,255,221,255,224,255,227,255,235,255,228,255,238,255,237,255,231,255,237,255,241,255, + 242,255,235,255,235,255,238,255,244,255,235,255,242,255,242,255,241,255,242,255,239,255,245,255,246,255,250,255,244,255,244,255,245,255,244,255,239,255,242,255, + 239,255,245,255,246,255,245,255,252,255,255,255,253,255,0,0,3,0,6,0,8,0,3,0,0,0,252,255,0,0,255,255,255,255,252,255,253,255,253,255, + 252,255,246,255,248,255,0,0,253,255,0,0,0,0,255,255,253,255,252,255,1,0,8,0,18,0,22,0,22,0,24,0,26,0,18,0,26,0,24,0, + 19,0,19,0,18,0,19,0,15,0,18,0,28,0,22,0,22,0,17,0,25,0,30,0,33,0,29,0,24,0,32,0,35,0,35,0,36,0,35,0, + 33,0,35,0,48,0,37,0,35,0,32,0,39,0,43,0,37,0,40,0,39,0,40,0,39,0,43,0,37,0,30,0,33,0,35,0,33,0,26,0, + 29,0,30,0,33,0,35,0,32,0,33,0,24,0,19,0,25,0,21,0,17,0,12,0,4,0,14,0,11,0,10,0,12,0,15,0,11,0,8,0, + 4,0,3,0,6,0,6,0,10,0,6,0,6,0,10,0,4,0,3,0,8,0,3,0,6,0,1,0,3,0,0,0,253,255,253,255,4,0,7,0, + 6,0,7,0,4,0,0,0,0,0,248,255,245,255,242,255,235,255,239,255,239,255,238,255,241,255,237,255,232,255,231,255,241,255,234,255,252,255,252,255, + 252,255,249,255,248,255,252,255,253,255,0,0,1,0,252,255,3,0,4,0,1,0,250,255,253,255,252,255,250,255,248,255,242,255,246,255,249,255,249,255, + 248,255,248,255,245,255,248,255,245,255,252,255,244,255,242,255,241,255,245,255,3,0,252,255,3,0,4,0,0,0,255,255,255,255,0,0,11,0,18,0, + 17,0,15,0,17,0,17,0,22,0,29,0,22,0,24,0,22,0,26,0,30,0,33,0,35,0,35,0,39,0,32,0,32,0,32,0,25,0,22,0, + 21,0,17,0,15,0,14,0,11,0,12,0,11,0,7,0,14,0,14,0,8,0,255,255,1,0,1,0,252,255,249,255,248,255,246,255,242,255,238,255, + 242,255,242,255,242,255,232,255,235,255,235,255,235,255,234,255,237,255,234,255,239,255,228,255,226,255,227,255,223,255,220,255,221,255,216,255,212,255,212,255, + 220,255,216,255,223,255,221,255,212,255,210,255,208,255,212,255,213,255,213,255,217,255,214,255,212,255,210,255,224,255,226,255,224,255,221,255,221,255,219,255, + 220,255,226,255,214,255,219,255,223,255,226,255,223,255,227,255,220,255,226,255,227,255,232,255,235,255,237,255,235,255,239,255,238,255,242,255,244,255,245,255, + 248,255,252,255,249,255,0,0,1,0,1,0,252,255,255,255,250,255,244,255,245,255,248,255,245,255,244,255,246,255,245,255,246,255,246,255,248,255,246,255, + 249,255,245,255,242,255,245,255,250,255,255,255,252,255,255,255,3,0,252,255,249,255,252,255,4,0,7,0,4,0,0,0,0,0,0,0,253,255,0,0, + 253,255,250,255,4,0,255,255,4,0,4,0,1,0,8,0,3,0,0,0,0,0,6,0,3,0,6,0,1,0,17,0,18,0,26,0,21,0,24,0, + 25,0,24,0,22,0,22,0,22,0,19,0,18,0,22,0,22,0,28,0,25,0,22,0,25,0,25,0,18,0,24,0,21,0,21,0,30,0,30,0, + 29,0,33,0,42,0,37,0,42,0,37,0,36,0,40,0,39,0,43,0,37,0,35,0,37,0,24,0,25,0,25,0,25,0,22,0,19,0,25,0, + 26,0,19,0,17,0,21,0,17,0,15,0,11,0,19,0,19,0,19,0,15,0,17,0,12,0,15,0,15,0,19,0,12,0,6,0,1,0,252,255, + 0,0,7,0,1,0,3,0,8,0,6,0,7,0,1,0,14,0,14,0,6,0,8,0,8,0,1,0,3,0,255,255,252,255,252,255,250,255,255,255, + 250,255,253,255,0,0,6,0,0,0,249,255,255,255,255,255,249,255,250,255,244,255,248,255,245,255,239,255,231,255,232,255,237,255,241,255,244,255,252,255, + 248,255,245,255,239,255,245,255,241,255,250,255,250,255,1,0,246,255,255,255,255,255,255,255,255,255,253,255,250,255,255,255,1,0,253,255,250,255,248,255, + 246,255,246,255,246,255,252,255,249,255,252,255,250,255,255,255,249,255,250,255,250,255,249,255,248,255,252,255,249,255,6,0,3,0,11,0,8,0,15,0, + 17,0,14,0,17,0,17,0,21,0,26,0,26,0,29,0,29,0,29,0,24,0,19,0,17,0,19,0,19,0,14,0,21,0,19,0,24,0,19,0, + 21,0,21,0,19,0,14,0,21,0,6,0,10,0,15,0,6,0,3,0,4,0,3,0,4,0,255,255,253,255,245,255,244,255,244,255,241,255,241,255, + 238,255,245,255,241,255,238,255,235,255,235,255,232,255,232,255,231,255,232,255,235,255,235,255,231,255,228,255,221,255,221,255,223,255,223,255,230,255,213,255, + 213,255,216,255,210,255,208,255,203,255,212,255,212,255,206,255,210,255,212,255,208,255,216,255,210,255,209,255,213,255,206,255,213,255,223,255,221,255,227,255, + 230,255,232,255,228,255,226,255,230,255,224,255,226,255,224,255,226,255,230,255,234,255,228,255,230,255,232,255,231,255,227,255,232,255,235,255,239,255,244,255, + 237,255,252,255,249,255,249,255,250,255,252,255,252,255,0,0,248,255,255,255,252,255,250,255,3,0,1,0,252,255,248,255,246,255,245,255,245,255,245,255, + 246,255,242,255,249,255,249,255,245,255,250,255,249,255,252,255,253,255,1,0,1,0,4,0,0,0,3,0,6,0,3,0,8,0,7,0,7,0,250,255, + 4,0,252,255,246,255,253,255,252,255,3,0,4,0,250,255,249,255,239,255,250,255,249,255,4,0,0,0,11,0,11,0,15,0,17,0,21,0,14,0, + 17,0,21,0,21,0,25,0,22,0,22,0,28,0,35,0,25,0,26,0,24,0,26,0,25,0,24,0,18,0,26,0,24,0,26,0,28,0,19,0, + 29,0,30,0,25,0,26,0,35,0,35,0,28,0,22,0,28,0,28,0,33,0,30,0,30,0,37,0,37,0,39,0,28,0,22,0,19,0,18,0, + 10,0,12,0,14,0,15,0,11,0,12,0,14,0,17,0,8,0,8,0,8,0,10,0,19,0,4,0,6,0,8,0,11,0,8,0,6,0,6,0, + 8,0,1,0,252,255,253,255,1,0,253,255,1,0,1,0,8,0,7,0,7,0,7,0,4,0,6,0,255,255,252,255,253,255,255,255,252,255,250,255, + 6,0,6,0,0,0,6,0,3,0,0,0,249,255,249,255,255,255,246,255,249,255,250,255,248,255,244,255,245,255,249,255,244,255,252,255,245,255,244,255, + 242,255,245,255,237,255,237,255,244,255,244,255,250,255,255,255,1,0,253,255,255,255,255,255,6,0,4,0,4,0,253,255,255,255,0,0,1,0,252,255, + 241,255,250,255,252,255,255,255,0,0,255,255,1,0,253,255,244,255,245,255,239,255,244,255,248,255,3,0,8,0,7,0,11,0,3,0,10,0,14,0, + 14,0,14,0,15,0,22,0,26,0,24,0,26,0,26,0,22,0,26,0,32,0,33,0,33,0,33,0,29,0,30,0,30,0,36,0,29,0,21,0, + 19,0,18,0,19,0,21,0,17,0,17,0,18,0,12,0,7,0,4,0,1,0,252,255,255,255,4,0,3,0,248,255,242,255,242,255,238,255,241,255, + 238,255,239,255,237,255,239,255,241,255,235,255,232,255,231,255,230,255,234,255,231,255,232,255,230,255,234,255,235,255,234,255,227,255,230,255,231,255,220,255, + 217,255,210,255,213,255,217,255,217,255,219,255,220,255,219,255,226,255,223,255,212,255,220,255,220,255,220,255,210,255,223,255,230,255,224,255,227,255,231,255, + 231,255,231,255,234,255,226,255,232,255,237,255,241,255,235,255,232,255,231,255,232,255,237,255,235,255,234,255,0,0}; +const char* BinaryData::cello_wav = (const char*) temp2; + +static const unsigned char temp3[] = {60,68,69,77,79,95,84,65,66,76,69,95,68,65,84,65,62,13,10,32,32,32,32,60,67,79,76,85,77,78,83,62,13,10,32,32,32,32,32,32, + 32,32,60,67,79,76,85,77,78,32,99,111,108,117,109,110,73,100,61,34,49,34,32,110,97,109,101,61,34,73,68,34,32,119,105,100,116,104,61,34, + 53,48,34,47,62,13,10,32,32,32,32,32,32,32,32,60,67,79,76,85,77,78,32,99,111,108,117,109,110,73,100,61,34,50,34,32,110,97,109,101, + 61,34,65,114,116,105,115,116,34,32,119,105,100,116,104,61,34,49,53,48,34,47,62,13,10,32,32,32,32,32,32,32,32,60,67,79,76,85,77,78, + 32,99,111,108,117,109,110,73,100,61,34,51,34,32,110,97,109,101,61,34,83,111,110,103,34,32,119,105,100,116,104,61,34,50,48,48,34,47,62,13, + 10,32,32,32,32,32,32,32,32,60,67,79,76,85,77,78,32,99,111,108,117,109,110,73,100,61,34,52,34,32,110,97,109,101,61,34,65,108,98,117, + 109,34,32,119,105,100,116,104,61,34,49,48,48,34,47,62,13,10,32,32,32,32,32,32,32,32,60,67,79,76,85,77,78,32,99,111,108,117,109,110, + 73,100,61,34,53,34,32,110,97,109,101,61,34,82,97,116,105,110,103,34,32,119,105,100,116,104,61,34,49,50,48,34,47,62,13,10,32,32,32,32, + 32,32,32,32,60,67,79,76,85,77,78,32,99,111,108,117,109,110,73,100,61,34,54,34,32,110,97,109,101,61,34,71,101,110,114,101,34,32,119,105, + 100,116,104,61,34,56,48,34,47,62,13,10,32,32,32,32,32,32,32,32,60,67,79,76,85,77,78,32,99,111,108,117,109,110,73,100,61,34,55,34, + 32,110,97,109,101,61,34,76,101,110,103,116,104,34,32,119,105,100,116,104,61,34,56,48,34,47,62,13,10,32,32,32,32,60,47,67,79,76,85,77, + 78,83,62,13,10,32,32,32,32,60,68,65,84,65,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,48,49,34,32,65, + 114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108,98,117,109,61,34,82,101,118,111,108,118,101,114,34,32,83,111,110, + 103,61,34,84,97,120,109,97,110,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,51,57,34,32,82,97, + 116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,48,50,34,32,65,114,116,105,115,116, + 61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108,98,117,109,61,34,82,101,118,111,108,118,101,114,34,32,83,111,110,103,61,34,69,108, + 101,97,110,111,114,32,82,105,103,98,121,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,48,55,34,32, + 82,97,116,105,110,103,61,34,50,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,48,51,34,32,65,114,116,105, + 115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108,98,117,109,61,34,82,101,118,111,108,118,101,114,34,32,83,111,110,103,61,34, + 73,39,109,32,111,110,108,121,32,83,108,101,101,112,105,110,103,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34, + 51,58,48,49,34,32,82,97,116,105,110,103,61,34,51,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,48,52, + 34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108,98,117,109,61,34,82,101,118,111,108,118,101,114,34,32, + 83,111,110,103,61,34,89,101,108,108,111,119,32,83,117,98,109,97,114,105,110,101,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110, + 103,116,104,61,34,50,58,52,48,34,32,82,97,116,105,110,103,61,34,52,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73, + 68,61,34,48,53,34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108,98,117,109,61,34,82,117,98,98,101, + 114,32,83,111,117,108,34,32,83,111,110,103,61,34,68,114,105,118,101,32,77,121,32,67,97,114,34,32,71,101,110,114,101,61,34,82,111,99,107,34, + 32,76,101,110,103,116,104,61,34,50,58,51,48,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84, + 69,77,32,73,68,61,34,48,54,34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108,98,117,109,61,34,82, + 117,98,98,101,114,32,83,111,117,108,34,32,83,111,110,103,61,34,78,111,114,119,101,103,105,97,110,32,87,111,111,100,34,32,71,101,110,114,101,61, + 34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,48,53,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32, + 32,32,32,60,73,84,69,77,32,73,68,61,34,48,55,34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34,32,65,108, + 98,117,109,61,34,82,117,98,98,101,114,32,83,111,117,108,34,32,83,111,110,103,61,34,78,111,119,104,101,114,101,32,77,97,110,34,32,71,101,110, + 114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,52,52,34,32,82,97,116,105,110,103,61,34,53,34,47,62,13,10,32,32, + 32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,48,56,34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34, + 32,65,108,98,117,109,61,34,82,117,98,98,101,114,32,83,111,117,108,34,32,83,111,110,103,61,34,84,104,101,32,87,111,114,100,34,32,71,101,110, + 114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,52,51,34,32,82,97,116,105,110,103,61,34,50,34,47,62,13,10,32,32, + 32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,48,57,34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116,108,101,115,34, + 32,65,108,98,117,109,61,34,82,117,98,98,101,114,32,83,111,117,108,34,32,83,111,110,103,61,34,87,104,97,116,32,71,111,101,115,32,79,110,34, + 32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,53,48,34,32,82,97,116,105,110,103,61,34,51,34,47,62, + 13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,48,34,32,65,114,116,105,115,116,61,34,84,104,101,32,66,101,97,116, + 108,101,115,34,32,65,108,98,117,109,61,34,82,117,98,98,101,114,32,83,111,117,108,34,32,83,111,110,103,61,34,73,110,32,77,121,32,76,105,102, + 101,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,50,55,34,32,82,97,116,105,110,103,61,34,49,34, + 47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,49,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97, + 117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,86,105,99,116,111,114,105,97,108,97,110,100,34,32,83,111,110,103,61,34,76,97,122,121, + 32,67,97,108,109,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,54,58,51,54,34,32,82,97, + 116,105,110,103,61,34,54,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,50,34,32,65,114,116,105,115,116, + 61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,86,105,99,116,111,114,105,97,108,97,110,100,34,32,83,111, + 110,103,61,34,70,108,117,102,102,121,32,84,117,102,116,115,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116, + 104,61,34,51,58,48,53,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61, + 34,49,51,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,86,105,99,116,111, + 114,105,97,108,97,110,100,34,32,83,111,110,103,61,34,79,111,109,105,110,103,109,97,107,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97, + 108,34,32,76,101,110,103,116,104,61,34,50,58,52,50,34,32,82,97,116,105,110,103,61,34,51,34,47,62,13,10,32,32,32,32,32,32,32,32,60, + 73,84,69,77,32,73,68,61,34,49,52,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117, + 109,61,34,86,105,99,116,111,114,105,97,108,97,110,100,34,32,83,111,110,103,61,34,70,101,101,116,45,76,105,107,101,32,70,105,110,115,34,32,71, + 101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,51,58,50,54,34,32,82,97,116,105,110,103,61,34,49,34, + 47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,53,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97, + 117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,70,111,117,114,32,67,97,108,101,110,100,97,114,32,67,97,102,101,34,32,83,111,110,103, + 61,34,75,110,111,119,32,87,104,111,32,89,111,117,32,65,114,101,32,65,116,32,69,118,101,114,121,32,65,103,101,34,32,71,101,110,114,101,61,34, + 69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,51,58,52,50,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32, + 32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,54,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117,32,84,119,105,110, + 115,34,32,65,108,98,117,109,61,34,70,111,117,114,32,67,97,108,101,110,100,97,114,32,67,97,102,101,34,32,83,111,110,103,61,34,69,118,97,110, + 103,101,108,105,110,101,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,52,58,51,49,34,32,82, + 97,116,105,110,103,61,34,53,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,55,34,32,65,114,116,105,115, + 116,61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,70,111,117,114,32,67,97,108,101,110,100,97,114,32,67, + 97,102,101,34,32,83,111,110,103,61,34,66,108,117,101,98,101,97,114,100,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76, + 101,110,103,116,104,61,34,51,58,53,54,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77, + 32,73,68,61,34,49,56,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,70, + 111,117,114,32,67,97,108,101,110,100,97,114,32,67,97,102,101,34,32,83,111,110,103,61,34,83,113,117,101,101,122,101,45,87,97,120,34,32,71,101, + 110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,51,58,52,57,34,32,82,97,116,105,110,103,61,34,49,34,47, + 62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,49,57,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117, + 32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,72,101,97,118,101,110,32,79,114,32,76,97,115,32,86,101,103,97,115,34,32,83,111,110,103, + 61,34,67,104,101,114,114,121,45,67,111,108,111,117,114,101,100,32,70,117,110,107,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34, + 32,76,101,110,103,116,104,61,34,51,58,49,51,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84, + 69,77,32,73,68,61,34,50,48,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117,109,61, + 34,72,101,97,118,101,110,32,79,114,32,76,97,115,32,86,101,103,97,115,34,32,83,111,110,103,61,34,73,99,101,98,108,105,110,107,32,76,117,99, + 107,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,51,58,49,56,34,32,82,97,116,105,110,103, + 61,34,55,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,50,49,34,32,65,114,116,105,115,116,61,34,67,111, + 99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117,109,61,34,72,101,97,118,101,110,32,79,114,32,76,97,115,32,86,101,103,97,115,34, + 32,83,111,110,103,61,34,70,105,102,116,121,45,70,105,102,116,121,32,67,108,111,119,110,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97, + 108,34,32,76,101,110,103,116,104,61,34,51,58,49,53,34,32,82,97,116,105,110,103,61,34,50,34,47,62,13,10,32,32,32,32,32,32,32,32,60, + 73,84,69,77,32,73,68,61,34,50,50,34,32,65,114,116,105,115,116,61,34,67,111,99,116,101,97,117,32,84,119,105,110,115,34,32,65,108,98,117, + 109,61,34,72,101,97,118,101,110,32,79,114,32,76,97,115,32,86,101,103,97,115,34,32,83,111,110,103,61,34,70,111,116,122,101,112,111,108,105,116, + 105,99,34,32,71,101,110,114,101,61,34,69,116,104,101,114,105,97,108,34,32,76,101,110,103,116,104,61,34,51,58,51,48,34,32,82,97,116,105,110, + 103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,50,51,34,32,65,114,116,105,115,116,61,34,82, + 111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,73,32,79,102,116,101,110,32,68,114,101,97,109,32,111,102,32, + 84,114,97,105,110,115,34,32,83,111,110,103,61,34,78,111,99,116,117,114,110,101,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110, + 103,116,104,61,34,49,58,52,50,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73, + 68,61,34,50,52,34,32,65,114,116,105,115,116,61,34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,73, + 32,79,102,116,101,110,32,68,114,101,97,109,32,111,102,32,84,114,97,105,110,115,34,32,83,111,110,103,61,34,85,110,99,111,114,114,101,99,116,101, + 100,32,80,101,114,115,111,110,97,108,105,116,121,32,84,114,97,105,116,115,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116, + 104,61,34,49,58,52,53,34,32,82,97,116,105,110,103,61,34,53,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61, + 34,50,53,34,32,65,114,116,105,115,116,61,34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,73,32,79, + 102,116,101,110,32,68,114,101,97,109,32,111,102,32,84,114,97,105,110,115,34,32,83,111,110,103,61,34,77,121,32,70,97,118,111,117,114,105,116,101, + 32,66,117,105,108,100,105,110,103,115,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,52,57,34,32,82, + 97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,50,54,34,32,65,114,116,105,115, + 116,61,34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,73,32,79,102,116,101,110,32,68,114,101,97,109, + 32,111,102,32,84,114,97,105,110,115,34,32,83,111,110,103,61,34,72,101,97,114,116,102,117,108,32,111,102,32,76,101,97,118,101,115,34,32,71,101, + 110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,51,48,34,32,82,97,116,105,110,103,61,34,55,34,47,62,13,10,32, + 32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,50,55,34,32,65,114,116,105,115,116,61,34,82,111,98,121,110,32,72,105,116,99,104, + 99,111,99,107,34,32,65,108,98,117,109,61,34,76,117,120,111,114,34,32,83,111,110,103,61,34,80,101,110,101,108,111,112,101,39,115,32,65,110,103, + 108,101,115,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,51,58,49,56,34,32,82,97,116,105,110,103,61,34, + 49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,50,56,34,32,65,114,116,105,115,116,61,34,82,111,98,121, + 110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,76,117,120,111,114,34,32,83,111,110,103,61,34,89,111,117,32,82,101,109, + 105,110,100,32,77,101,32,79,102,32,89,111,117,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,52,58,49,53, + 34,32,82,97,116,105,110,103,61,34,52,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,50,57,34,32,65,114, + 116,105,115,116,61,34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,76,117,120,111,114,34,32,83,111,110, + 103,61,34,84,104,101,32,87,111,108,102,32,72,111,117,115,101,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34, + 51,58,50,51,34,32,82,97,116,105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,51,48, + 34,32,65,114,116,105,115,116,61,34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,74,101,119,101,108,115, + 32,70,111,114,32,83,111,112,104,105,97,34,32,83,111,110,103,61,34,77,101,120,105,99,97,110,32,71,111,100,34,32,71,101,110,114,101,61,34,82, + 111,99,107,34,32,76,101,110,103,116,104,61,34,50,58,53,55,34,32,82,97,116,105,110,103,61,34,51,34,47,62,13,10,32,32,32,32,32,32,32, + 32,60,73,84,69,77,32,73,68,61,34,51,49,34,32,65,114,116,105,115,116,61,34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32, + 65,108,98,117,109,61,34,74,101,119,101,108,115,32,70,111,114,32,83,111,112,104,105,97,34,32,83,111,110,103,61,34,84,104,101,32,67,104,101,101, + 115,101,32,65,108,97,114,109,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,52,58,48,51,34,32,82,97,116, + 105,110,103,61,34,49,34,47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,51,50,34,32,65,114,116,105,115,116,61, + 34,82,111,98,121,110,32,72,105,116,99,104,99,111,99,107,34,32,65,108,98,117,109,61,34,74,101,119,101,108,115,32,70,111,114,32,83,111,112,104, + 105,97,34,32,83,111,110,103,61,34,78,111,44,32,73,32,68,111,110,39,116,32,82,101,109,101,109,98,101,114,32,71,117,105,108,100,102,111,114,100, + 34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,52,58,52,53,34,32,82,97,116,105,110,103,61,34,54,34,47, + 62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,51,51,34,32,65,114,116,105,115,116,61,34,83,121,100,32,66,97,114, + 114,101,116,116,34,32,65,108,98,117,109,61,34,66,97,114,114,101,116,116,34,32,83,111,110,103,61,34,66,97,98,121,32,76,101,109,111,110,97,100, + 101,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,52,58,49,48,34,32,82,97,116,105,110,103,61,34,50,34, + 47,62,13,10,32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,51,52,34,32,65,114,116,105,115,116,61,34,83,121,100,32,66,97, + 114,114,101,116,116,34,32,65,108,98,117,109,61,34,66,97,114,114,101,116,116,34,32,83,111,110,103,61,34,68,111,109,105,110,111,101,115,34,32,71, + 101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,52,58,48,56,34,32,82,97,116,105,110,103,61,34,51,34,47,62,13,10, + 32,32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,51,53,34,32,65,114,116,105,115,116,61,34,83,121,100,32,66,97,114,114,101,116, + 116,34,32,65,108,98,117,109,61,34,66,97,114,114,101,116,116,34,32,83,111,110,103,61,34,71,105,103,111,108,111,32,65,117,110,116,34,32,71,101, + 110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,53,58,52,54,34,32,82,97,116,105,110,103,61,34,52,34,47,62,13,10,32, + 32,32,32,32,32,32,32,60,73,84,69,77,32,73,68,61,34,51,54,34,32,65,114,116,105,115,116,61,34,83,121,100,32,66,97,114,114,101,116,116, + 34,32,65,108,98,117,109,61,34,66,97,114,114,101,116,116,34,32,83,111,110,103,61,34,69,102,102,101,114,118,101,115,99,105,110,103,32,69,108,101, + 112,104,97,110,116,34,32,71,101,110,114,101,61,34,82,111,99,107,34,32,76,101,110,103,116,104,61,34,49,58,53,50,34,32,82,97,116,105,110,103, + 61,34,53,34,47,62,13,10,32,32,32,32,60,47,68,65,84,65,62,13,10,60,47,68,69,77,79,95,84,65,66,76,69,95,68,65,84,65,62,0,0}; +const char* BinaryData::demo_table_data_xml = (const char*) temp3; + +static const unsigned char temp4[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 13,10,47,47,32,116,104,105,115,32,105,115,32,116,104,101,32,108,105,115,116,98,111,120,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32, + 100,114,97,103,103,97,98,108,101,32,115,111,117,114,99,101,32,99,111,109,112,111,110,101,110,116,115,46,46,13,10,13,10,99,108,97,115,115,32,68, + 114,97,103,65,110,100,68,114,111,112,68,101,109,111,83,111,117,114,99,101,32,32,58,32,112,117,98,108,105,99,32,76,105,115,116,66,111,120,44,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,76, + 105,115,116,66,111,120,77,111,100,101,108,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,68,114,97,103,65, + 110,100,68,114,111,112,68,101,109,111,83,111,117,114,99,101,40,41,13,10,32,32,32,32,32,32,32,32,58,32,76,105,115,116,66,111,120,32,40,84, + 40,34,100,43,100,32,115,111,117,114,99,101,34,41,44,32,48,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,116,101, + 108,108,115,32,116,104,101,32,76,105,115,116,66,111,120,32,116,104,97,116,32,116,104,105,115,32,111,98,106,101,99,116,32,115,117,112,112,108,105,101, + 115,32,116,104,101,32,105,110,102,111,32,97,98,111,117,116,13,10,32,32,32,32,32,32,32,32,47,47,32,105,116,115,32,114,111,119,115,46,13,10, + 32,32,32,32,32,32,32,32,115,101,116,77,111,100,101,108,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,77, + 117,108,116,105,112,108,101,83,101,108,101,99,116,105,111,110,69,110,97,98,108,101,100,32,40,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10, + 13,10,32,32,32,32,126,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,83,111,117,114,99,101,40,41,13,10,32,32,32,32,123,13,10,32, + 32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,101,116,104,111, + 100,115,32,105,109,112,108,101,109,101,110,116,32,116,104,101,32,110,101,99,101,115,115,97,114,121,32,118,105,114,116,117,97,108,32,102,117,110,99,116, + 105,111,110,115,32,102,114,111,109,32,76,105,115,116,66,111,120,77,111,100,101,108,44,13,10,32,32,32,32,47,47,32,116,101,108,108,105,110,103,32, + 116,104,101,32,108,105,115,116,98,111,120,32,104,111,119,32,109,97,110,121,32,114,111,119,115,32,116,104,101,114,101,32,97,114,101,44,32,112,97,105, + 110,116,105,110,103,32,116,104,101,109,44,32,101,116,99,46,13,10,32,32,32,32,105,110,116,32,103,101,116,78,117,109,82,111,119,115,40,41,13,10, + 32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,51,48,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32, + 118,111,105,100,32,112,97,105,110,116,76,105,115,116,66,111,120,73,116,101,109,32,40,105,110,116,32,114,111,119,78,117,109,98,101,114,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,71,114,97,112,104,105,99,115,38,32,103,44,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,119,105,100,116,104,44,32,105,110, + 116,32,104,101,105,103,104,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,111, + 111,108,32,114,111,119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,114,111, + 119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108, + 111,117,114,115,58,58,108,105,103,104,116,98,108,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114, + 32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40,104, + 101,105,103,104,116,32,42,32,48,46,55,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,84,101,120,116,32,40,84,40, + 34,82,111,119,32,78,117,109,98,101,114,32,34,41,32,43,32,83,116,114,105,110,103,32,40,114,111,119,78,117,109,98,101,114,32,43,32,49,41,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,53,44,32,48,44,32,119,105,100,116,104,44,32,104,101,105,103,104, + 116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,99, + 101,110,116,114,101,100,76,101,102,116,44,32,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,99,111,110,115,116,32,83, + 116,114,105,110,103,32,103,101,116,68,114,97,103,83,111,117,114,99,101,68,101,115,99,114,105,112,116,105,111,110,32,40,99,111,110,115,116,32,83,112, + 97,114,115,101,83,101,116,60,105,110,116,62,38,32,115,101,108,101,99,116,101,100,82,111,119,115,41,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,47,47,32,102,111,114,32,111,117,114,32,100,114,97,103,32,100,101,115,99,116,114,105,112,116,105,111,110,44,32,119,101,39,108,108,32, + 106,117,115,116,32,109,97,107,101,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,115,101,108,101,99,116,101,100,13,10,32,32,32,32,32,32, + 32,32,47,47,32,114,111,119,32,110,117,109,98,101,114,115,32,45,32,116,104,105,115,32,119,105,108,108,32,98,101,32,112,105,99,107,101,100,32,117, + 112,32,98,121,32,116,104,101,32,100,114,97,103,32,116,97,114,103,101,116,32,97,110,100,32,100,105,115,112,108,97,121,101,100,32,105,110,13,10,32, + 32,32,32,32,32,32,32,47,47,32,105,116,115,32,98,111,120,46,13,10,32,32,32,32,32,32,32,32,83,116,114,105,110,103,32,100,101,115,99,59, + 13,10,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,48,59,32,105,32,60,32,115,101,108,101,99,116,101,100, + 82,111,119,115,46,115,105,122,101,40,41,59,32,43,43,105,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,115,99,32,60,60,32,40, + 115,101,108,101,99,116,101,100,82,111,119,115,32,91,105,93,32,43,32,49,41,32,60,60,32,84,40,34,32,34,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,114,101,116,117,114,110,32,100,101,115,99,46,116,114,105,109,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10, + 32,32,32,32,47,47,32,116,104,105,115,32,106,117,115,116,32,102,105,108,108,115,32,105,110,32,116,104,101,32,98,97,99,107,103,114,111,117,110,100, + 32,111,102,32,116,104,101,32,108,105,115,116,98,111,120,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99, + 115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115, + 58,58,119,104,105,116,101,46,119,105,116,104,65,108,112,104,97,32,40,48,46,55,102,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32, + 32,47,42,118,111,105,100,32,108,105,115,116,66,111,120,73,116,101,109,67,108,105,99,107,101,100,32,40,105,110,116,32,114,111,119,44,32,99,111,110, + 115,116,32,77,111,117,115,101,69,118,101,110,116,38,32,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,80,111,112,117,112,77, + 101,110,117,32,109,59,13,10,32,32,32,32,32,32,32,32,109,46,97,100,100,73,116,101,109,32,40,49,44,32,34,115,100,102,115,100,102,115,34,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,109,46,115,104,111,119,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,65,108,101,114, + 116,87,105,110,100,111,119,58,58,115,104,111,119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,73,110, + 102,111,73,99,111,110,44,32,34,97,115,100,102,115,97,100,102,97,100,115,34,44,32,34,115,114,100,102,115,100,102,97,34,41,59,13,10,32,32,32, + 32,32,32,32,32,68,111,99,117,109,101,110,116,87,105,110,100,111,119,42,32,100,119,32,61,32,110,101,119,32,68,111,99,117,109,101,110,116,87,105, + 110,100,111,119,32,40,34,115,102,100,115,100,34,44,32,67,111,108,111,117,114,115,58,58,119,104,105,116,101,44,32,68,111,99,117,109,101,110,116,87, + 105,110,100,111,119,58,58,97,108,108,66,117,116,116,111,110,115,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,100,119,45,62,115, + 101,116,66,111,117,110,100,115,32,40,49,48,48,44,32,49,48,48,44,32,53,48,48,44,32,53,48,48,41,59,13,10,32,32,32,32,32,32,32,32, + 100,119,45,62,115,101,116,86,105,115,105,98,108,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,125,42,47,13,10,125,59,13,10,13,10,13, + 10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,13,10,47,47,32,97,110,100,32,116,104,105,115,32,105,115,32,97,32,99,111,109,112,111,110,101,110,116,32,116,104,97,116,32,99,97,110,32,104, + 97,118,101,32,116,104,105,110,103,115,32,100,114,111,112,112,101,100,32,111,110,116,111,32,105,116,46,46,13,10,13,10,99,108,97,115,115,32,68,114, + 97,103,65,110,100,68,114,111,112,68,101,109,111,84,97,114,103,101,116,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32, + 68,114,97,103,65,110,100,68,114,111,112,84,97,114,103,101,116,13,10,123,13,10,32,32,32,32,98,111,111,108,32,115,111,109,101,116,104,105,110,103, + 73,115,66,101,105,110,103,68,114,97,103,103,101,100,79,118,101,114,59,13,10,32,32,32,32,83,116,114,105,110,103,32,109,101,115,115,97,103,101,59, + 13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,84,97, + 114,103,101,116,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,111,109,101,116,104,105,110,103,73,115,66,101,105,110,103,68, + 114,97,103,103,101,100,79,118,101,114,32,61,32,102,97,108,115,101,59,13,10,13,10,32,32,32,32,32,32,32,32,109,101,115,115,97,103,101,32,61, + 32,84,40,34,68,114,97,103,45,97,110,100,45,100,114,111,112,32,115,111,109,101,32,114,111,119,115,32,102,114,111,109,32,116,104,101,32,116,111,112, + 45,108,101,102,116,32,98,111,120,32,111,110,116,111,32,116,104,105,115,32,99,111,109,112,111,110,101,110,116,33,34,41,59,13,10,32,32,32,32,125, + 13,10,13,10,32,32,32,32,126,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,84,97,114,103,101,116,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115, + 38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58, + 58,103,114,101,101,110,46,119,105,116,104,65,108,112,104,97,32,40,48,46,50,102,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32, + 100,114,97,119,32,97,32,114,101,100,32,108,105,110,101,32,97,114,111,117,110,100,32,116,104,101,32,99,111,109,112,32,105,102,32,116,104,101,32,117, + 115,101,114,39,115,32,99,117,114,114,101,110,116,108,121,32,100,114,97,103,103,105,110,103,32,115,111,109,101,116,104,105,110,103,32,111,118,101,114,32, + 105,116,46,46,13,10,32,32,32,32,32,32,32,32,105,102,32,40,115,111,109,101,116,104,105,110,103,73,115,66,101,105,110,103,68,114,97,103,103,101, + 100,79,118,101,114,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111, + 117,114,32,40,67,111,108,111,117,114,115,58,58,114,101,100,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,82,101, + 99,116,32,40,48,44,32,48,44,32,103,101,116,87,105,100,116,104,40,41,44,32,103,101,116,72,101,105,103,104,116,40,41,44,32,51,41,59,13,10, + 32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114, + 115,58,58,98,108,97,99,107,41,59,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40,49,52,46,48,102,41,59,13,10, + 32,32,32,32,32,32,32,32,103,46,100,114,97,119,70,105,116,116,101,100,84,101,120,116,32,40,109,101,115,115,97,103,101,44,32,49,48,44,32,48, + 44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,50,48,44,32,103,101,116,72,101,105,103,104,116,40,41,44,32,74,117,115,116,105,102,105,99, + 97,116,105,111,110,58,58,99,101,110,116,114,101,100,44,32,52,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32, + 98,111,111,108,32,105,115,73,110,116,101,114,101,115,116,101,100,73,110,68,114,97,103,83,111,117,114,99,101,32,40,99,111,110,115,116,32,83,116,114, + 105,110,103,38,32,115,111,117,114,99,101,68,101,115,99,114,105,112,116,105,111,110,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 47,47,32,110,111,114,109,97,108,108,121,32,121,111,117,39,100,32,99,104,101,99,107,32,116,104,101,32,115,111,117,114,99,101,68,101,115,99,114,105, + 112,116,105,111,110,32,118,97,108,117,101,32,116,111,32,115,101,101,32,105,102,32,105,116,39,115,32,116,104,101,13,10,32,32,32,32,32,32,32,32, + 47,47,32,115,111,114,116,32,111,102,32,111,98,106,101,99,116,32,116,104,97,116,32,121,111,117,39,114,101,32,105,110,116,101,114,101,115,116,101,100, + 32,105,110,32,98,101,102,111,114,101,32,114,101,116,117,114,110,105,110,103,32,116,114,117,101,44,32,98,117,116,32,102,111,114,13,10,32,32,32,32, + 32,32,32,32,47,47,32,116,104,101,32,100,101,109,111,44,32,119,101,39,108,108,32,115,97,121,32,121,101,115,32,116,111,32,97,110,121,116,104,105, + 110,103,46,46,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32, + 32,118,111,105,100,32,105,116,101,109,68,114,97,103,69,110,116,101,114,32,40,99,111,110,115,116,32,83,116,114,105,110,103,38,32,115,111,117,114,99, + 101,68,101,115,99,114,105,112,116,105,111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67, + 111,109,112,111,110,101,110,116,42,32,115,111,117,114,99,101,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,120,44,32,105,110,116,32,121,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,115,111,109,101,116,104,105,110,103,73,115,66,101,105,110,103,68,114,97,103,103,101,100,79,118,101,114,32,61,32,116,114,117,101,59,13,10,32, + 32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,105,116,101, + 109,68,114,97,103,77,111,118,101,32,40,99,111,110,115,116,32,83,116,114,105,110,103,38,32,115,111,117,114,99,101,68,101,115,99,114,105,112,116,105, + 111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,115, + 111,117,114,99,101,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 105,110,116,32,120,44,32,105,110,116,32,121,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32, + 105,116,101,109,68,114,97,103,69,120,105,116,32,40,99,111,110,115,116,32,83,116,114,105,110,103,38,32,115,111,117,114,99,101,68,101,115,99,114,105, + 112,116,105,111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,109,112,111,110,101,110,116, + 42,32,115,111,117,114,99,101,67,111,109,112,111,110,101,110,116,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,111,109,101,116, + 104,105,110,103,73,115,66,101,105,110,103,68,114,97,103,103,101,100,79,118,101,114,32,61,32,102,97,108,115,101,59,13,10,32,32,32,32,32,32,32, + 32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,105,116,101,109,68,114,111,112,112, + 101,100,32,40,99,111,110,115,116,32,83,116,114,105,110,103,38,32,115,111,117,114,99,101,68,101,115,99,114,105,112,116,105,111,110,44,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,115,111,117,114,99,101,67,111,109, + 112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,120,44,32,105,110, + 116,32,121,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,109,101,115,115,97,103,101,32,61,32,84,40,34,108,97,115,116,32,114, + 111,119,115,32,100,114,111,112,112,101,100,58,32,34,41,32,43,32,115,111,117,114,99,101,68,101,115,99,114,105,112,116,105,111,110,59,13,10,13,10, + 32,32,32,32,32,32,32,32,115,111,109,101,116,104,105,110,103,73,115,66,101,105,110,103,68,114,97,103,103,101,100,79,118,101,114,32,61,32,102,97, + 108,115,101,59,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,13, + 10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,13,10,99,108,97,115,115,32,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111, + 110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,68, + 114,97,103,65,110,100,68,114,111,112,67,111,110,116,97,105,110,101,114,13,10,123,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,68,114,97,103,65,110, + 100,68,114,111,112,68,101,109,111,83,111,117,114,99,101,42,32,115,111,117,114,99,101,59,13,10,32,32,32,32,68,114,97,103,65,110,100,68,114,111, + 112,68,101,109,111,84,97,114,103,101,116,42,32,116,97,114,103,101,116,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32, + 32,32,32,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,116, + 78,97,109,101,32,40,84,40,34,68,114,97,103,45,97,110,100,45,68,114,111,112,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,111, + 117,114,99,101,32,61,32,110,101,119,32,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,83,111,117,114,99,101,40,41,59,13,10,32,32,32, + 32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,115,111,117,114,99,101,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,116,97,114,103,101,116,32,61,32,110,101,119,32,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,84,97,114,103,101,116,40,41, + 59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116,97,114,103,101,116,41,59,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10, + 32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32, + 32,32,32,118,111,105,100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,111,117,114,99,101, + 45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,49,48,44,32,50,53,48,44,32,49,53,48,41,59,13,10,32,32,32,32,32,32,32, + 32,116,97,114,103,101,116,45,62,115,101,116,66,111,117,110,100,115,32,40,103,101,116,87,105,100,116,104,40,41,32,45,32,50,54,48,44,32,103,101, + 116,72,101,105,103,104,116,40,41,32,45,32,49,54,48,44,32,50,53,48,44,32,49,53,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32, + 32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,32,32,32,32,47,47,32,40,110,101,101,100,32,116,111,32,112,117,116,32,116,104,105,115,32,105,110,32,116,111,32,100,105,115,97,109, + 98,105,103,117,97,116,101,32,116,104,101,32,110,101,119,47,100,101,108,101,116,101,32,111,112,101,114,97,116,111,114,115,32,117,115,101,100,32,105,110, + 32,116,104,101,13,10,32,32,32,32,47,47,32,116,119,111,32,98,97,115,101,32,99,108,97,115,115,101,115,41,46,13,10,32,32,32,32,106,117,99, + 101,95,85,115,101,68,101,98,117,103,103,105,110,103,78,101,119,79,112,101,114,97,116,111,114,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109, + 112,111,110,101,110,116,42,32,99,114,101,97,116,101,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32, + 114,101,116,117,114,110,32,110,101,119,32,68,114,97,103,65,110,100,68,114,111,112,68,101,109,111,40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::draganddropdemo_cpp = (const char*) temp4; + +static const unsigned char temp5[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,99,108,97,115,115,32,70,111,110,116,115,65,110,100,84,101,120,116,68,101,109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109, + 112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105, + 99,32,76,105,115,116,66,111,120,77,111,100,101,108,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,112,117,98,108,105,99,32,66,117,116,116,111,110,76,105,115,116,101,110,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,83,108,105,100,101,114,76,105,115,116,101,110,101,114,13,10,123,13,10,32, + 32,32,32,79,119,110,101,100,65,114,114,97,121,32,60,70,111,110,116,62,32,102,111,110,116,115,59,13,10,32,32,32,32,76,105,115,116,66,111,120, + 42,32,108,105,115,116,66,111,120,59,13,10,32,32,32,32,84,101,120,116,69,100,105,116,111,114,42,32,116,101,120,116,66,111,120,59,13,10,32,32, + 32,32,84,111,103,103,108,101,66,117,116,116,111,110,42,32,98,111,108,100,66,117,116,116,111,110,59,13,10,32,32,32,32,84,111,103,103,108,101,66, + 117,116,116,111,110,42,32,105,116,97,108,105,99,66,117,116,116,111,110,59,13,10,32,32,32,32,83,108,105,100,101,114,42,32,115,105,122,101,83,108, + 105,100,101,114,59,13,10,13,10,32,32,32,32,83,116,114,101,116,99,104,97,98,108,101,76,97,121,111,117,116,77,97,110,97,103,101,114,32,118,101, + 114,116,105,99,97,108,76,97,121,111,117,116,59,13,10,32,32,32,32,83,116,114,101,116,99,104,97,98,108,101,76,97,121,111,117,116,77,97,110,97, + 103,101,114,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,59,13,10,13,10,32,32,32,32,83,116,114,101,116,99,104,97,98,108,101, + 76,97,121,111,117,116,82,101,115,105,122,101,114,66,97,114,42,32,118,101,114,116,105,99,97,108,68,105,118,105,100,101,114,66,97,114,59,13,10,32, + 32,32,32,83,116,114,101,116,99,104,97,98,108,101,76,97,121,111,117,116,82,101,115,105,122,101,114,66,97,114,42,32,104,111,114,105,122,111,110,116, + 97,108,68,105,118,105,100,101,114,66,97,114,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,70,111,110,116, + 115,65,110,100,84,101,120,116,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40, + 84,40,34,70,111,110,116,115,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,70,111,110,116,58,58,102,105,110,100,70,111,110,116,115,32, + 40,102,111,110,116,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,108, + 105,115,116,66,111,120,32,61,32,110,101,119,32,76,105,115,116,66,111,120,32,40,84,40,34,102,111,110,116,115,34,41,44,32,116,104,105,115,41,41, + 59,13,10,32,32,32,32,32,32,32,32,108,105,115,116,66,111,120,45,62,115,101,116,82,111,119,72,101,105,103,104,116,32,40,50,56,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116,101,120,116,66,111,120,32,61,32,110, + 101,119,32,84,101,120,116,69,100,105,116,111,114,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,116,101,120,116,66,111,120,45,62,115,101, + 116,67,111,108,111,117,114,32,40,84,101,120,116,69,100,105,116,111,114,58,58,98,97,99,107,103,114,111,117,110,100,67,111,108,111,117,114,73,100,44, + 32,67,111,108,111,117,114,115,58,58,119,104,105,116,101,41,59,13,10,32,32,32,32,32,32,32,32,116,101,120,116,66,111,120,45,62,115,101,116,67, + 111,108,111,117,114,32,40,84,101,120,116,69,100,105,116,111,114,58,58,111,117,116,108,105,110,101,67,111,108,111,117,114,73,100,44,32,67,111,108,111, + 117,114,115,58,58,98,108,97,99,107,46,119,105,116,104,65,108,112,104,97,32,40,48,46,53,102,41,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,116,101,120,116,66,111,120,45,62,115,101,116,77,117,108,116,105,76,105,110,101,32,40,116,114,117,101,44,32,116,114,117,101,41,59,13,10,32,32, + 32,32,32,32,32,32,116,101,120,116,66,111,120,45,62,115,101,116,82,101,116,117,114,110,75,101,121,83,116,97,114,116,115,78,101,119,76,105,110,101, + 32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,116,101,120,116,66,111,120,45,62,115,101,116,84,101,120,116,32,40,84,40,34,84, + 104,101,32,81,117,105,99,107,32,66,114,111,119,110,32,70,111,120,32,74,117,109,112,101,100,32,79,118,101,114,32,84,104,101,32,76,97,122,121,32, + 68,111,103,92,110,92,110,65,97,32,66,98,32,67,99,32,68,100,32,69,101,32,70,102,32,71,103,32,72,104,32,73,105,32,74,106,32,75,107,32, + 76,108,32,77,109,32,78,110,32,79,111,32,80,112,32,81,113,32,82,114,32,83,115,32,84,116,32,85,117,32,86,118,32,87,119,32,88,120,32,89, + 121,32,90,122,32,48,49,50,51,52,53,54,55,56,57,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107, + 101,86,105,115,105,98,108,101,32,40,98,111,108,100,66,117,116,116,111,110,32,61,32,110,101,119,32,84,111,103,103,108,101,66,117,116,116,111,110,32, + 40,84,40,34,98,111,108,100,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,98,111,108,100,66,117,116,116,111,110,45,62,97,100,100,66,117, + 116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97, + 107,101,86,105,115,105,98,108,101,32,40,105,116,97,108,105,99,66,117,116,116,111,110,32,61,32,110,101,119,32,84,111,103,103,108,101,66,117,116,116, + 111,110,32,40,84,40,34,105,116,97,108,105,99,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,105,116,97,108,105,99,66,117,116,116,111,110, + 45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97, + 100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,115,105,122,101,83,108,105,100,101,114,32,61,32,110,101,119,32,83,108,105,100,101, + 114,32,40,84,40,34,115,105,122,101,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,115,105,122,101,83,108,105,100,101,114,45,62,115,101,116, + 82,97,110,103,101,32,40,51,46,48,44,32,53,48,46,48,44,32,48,46,49,41,59,13,10,32,32,32,32,32,32,32,32,115,105,122,101,83,108,105, + 100,101,114,45,62,115,101,116,86,97,108,117,101,32,40,50,48,46,48,41,59,13,10,32,32,32,32,32,32,32,32,115,105,122,101,83,108,105,100,101, + 114,45,62,97,100,100,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,108,105,115,116,66,111, + 120,45,62,115,101,108,101,99,116,82,111,119,32,40,48,41,59,13,10,32,32,32,32,32,32,32,32,108,105,115,116,66,111,120,45,62,115,101,116,67, + 111,108,111,117,114,32,40,76,105,115,116,66,111,120,58,58,111,117,116,108,105,110,101,67,111,108,111,117,114,73,100,44,32,67,111,108,111,117,114,115, + 58,58,98,108,97,99,107,46,119,105,116,104,65,108,112,104,97,32,40,48,46,53,102,41,41,59,13,10,32,32,32,32,32,32,32,32,108,105,115,116, + 66,111,120,45,62,115,101,116,79,117,116,108,105,110,101,84,104,105,99,107,110,101,115,115,32,40,49,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,47,47,32,115,101,116,32,117,112,32,116,104,101,32,108,97,121,111,117,116,32,97,110,100,32,114,101,115,105,122,101,114,32,98,97,114,115,46,46, + 13,10,13,10,32,32,32,32,32,32,32,32,118,101,114,116,105,99,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116, + 32,40,48,44,32,45,48,46,50,44,32,45,48,46,56,44,32,45,48,46,53,41,59,32,32,47,47,32,119,105,100,116,104,32,111,102,32,116,104,101, + 32,102,111,110,116,32,108,105,115,116,32,109,117,115,116,32,98,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,47,47,32,98,101,116,119,101,101,110,32,50,48,37,32,97,110,100,32,56,48,37,44,32,112,114,101,102,101,114,97,98,108,121,32,53,48,37,13, + 10,32,32,32,32,32,32,32,32,118,101,114,116,105,99,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,49, + 44,32,56,44,32,56,44,32,56,41,59,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,118,101,114,116,105,99,97,108,32,100,105, + 118,105,100,101,114,32,100,114,97,103,45,98,97,114,32,116,104,105,110,103,32,105,115,32,97,108,119,97,121,115,32,56,32,112,105,120,101,108,115,32, + 119,105,100,101,13,10,32,32,32,32,32,32,32,32,118,101,114,116,105,99,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111, + 117,116,32,40,50,44,32,49,53,48,44,32,45,49,46,48,44,32,45,48,46,53,41,59,32,32,32,47,47,32,116,104,101,32,99,111,109,112,111,110, + 101,110,116,115,32,111,110,32,116,104,101,32,114,105,103,104,116,32,109,117,115,116,32,98,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,47,47,32,97,116,32,108,101,97,115,116,32,49,53,48,32,112,105,120,101,108,115,32,119,105,100,101,44,32,112,114,101, + 102,101,114,97,98,108,121,32,53,48,37,32,111,102,32,116,104,101,32,116,111,116,97,108,32,119,105,100,116,104,13,10,13,10,32,32,32,32,32,32, + 32,32,118,101,114,116,105,99,97,108,68,105,118,105,100,101,114,66,97,114,32,61,32,110,101,119,32,83,116,114,101,116,99,104,97,98,108,101,76,97, + 121,111,117,116,82,101,115,105,122,101,114,66,97,114,32,40,38,118,101,114,116,105,99,97,108,76,97,121,111,117,116,44,32,49,44,32,116,114,117,101, + 41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,118,101,114,116,105,99,97,108,68, + 105,118,105,100,101,114,66,97,114,41,59,13,10,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46, + 115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,48,44,32,45,48,46,50,44,32,45,49,46,48,44,32,45,48,46,52,41,59,32,32,47,47, + 32,104,101,105,103,104,116,32,111,102,32,116,104,101,32,102,111,110,116,32,116,101,120,116,32,98,111,120,32,109,117,115,116,32,98,101,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,98,101,116,119,101,101,110,32,50,48,37,32,97,110,100,32, + 49,48,48,37,44,32,112,114,101,102,101,114,97,98,108,121,32,52,48,37,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108, + 76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,49,44,32,56,44,32,56,44,32,56,41,59,32,32,32,32,32,32, + 32,32,32,32,32,47,47,32,116,104,101,32,104,111,114,105,122,111,110,116,97,108,32,100,105,118,105,100,101,114,32,100,114,97,103,45,98,97,114,32, + 116,104,105,110,103,32,105,115,32,97,108,119,97,121,115,32,56,32,112,105,120,101,108,115,32,104,105,103,104,13,10,32,32,32,32,32,32,32,32,104, + 111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,50,44,32,50,44,32,53,44,32, + 53,41,59,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,32,103,97,112,32,98,101,116,119,101,101,110,32,116,104,101,32,99,111,110,116,114, + 111,108,115,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121, + 111,117,116,32,40,51,44,32,49,53,44,32,50,48,44,32,50,48,41,59,32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,105,116,97,108,105, + 99,32,98,117,116,116,111,110,32,119,111,117,108,100,32,108,105,107,101,32,116,111,32,98,101,32,50,48,32,112,105,120,101,108,115,32,104,105,103,104, + 13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116, + 32,40,52,44,32,50,44,32,53,44,32,53,41,59,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,32,103,97,112,32,98,101,116,119,101,101, + 110,32,116,104,101,32,99,111,110,116,114,111,108,115,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116, + 46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,53,44,32,49,53,44,32,50,48,44,32,50,48,41,59,32,32,32,32,32,32,32,32,47, + 47,32,116,104,101,32,98,111,108,100,32,98,117,116,116,111,110,32,119,111,117,108,100,32,108,105,107,101,32,116,111,32,98,101,32,50,48,32,112,105, + 120,101,108,115,32,104,105,103,104,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46,115,101,116,73, + 116,101,109,76,97,121,111,117,116,32,40,54,44,32,50,44,32,53,44,32,53,41,59,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,32,103, + 97,112,32,98,101,116,119,101,101,110,32,116,104,101,32,99,111,110,116,114,111,108,115,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110, + 116,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,55,44,32,49,53,44,32,50,48,44,32,50,48,41,59, + 32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,105,116,97,108,105,99,32,98,117,116,116,111,110,32,119,111,117,108,100,32,108,105,107,101,32, + 116,111,32,98,101,32,50,48,32,112,105,120,101,108,115,32,104,105,103,104,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108, + 76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,56,44,32,50,44,32,53,44,32,53,41,59,32,32,32,32,32,32, + 32,32,32,32,32,47,47,32,97,32,103,97,112,32,98,101,116,119,101,101,110,32,116,104,101,32,99,111,110,116,114,111,108,115,13,10,32,32,32,32, + 32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,57,44,32,49, + 53,44,32,50,48,44,32,50,48,41,59,32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,99,111,112,121,32,99,111,100,101,32,98,117,116,116, + 111,110,32,119,111,117,108,100,32,108,105,107,101,32,116,111,32,98,101,32,50,48,32,112,105,120,101,108,115,32,104,105,103,104,13,10,32,32,32,32, + 32,32,32,32,104,111,114,105,122,111,110,116,97,108,76,97,121,111,117,116,46,115,101,116,73,116,101,109,76,97,121,111,117,116,32,40,49,48,44,32, + 53,44,32,45,49,46,48,44,32,53,41,59,32,32,32,32,32,32,32,32,47,47,32,97,100,100,32,97,32,103,97,112,32,97,116,32,116,104,101,32, + 98,111,116,116,111,109,32,116,104,97,116,32,119,105,108,108,32,102,105,108,108,32,117,112,32,97,110,121,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,115,112,97,99,101,32,108,101,102,116,32,111,118,101,114,32,45,32,116,104,105,115,32,119, + 105,108,108,32,115,116,111,112,32,116,104,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32, + 115,108,105,100,101,114,115,32,102,114,111,109,32,97,108,119,97,121,115,32,115,116,105,99,107,105,110,103,32,116,111,32,116,104,101,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,98,111,116,116,111,109,32,111,102,32,116,104,101,32,119,105,110, + 100,111,119,13,10,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108,68,105,118,105,100,101,114,66,97,114,32,61,32,110,101, + 119,32,83,116,114,101,116,99,104,97,98,108,101,76,97,121,111,117,116,82,101,115,105,122,101,114,66,97,114,32,40,38,104,111,114,105,122,111,110,116, + 97,108,76,97,121,111,117,116,44,32,49,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101, + 86,105,115,105,98,108,101,32,40,104,111,114,105,122,111,110,116,97,108,68,105,118,105,100,101,114,66,97,114,41,59,13,10,32,32,32,32,125,13,10, + 13,10,32,32,32,32,126,70,111,110,116,115,65,110,100,84,101,120,116,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105, + 100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,108,97,121,32,111,117,116,32,116, + 104,101,32,108,105,115,116,32,98,111,120,32,97,110,100,32,118,101,114,116,105,99,97,108,32,100,105,118,105,100,101,114,46,46,13,10,32,32,32,32, + 32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,118,99,111,109,112,115,91,93,32,61,32,123,32,108,105,115,116,66,111,120,44,32,118,101,114, + 116,105,99,97,108,68,105,118,105,100,101,114,66,97,114,44,32,48,32,125,59,13,10,13,10,32,32,32,32,32,32,32,32,118,101,114,116,105,99,97, + 108,76,97,121,111,117,116,46,108,97,121,79,117,116,67,111,109,112,111,110,101,110,116,115,32,40,118,99,111,109,112,115,44,32,51,44,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,52, + 44,32,52,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,56,44,32,103,101,116,72,101,105,103,104,116,40,41,32,45,32,56,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 102,97,108,115,101,44,32,32,32,32,32,47,47,32,108,97,121,32,111,117,116,32,115,105,100,101,45,98,121,45,115,105,100,101,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117, + 101,41,59,32,32,32,32,32,47,47,32,114,101,115,105,122,101,32,116,104,101,32,99,111,109,112,111,110,101,110,116,115,39,32,104,101,105,103,104,116, + 115,32,97,115,32,119,101,108,108,32,97,115,32,119,105,100,116,104,115,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,110,111,119,32,108,97, + 121,32,111,117,116,32,116,104,101,32,116,101,120,116,32,98,111,120,32,97,110,100,32,116,104,101,32,99,111,110,116,114,111,108,115,32,98,101,108,111, + 119,32,105,116,46,46,13,10,32,32,32,32,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,104,99,111,109,112,115,91,93,32,61,32,123,32, + 116,101,120,116,66,111,120,44,32,104,111,114,105,122,111,110,116,97,108,68,105,118,105,100,101,114,66,97,114,44,32,48,44,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,111,108,100,66,117,116,116,111,110,44,32,48, + 44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,116,97,108,105, + 99,66,117,116,116,111,110,44,32,48,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,115,105,122,101,83,108,105,100,101,114,32,125,59,13,10,13,10,32,32,32,32,32,32,32,32,104,111,114,105,122,111,110,116,97,108, + 76,97,121,111,117,116,46,108,97,121,79,117,116,67,111,109,112,111,110,101,110,116,115,32,40,104,99,111,109,112,115,44,32,56,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 52,32,43,32,118,101,114,116,105,99,97,108,76,97,121,111,117,116,46,103,101,116,73,116,101,109,67,117,114,114,101,110,116,80,111,115,105,116,105,111, + 110,32,40,50,41,44,32,47,47,32,102,111,114,32,116,104,101,105,114,32,119,105,100,116,104,115,44,32,114,101,102,101,114,32,116,111,32,116,104,101, + 32,118,101,114,116,105,99,97,108,32,108,97,121,111,117,116,32,115,116,97,116,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,52,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,101,114,116,105,99, + 97,108,76,97,121,111,117,116,46,103,101,116,73,116,101,109,67,117,114,114,101,110,116,65,98,115,111,108,117,116,101,83,105,122,101,32,40,50,41,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,103,101,116,72,101,105,103,104,116,40,41,32,45,32,56,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,44,32,32,32,32,47,47,32,108,97, + 121,32,111,117,116,32,97,98,111,118,101,32,101,97,99,104,32,111,116,104,101,114,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,41,59,32,32,32,47,47,32,114, + 101,115,105,122,101,32,116,104,101,32,99,111,109,112,111,110,101,110,116,115,39,32,119,105,100,116,104,115,32,97,115,32,119,101,108,108,32,97,115,32, + 104,101,105,103,104,116,115,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32, + 76,105,115,116,66,111,120,77,111,100,101,108,32,109,101,116,104,111,100,13,10,32,32,32,32,105,110,116,32,103,101,116,78,117,109,82,111,119,115,40, + 41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,111,110,116,115,46,115,105,122,101,40,41,59,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,76,105,115,116,66,111,120,77,111, + 100,101,108,32,109,101,116,104,111,100,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,76,105,115,116,66,111,120,73,116,101,109,32,40,105, + 110,116,32,114,111,119,78,117,109,98,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,71,114,97,112,104,105,99,115,38,32,103,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,105,110,116,32,119,105,100,116,104,44,32,105,110,116,32,104,101,105,103,104,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,111,111,108,32,114,111,119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,105,102,32,40,114,111,119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58,58,108,105,103,104,116,98,108,117,101,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,105,102,32,40,102,111,110,116,115,32,91,114,111,119,78,117,109,98,101,114,93,32,33,61,32,48,41,13,10,32,32,32,32,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,70,111,110,116,32,102,111,110,116,32,40,42,102,111,110,116,115,32,91,114,111,119,78, + 117,109,98,101,114,93,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111,110,116,46,115,101,116,72,101,105,103,104,116,32,40,104,101, + 105,103,104,116,32,42,32,48,46,55,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40, + 102,111,110,116,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,84,101,120,116,32,40,102,111,110,116,46,103,101,116, + 84,121,112,101,102,97,99,101,78,97,109,101,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,52,44,32,48,44,32,119,105,100,116,104,32,45,32,52,44,32,104,101,105,103,104,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,99,101,110,116,114,101,100,76,101,102,116,44,32,116, + 114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,117,112,100,97, + 116,101,80,114,101,118,105,101,119,66,111,120,84,101,120,116,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,70,111,110,116,42, + 32,102,32,61,32,102,111,110,116,115,32,91,108,105,115,116,66,111,120,45,62,103,101,116,83,101,108,101,99,116,101,100,82,111,119,40,41,93,59,13, + 10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,102,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,70,111,110,116,32,102,111,110,116,32,40,42,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111, + 110,116,46,115,101,116,72,101,105,103,104,116,32,40,40,102,108,111,97,116,41,32,115,105,122,101,83,108,105,100,101,114,45,62,103,101,116,86,97,108, + 117,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111,110,116,46,115,101,116,66,111,108,100,32,40,98,111,108,100,66,117, + 116,116,111,110,45,62,103,101,116,84,111,103,103,108,101,83,116,97,116,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111, + 110,116,46,115,101,116,73,116,97,108,105,99,32,40,105,116,97,108,105,99,66,117,116,116,111,110,45,62,103,101,116,84,111,103,103,108,101,83,116,97, + 116,101,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,101,120,116,66,111,120,45,62,97,112,112,108,121,70,111,110,116, + 84,111,65,108,108,84,101,120,116,32,40,102,111,110,116,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32, + 32,32,32,118,111,105,100,32,115,101,108,101,99,116,101,100,82,111,119,115,67,104,97,110,103,101,100,32,40,105,110,116,32,108,97,115,116,82,111,119, + 115,101,108,101,99,116,101,100,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,117,112,100,97,116,101,80,114,101,118,105,101,119,66, + 111,120,84,101,120,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,98,117,116,116,111,110,67,108,105,99,107, + 101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,117,112,100,97, + 116,101,80,114,101,118,105,101,119,66,111,120,84,101,120,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,115, + 108,105,100,101,114,86,97,108,117,101,67,104,97,110,103,101,100,32,40,83,108,105,100,101,114,42,41,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,47,47,32,40,116,104,105,115,32,105,115,32,99,97,108,108,101,100,32,119,104,101,110,32,116,104,101,32,115,105,122,101,32,115,108,105, + 100,101,114,32,105,115,32,109,111,118,101,100,41,13,10,32,32,32,32,32,32,32,32,117,112,100,97,116,101,80,114,101,118,105,101,119,66,111,120,84, + 101,120,116,40,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97, + 116,101,70,111,110,116,115,65,110,100,84,101,120,116,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32, + 70,111,110,116,115,65,110,100,84,101,120,116,68,101,109,111,40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::fontsandtextdemo_cpp = (const char*) temp5; + +static const unsigned char temp6[] = {80,75,3,4,20,0,2,0,8,0,128,122,250,52,23,17,234,255,206,13,0,0,219,67,0,0,16,0,0,0,100,111,99,117,109,101,110,116,45,110, + 101,119,46,115,118,103,237,28,93,115,219,54,242,61,191,66,167,188,212,83,139,196,55,64,37,118,39,77,38,157,222,244,122,51,77,59,247,216,161,40, + 72,102,77,145,58,146,178,236,252,250,91,144,20,9,82,144,45,217,106,210,155,169,213,142,169,197,114,23,216,47,236,46,16,191,253,238,126,149,140,238, + 116,94,196,89,122,53,198,30,26,143,116,26,101,243,56,93,94,141,127,251,245,227,68,141,71,69,25,166,243,48,201,82,125,53,78,179,241,119,215,175, + 222,254,99,50,25,189,207,117,88,234,249,104,27,151,55,163,31,211,219,34,10,215,122,244,205,77,89,174,167,190,191,221,110,189,184,1,122,89,190,244, + 47,70,147,9,188,89,220,45,95,141,70,35,96,155,22,211,121,116,53,110,240,215,155,60,169,240,230,145,175,19,189,210,105,89,248,216,195,254,184,67, + 143,58,244,173,158,121,185,46,178,77,30,213,228,163,200,198,204,231,139,14,21,102,178,165,21,18,14,130,192,71,196,39,100,2,24,147,226,33,45,195, + 251,73,90,188,182,94,133,9,186,94,37,8,33,31,198,58,204,227,176,166,247,9,136,225,224,100,170,81,155,59,136,126,13,255,183,47,236,0,94,189, + 214,5,188,169,189,84,151,254,135,95,63,180,131,19,228,205,203,185,69,102,39,249,30,223,158,58,210,112,165,139,117,24,233,194,223,193,171,247,183,241, + 188,188,185,26,51,133,60,84,253,172,239,43,248,141,142,151,55,165,99,224,46,214,219,239,179,251,171,49,26,161,17,83,240,95,5,142,231,87,99,16, + 4,97,65,245,117,55,211,105,107,107,200,163,164,198,108,216,219,67,140,126,59,215,119,58,233,191,59,207,162,89,88,192,162,252,155,108,165,253,63,226, + 213,42,140,252,34,143,252,232,174,240,193,74,151,217,36,142,178,116,82,222,128,1,249,64,53,9,103,137,246,195,168,4,186,197,30,49,35,131,171,49, + 60,108,140,185,77,82,189,245,118,186,107,39,165,239,215,89,94,78,22,113,162,107,244,30,239,229,226,222,79,51,152,104,226,175,231,32,202,50,223,164, + 183,62,80,44,252,239,127,252,97,21,175,244,164,212,247,165,183,78,221,100,239,231,107,80,53,97,141,76,157,56,15,3,156,107,64,122,59,215,139,194, + 32,215,130,54,223,104,53,0,67,121,56,143,195,228,7,243,11,86,85,35,89,84,163,44,73,116,4,154,12,147,109,248,80,11,197,252,84,150,56,189, + 201,53,120,206,107,120,214,97,190,163,193,145,64,45,158,225,215,103,193,17,197,237,240,178,1,254,150,198,37,184,200,166,208,249,39,99,102,255,78,127, + 43,244,30,214,175,121,152,22,96,211,171,171,241,42,44,243,248,254,155,9,241,164,100,84,5,151,8,62,216,11,68,32,145,184,196,24,224,130,208,203, + 137,146,196,83,138,179,139,150,88,4,198,39,16,247,36,102,36,232,160,15,198,88,133,39,152,84,29,116,225,196,93,56,113,115,8,136,88,122,128,169, + 196,120,228,55,226,237,139,230,104,241,26,177,57,164,122,221,140,191,45,202,108,189,195,5,43,45,31,18,176,53,3,156,0,197,44,159,206,146,48,186, + 125,83,1,50,144,103,92,62,76,241,155,113,247,70,182,88,20,26,216,34,11,86,249,32,188,1,156,72,187,128,231,241,66,46,94,216,205,139,117,194, + 242,251,75,254,122,22,106,41,251,165,22,234,54,208,9,86,1,246,4,253,235,90,168,195,0,33,86,159,221,40,220,6,200,209,97,3,180,176,132,139, + 160,199,199,167,123,198,23,51,119,78,158,50,247,103,70,140,71,205,189,217,101,15,41,150,200,47,96,238,196,195,50,112,153,251,61,190,26,83,4,80, + 46,113,167,187,7,3,21,67,19,190,39,78,92,98,156,32,240,140,225,200,63,33,246,50,206,200,241,166,255,186,78,120,158,25,125,129,23,59,197,28, + 157,220,142,54,72,224,38,190,124,252,173,228,121,56,254,194,176,234,5,67,194,60,138,132,12,120,63,24,18,15,73,25,168,94,44,220,71,93,184,80, + 77,40,228,158,34,152,99,118,132,85,227,38,137,189,68,142,7,162,88,128,193,198,133,71,49,130,160,164,39,240,141,2,2,216,188,186,56,210,179,78, + 14,199,152,11,113,138,81,46,170,159,129,81,54,139,112,71,230,221,160,195,108,12,243,211,172,116,161,204,231,4,246,248,9,246,207,52,219,227,226,155, + 177,25,193,60,14,134,212,183,46,228,129,82,177,109,70,220,35,92,246,236,114,248,98,228,120,209,172,36,140,151,249,156,142,159,216,230,48,231,146,62, + 186,163,189,254,136,204,199,25,95,158,220,69,13,249,199,55,204,215,65,104,62,207,82,93,167,162,190,54,206,164,34,140,141,168,21,59,70,71,162,167, + 163,189,55,31,85,18,57,66,73,66,252,169,74,18,234,107,41,233,216,128,68,68,112,66,56,10,169,249,156,41,28,17,137,78,10,70,44,50,159,51, + 5,35,34,241,51,83,186,125,17,242,83,68,184,8,205,231,92,34,20,167,137,112,86,253,156,75,132,226,108,34,196,132,227,175,183,45,2,115,122,218, + 182,184,88,112,50,76,222,32,10,97,72,30,144,114,243,231,143,79,64,158,58,1,186,151,61,62,123,95,38,38,157,250,226,233,100,173,243,195,249,36, + 145,234,196,250,198,236,6,156,123,131,133,86,27,7,225,94,31,186,112,226,46,156,184,38,237,132,4,85,242,94,220,117,75,4,112,169,244,36,40,20, + 211,30,89,10,64,129,137,226,189,41,40,200,102,25,195,65,127,186,251,184,145,19,247,112,234,139,160,134,83,68,82,71,234,11,166,64,137,20,242,146, + 122,148,83,206,13,142,96,130,49,121,113,162,188,247,117,6,41,158,181,101,63,162,124,179,237,60,105,68,79,139,90,9,79,34,197,120,95,131,148,123, + 146,10,200,238,123,162,166,20,100,34,122,41,158,19,55,114,226,58,68,109,90,207,186,146,52,98,1,53,114,101,24,83,114,30,41,170,163,164,200,207, + 34,69,170,60,204,149,24,84,95,210,35,2,138,120,33,7,6,139,25,237,229,77,145,19,55,114,226,254,21,13,86,28,37,234,186,112,123,169,176,79, + 139,151,77,22,251,72,136,36,138,158,173,7,4,37,49,9,36,162,238,106,185,30,98,158,192,148,147,0,84,17,64,97,142,212,197,163,169,120,116,108, + 182,239,44,11,218,18,224,252,66,165,143,11,149,255,213,133,122,76,149,235,170,134,219,202,183,22,233,91,223,28,42,85,79,237,145,153,57,0,155,155, + 243,190,238,228,201,156,199,53,36,214,225,82,87,57,8,72,178,78,194,154,129,89,150,207,117,190,27,18,213,79,111,168,73,83,234,51,193,0,34,165, + 220,141,183,250,51,196,45,52,228,26,47,110,194,121,182,133,213,14,7,63,103,217,170,235,150,117,54,97,162,57,134,253,84,178,54,190,117,131,192,103, + 34,60,198,20,98,74,238,141,110,242,220,28,25,38,225,131,134,69,85,191,118,115,46,110,178,237,50,55,194,89,132,73,43,157,246,85,51,52,153,205, + 204,137,105,153,111,246,134,219,211,200,77,109,86,205,41,171,133,177,141,83,88,230,164,57,168,85,146,28,64,216,157,216,138,118,39,24,98,192,20,176, + 16,7,6,141,219,241,61,153,153,197,217,178,174,151,216,152,204,74,151,225,60,44,195,206,60,118,16,214,30,78,206,23,211,95,62,124,108,211,217,40, + 154,254,39,203,111,187,204,211,32,132,179,108,3,19,111,147,126,115,222,25,77,141,243,132,229,117,188,2,246,230,140,253,219,251,85,2,86,218,14,244, + 144,203,135,181,238,136,214,100,119,247,5,156,119,14,230,209,42,54,47,249,159,202,56,73,126,52,76,172,180,187,33,26,151,137,190,254,89,111,71,31, + 26,45,85,252,107,112,15,51,50,119,35,178,252,218,154,130,89,234,187,101,155,53,239,211,253,103,120,187,153,141,62,149,26,54,151,220,69,216,56,229, + 62,145,10,115,143,159,33,91,175,246,186,89,108,125,98,237,173,54,69,28,221,132,73,226,69,159,171,87,27,172,87,246,60,147,56,210,105,241,180,0, + 43,182,241,29,184,253,106,149,165,69,37,203,230,221,194,159,61,76,138,208,39,30,242,237,250,197,111,52,110,91,192,79,67,118,150,17,156,200,169,191, + 142,181,206,65,171,197,147,235,112,221,38,249,69,175,243,108,190,169,174,14,244,45,225,133,132,63,196,5,196,255,217,198,73,56,215,255,221,196,240,198, + 179,40,255,156,149,32,146,243,210,124,87,30,158,236,139,164,160,243,248,174,82,169,177,134,226,188,147,254,116,19,230,250,93,18,223,234,161,233,53,166, + 214,246,199,186,112,244,214,223,5,171,234,219,114,16,248,146,112,166,147,171,241,167,42,238,141,187,8,215,11,253,86,144,207,54,235,85,54,215,13,194, + 46,252,45,95,245,11,247,121,92,172,1,97,26,167,38,165,236,101,30,75,142,72,151,224,149,142,115,57,44,56,230,68,79,72,115,52,199,20,236,100, + 212,124,103,20,50,9,41,46,25,241,132,226,52,184,232,250,39,57,100,65,157,76,205,38,135,57,228,204,144,97,219,77,227,251,10,206,3,72,8,136, + 221,171,110,111,1,73,5,9,183,196,118,15,179,217,144,48,165,129,57,7,231,131,118,130,97,204,176,171,243,221,117,41,24,34,72,96,197,223,216,7, + 179,11,136,199,83,136,212,223,188,222,63,229,188,168,70,173,51,185,234,107,190,73,244,52,205,210,207,144,90,188,1,103,203,110,171,175,186,121,174,183, + 78,64,110,190,26,178,160,181,41,232,44,157,219,192,63,178,56,157,130,133,235,252,205,42,204,111,117,94,83,169,159,39,69,25,230,101,15,178,138,231, + 189,239,58,157,247,248,86,164,146,24,126,77,217,14,54,15,97,43,205,115,176,1,27,211,64,235,254,204,20,237,96,221,34,239,226,34,158,197,137,249, + 82,61,38,250,77,223,144,222,100,119,58,95,36,217,118,55,110,187,193,58,44,111,44,29,180,201,29,88,171,217,0,33,231,136,224,103,160,61,243,18, + 71,220,214,55,64,255,53,154,16,12,218,198,74,154,35,97,99,72,10,81,53,122,127,0,110,65,161,108,243,4,135,178,216,13,4,10,18,10,120,198, + 120,192,0,172,60,206,145,18,35,211,128,145,10,51,113,73,32,167,133,220,76,242,29,140,170,75,165,60,115,16,73,57,188,222,65,39,224,13,92,18, + 138,200,104,2,197,187,224,156,81,107,86,226,192,92,63,143,94,96,169,251,215,79,254,182,212,23,91,234,11,117,64,241,223,58,56,82,7,67,39,111, + 183,130,129,147,59,225,22,212,114,114,23,208,80,144,8,54,50,34,184,229,228,19,28,32,40,124,57,225,150,151,91,64,219,205,45,176,237,231,88,50, + 40,102,49,151,61,63,119,78,183,231,231,93,168,235,109,109,7,131,100,215,25,95,214,57,196,178,151,60,236,242,131,189,50,170,201,38,190,15,93,245, + 225,32,117,120,245,72,194,176,171,170,172,77,61,55,133,155,135,25,200,69,117,221,181,170,115,92,117,198,172,86,149,185,105,230,9,68,57,39,221,106, + 219,45,30,121,1,65,44,232,154,46,205,6,79,153,167,234,126,247,171,193,246,142,33,213,232,154,12,205,140,251,151,90,14,185,103,213,215,28,250,103, + 123,106,113,208,79,15,80,18,23,3,231,109,41,29,229,196,61,168,237,134,67,50,182,227,13,199,246,87,241,178,168,240,136,27,207,146,12,34,223,193, + 72,218,55,15,115,83,187,49,15,235,154,67,254,224,4,155,155,54,30,87,52,24,152,13,120,176,16,136,211,125,179,161,202,3,100,170,246,205,198,92, + 36,227,74,73,135,217,8,235,246,230,97,179,169,196,112,30,11,17,234,111,11,177,45,100,217,171,60,136,57,126,119,84,30,213,99,18,150,230,100,163, + 238,178,95,78,168,39,3,21,80,83,118,88,85,198,178,139,157,229,51,27,159,129,144,72,97,120,32,140,5,210,58,58,105,77,164,50,138,221,121,239, + 169,118,241,186,175,11,151,14,7,251,194,18,51,134,236,6,131,187,229,124,124,107,120,216,221,70,253,145,182,111,139,130,160,55,178,107,126,15,230,216, + 239,169,15,70,14,18,115,156,123,48,235,110,164,227,204,185,119,62,204,24,27,247,135,142,185,41,115,232,182,204,211,220,196,211,220,152,52,159,3,220, + 112,191,209,224,188,32,227,200,61,187,204,0,230,160,122,180,171,12,137,80,143,17,85,157,72,97,168,189,37,60,65,114,98,67,185,135,24,5,40,193, + 158,218,193,204,93,88,2,48,40,63,20,231,125,24,84,48,210,83,10,15,48,133,71,20,233,40,14,97,29,111,27,10,238,16,8,131,105,40,214,48, + 20,120,224,85,125,222,45,236,189,61,203,22,106,175,198,80,28,194,118,188,123,9,149,165,161,54,177,238,171,224,92,94,212,156,103,32,114,154,23,73, + 167,23,185,137,157,230,69,28,29,239,69,156,124,73,47,226,236,235,123,17,23,143,121,145,104,140,169,239,69,162,113,34,219,139,170,11,229,21,172,179, + 228,14,102,123,145,133,217,250,70,71,209,130,89,188,45,104,227,68,182,23,241,198,53,108,222,29,204,246,162,14,106,173,166,113,34,228,92,247,41,94, + 212,148,29,14,137,183,242,230,92,162,97,89,23,120,65,0,133,14,10,46,9,60,66,89,68,4,76,186,131,82,83,98,115,78,17,192,4,145,80,78, + 96,3,147,18,68,194,1,6,69,22,60,217,176,247,35,229,73,130,20,83,212,130,170,230,108,158,52,20,41,194,22,204,230,221,131,178,64,129,167,85, + 20,49,146,10,25,24,166,152,7,210,226,221,193,222,91,179,180,49,173,53,178,32,192,132,56,215,237,234,246,28,170,85,204,209,250,197,113,189,3,103, + 90,113,176,195,97,107,75,30,214,22,134,250,87,72,44,251,218,2,40,196,37,170,108,109,129,89,18,5,97,204,214,86,7,179,181,213,65,59,29,116, + 20,123,176,150,119,15,138,48,5,6,150,182,192,77,234,28,209,230,221,194,108,109,217,152,214,106,128,34,228,125,206,117,159,168,45,126,14,109,181,78, + 214,83,154,187,51,208,43,113,106,141,10,217,133,248,74,159,176,135,114,100,250,21,151,28,12,147,17,41,196,232,39,11,202,32,40,32,164,172,203,80, + 246,66,247,107,33,112,55,190,151,244,234,59,13,19,155,31,72,122,235,210,7,234,124,5,193,139,226,189,22,215,108,83,150,7,58,92,71,148,62,214, + 229,67,44,57,163,138,91,55,9,159,41,67,54,144,33,105,238,78,130,12,17,65,28,115,102,100,216,66,205,57,8,85,196,234,110,156,65,134,237,5, + 211,99,202,199,115,137,144,32,48,125,69,113,123,59,99,233,60,165,58,208,60,106,27,81,236,64,35,42,213,219,99,250,76,78,173,25,141,93,141,195, + 60,122,94,231,135,200,103,244,125,28,253,89,200,229,204,59,228,40,13,252,95,214,239,251,30,65,56,182,250,109,59,133,184,239,186,118,195,206,139,172, + 237,176,105,16,117,87,90,247,135,31,92,195,149,55,138,160,1,143,90,242,163,119,163,22,217,122,130,103,248,140,24,130,61,160,174,61,142,123,193,197, + 225,243,35,103,164,224,207,138,146,128,56,59,13,205,144,249,87,94,12,41,101,254,225,46,100,136,28,11,235,146,213,145,127,6,224,30,140,39,76,127, + 7,77,251,230,239,15,20,126,26,110,202,56,217,20,126,1,85,75,64,125,200,172,163,219,223,193,203,38,144,81,238,254,24,192,232,224,31,4,160,20, + 210,73,2,123,239,65,188,135,1,158,21,22,222,154,203,49,215,175,254,7,80,75,3,4,20,0,0,0,8,0,96,128,249,52,242,213,5,70,140,20, + 0,0,25,120,0,0,17,0,0,0,100,111,99,117,109,101,110,116,45,111,112,101,110,46,115,118,103,237,93,109,115,219,56,146,254,158,95,161,83,190, + 236,212,74,20,222,95,156,56,91,83,158,154,171,185,202,237,86,237,204,212,125,188,162,37,218,214,70,150,116,164,20,219,243,235,239,105,232,133,160,8, + 217,146,237,100,61,113,172,157,138,244,16,4,192,70,119,227,105,160,193,125,255,183,219,235,73,231,115,81,86,227,217,244,180,203,51,214,237,20,211,225, + 108,52,158,94,158,118,127,255,237,231,190,235,118,170,69,62,29,229,147,217,180,56,237,78,103,221,191,125,120,243,254,63,250,253,206,89,89,228,139,98, + 212,185,25,47,174,58,191,76,63,85,195,124,94,116,254,114,181,88,204,79,6,131,155,155,155,108,188,6,179,89,121,57,248,161,211,239,227,206,234,243, + 229,155,78,167,131,102,167,213,201,104,120,218,93,151,159,47,203,73,40,55,26,14,138,73,113,93,76,23,213,128,103,124,208,173,139,15,235,226,55,197, + 121,86,22,213,108,89,14,87,213,15,135,113,201,114,116,81,23,69,79,110,100,40,196,189,247,3,38,6,66,244,81,162,95,221,77,23,249,109,127,90, + 189,141,110,69,7,83,183,10,198,216,0,215,234,146,135,149,58,185,157,64,12,123,59,19,174,198,173,67,244,115,252,183,189,97,3,100,171,103,189,192, + 157,69,54,45,22,131,159,126,251,105,123,177,207,178,209,98,20,85,179,145,124,163,221,198,112,76,243,235,162,154,231,195,162,26,108,240,112,255,205,120, + 180,184,58,237,42,151,177,240,55,191,13,240,85,49,190,188,90,180,241,241,232,180,139,231,245,54,252,218,244,231,100,171,81,44,147,98,85,112,221,72, + 124,73,201,191,142,138,207,197,164,121,239,104,54,60,207,43,116,125,112,53,187,46,6,255,26,95,95,231,195,65,85,14,7,195,207,213,0,186,120,57, + 235,143,135,179,105,127,113,5,53,25,160,214,73,126,62,41,6,249,112,129,122,171,86,101,244,164,167,93,124,89,146,82,245,103,243,98,154,109,134,104, + 219,171,226,118,62,43,23,253,139,241,164,88,149,111,52,126,59,190,30,231,211,255,205,203,197,128,90,174,32,189,229,98,60,89,86,131,106,58,187,25, + 45,167,144,226,229,20,55,244,47,170,254,104,92,22,195,197,172,188,235,231,195,97,49,95,100,243,105,186,177,219,209,28,227,236,217,90,162,201,50,119, + 59,101,62,160,208,251,81,113,81,81,225,149,248,233,151,12,23,112,169,204,71,227,124,242,159,244,15,30,118,85,40,170,117,56,155,76,208,185,211,110, + 62,185,201,239,86,178,162,191,160,134,39,87,101,1,179,121,139,239,69,94,110,234,208,204,176,109,57,106,175,217,132,102,146,111,47,95,174,193,223,167, + 227,5,236,99,89,21,229,175,164,99,255,152,254,94,21,173,82,191,149,249,180,130,66,95,159,118,175,243,69,57,190,253,75,95,100,214,42,233,124,143, + 225,195,51,111,188,101,166,199,57,112,35,100,175,239,172,200,156,211,234,135,109,101,195,219,211,174,97,58,179,92,9,95,163,119,164,170,38,51,202,186, + 26,189,72,150,189,72,150,45,225,13,185,205,80,210,153,110,103,176,22,111,83,52,7,139,151,196,150,144,234,135,245,245,247,213,98,54,223,148,133,242, + 46,238,38,208,64,2,251,168,113,86,158,156,79,242,225,167,119,1,152,65,158,227,197,221,9,127,215,173,239,152,93,92,84,5,154,101,17,22,44,19, + 119,160,37,177,125,128,199,181,197,82,109,241,116,91,170,22,214,160,249,200,255,62,13,141,6,251,169,26,154,86,208,62,119,158,103,70,190,92,13,77, + 40,160,114,79,82,192,164,82,164,21,80,179,253,10,24,149,50,169,10,51,221,61,222,50,190,154,186,107,241,144,186,63,210,99,220,171,238,24,185,251, + 6,86,216,175,160,238,34,227,214,167,212,253,150,159,118,37,3,170,45,175,199,238,142,80,179,171,194,183,34,89,86,144,17,248,140,20,199,30,175,217, + 194,248,125,138,189,25,56,97,89,82,215,88,52,19,239,83,152,183,185,164,207,142,206,109,110,189,71,247,234,198,121,74,191,14,107,92,13,233,243,96, + 227,95,205,247,146,176,247,187,94,39,164,122,54,93,100,80,63,39,172,236,109,198,169,254,2,9,40,99,156,233,41,149,73,163,52,252,48,60,35,99, + 150,219,166,31,118,153,19,74,113,207,26,126,88,102,86,27,46,156,110,248,225,118,217,139,100,89,248,97,105,129,114,203,229,35,180,85,63,172,173,230, + 9,218,122,145,211,231,120,109,77,41,190,163,207,33,52,164,225,180,55,143,1,101,112,7,88,135,73,90,199,253,15,57,28,209,103,239,52,240,213,92, + 51,13,230,254,161,134,0,76,195,77,10,157,57,219,244,145,156,101,70,232,134,131,68,41,209,116,142,146,53,238,123,170,97,241,150,61,69,134,133,65, + 115,112,249,91,164,111,225,239,153,246,48,172,231,103,197,92,58,37,14,103,37,111,215,90,252,56,98,76,141,169,163,12,32,213,220,193,100,129,154,51, + 143,84,201,150,160,188,53,230,8,57,25,238,213,240,252,145,114,66,91,247,216,109,162,53,43,252,197,240,226,128,214,82,98,242,214,178,231,146,18,63, + 134,226,190,189,8,127,59,163,155,113,169,152,96,102,143,159,107,187,224,237,112,43,127,148,208,210,173,51,205,181,50,210,167,197,119,95,243,250,217,164, + 40,165,126,162,20,163,249,230,56,33,74,105,158,67,136,251,27,191,79,132,82,218,103,83,68,34,189,71,76,180,140,62,143,117,107,214,223,19,110,61, + 101,90,79,122,53,235,249,179,73,9,2,127,234,88,91,134,185,201,89,119,180,185,222,199,77,190,180,166,113,233,191,62,87,33,179,190,103,44,244,51, + 240,11,90,154,45,64,47,148,224,90,218,30,141,142,84,102,39,86,228,62,227,220,224,127,13,30,36,92,230,149,97,170,214,57,162,66,40,171,16,113, + 136,58,168,32,58,164,17,152,114,192,15,179,239,39,136,139,223,27,116,243,104,241,226,233,116,76,75,45,188,79,208,49,144,67,205,165,244,61,153,41, + 205,21,119,61,145,41,229,112,105,71,166,42,115,222,75,235,155,50,69,72,164,189,81,178,73,47,17,227,99,146,81,166,33,83,197,51,39,141,243,250, + 139,202,84,218,123,101,234,158,81,166,202,64,67,34,30,107,50,207,224,41,93,209,23,36,86,60,172,73,72,188,41,86,16,113,163,225,240,84,67,172, + 220,101,86,104,103,154,98,117,153,224,66,8,197,154,170,42,136,222,59,29,249,204,231,143,201,121,188,196,210,14,202,185,126,190,229,80,120,53,168,190, + 212,177,228,56,147,156,233,94,112,120,154,139,40,116,112,8,206,189,210,36,243,102,88,46,12,238,50,214,214,234,16,194,114,151,113,175,121,36,238,139, + 100,217,139,100,89,10,203,5,34,39,208,87,255,37,149,56,80,241,251,38,53,110,196,215,9,213,152,16,28,46,1,58,198,52,228,220,235,243,76,10, + 201,132,105,106,177,160,165,59,18,203,206,226,92,134,121,211,123,191,235,28,152,209,50,218,226,9,241,39,181,192,148,255,162,114,93,197,130,247,199,138, + 110,247,193,196,206,138,163,109,69,211,152,66,108,51,154,38,103,121,112,52,189,122,224,247,3,218,116,11,223,182,59,141,180,109,56,250,60,46,110,222, + 108,59,76,219,152,235,122,231,249,101,17,168,3,158,115,197,29,214,23,206,103,229,168,40,55,151,76,248,107,92,90,179,139,213,230,252,155,166,88,169, + 214,237,117,150,190,94,93,229,163,217,13,164,179,123,241,143,217,236,186,38,117,245,80,221,6,107,18,6,2,182,173,139,119,65,168,210,57,201,218,119, + 46,203,146,118,88,39,249,93,129,135,9,255,108,156,98,117,53,187,185,44,73,40,23,249,100,43,149,237,173,116,169,127,126,62,67,219,139,114,217,186, + 188,221,188,93,174,6,101,189,249,28,149,184,25,79,241,148,253,245,238,53,175,215,192,119,75,108,54,178,241,0,123,74,160,15,202,155,61,23,105,28, + 182,254,115,123,145,158,46,150,245,234,25,215,186,114,93,44,242,81,190,200,107,189,216,32,106,187,107,59,186,56,249,231,79,63,111,233,231,112,120,242, + 63,179,242,83,205,20,169,64,126,62,91,162,227,91,138,76,27,193,195,19,114,15,249,226,195,248,26,205,83,230,193,95,111,175,39,80,207,237,133,70, + 225,197,221,188,168,43,93,85,187,201,162,72,102,98,140,134,215,99,186,105,240,235,98,60,153,252,66,141,68,52,121,93,233,120,49,41,62,252,60,155, + 64,89,59,191,12,103,211,206,143,97,223,59,244,98,117,177,81,30,79,94,124,16,152,27,250,140,247,37,15,197,2,214,40,53,164,236,146,89,249,33, + 234,46,137,229,199,203,45,39,110,247,225,191,242,79,203,243,206,175,139,2,142,162,76,53,79,150,219,174,36,148,108,181,71,173,77,198,195,98,90,61, + 44,178,112,243,248,51,44,252,250,122,54,173,130,244,214,247,86,131,243,187,126,149,15,224,50,7,45,209,173,170,249,176,174,101,149,108,144,93,47,171, + 241,240,42,159,76,178,225,31,161,107,235,82,77,33,22,213,176,28,207,41,227,225,195,143,67,106,155,210,116,22,69,167,223,185,185,42,166,29,74,100, + 168,58,121,89,116,206,33,141,203,206,168,204,47,47,139,81,103,49,203,86,2,143,238,111,84,60,95,158,79,198,213,85,113,156,228,255,62,251,92,76, + 38,189,206,47,211,97,118,164,224,91,13,134,146,164,254,177,57,124,220,29,137,200,34,142,28,132,230,16,207,139,18,42,94,61,56,196,169,132,163,127, + 22,243,114,54,90,134,188,147,230,216,62,177,226,159,198,21,166,251,243,101,178,226,178,248,191,229,24,119,60,170,230,191,207,22,16,201,243,214,249,227, + 98,127,103,159,36,133,162,28,127,14,67,74,218,80,61,111,167,127,189,130,113,252,56,25,127,138,133,17,84,111,173,106,155,112,60,242,205,239,7,27, + 207,29,126,93,214,30,61,204,117,173,9,113,146,159,23,147,211,238,202,53,182,167,188,217,114,126,61,27,21,235,187,55,211,197,101,186,146,127,204,139, + 105,119,167,65,249,96,157,235,135,152,231,139,171,141,148,106,194,130,114,228,219,49,159,14,195,95,133,63,252,179,101,66,235,101,143,230,226,55,28,203, + 228,4,51,196,95,222,182,162,138,31,194,197,104,13,41,252,44,151,147,2,109,77,255,0,149,121,7,181,158,125,42,78,222,234,156,62,235,159,171,89, + 27,229,215,63,137,231,225,113,78,240,48,211,81,12,254,107,54,158,174,209,235,188,252,84,148,84,111,177,254,222,135,255,43,23,13,228,122,60,106,252, + 46,166,235,223,235,58,161,153,69,57,25,227,159,19,181,193,70,57,38,243,176,102,115,194,54,88,253,68,159,199,213,248,124,60,161,31,225,235,164,120, + 55,26,87,115,8,251,100,60,165,46,190,131,35,44,47,38,179,155,205,245,6,131,165,113,16,50,34,155,192,254,187,163,64,82,25,19,78,247,192,187, + 16,224,35,164,234,156,17,106,56,194,82,160,62,99,150,43,219,209,25,231,86,33,238,39,72,121,238,133,2,166,37,88,191,116,17,246,177,3,54,111, + 140,149,202,68,232,89,7,204,141,57,206,121,140,2,83,90,50,235,234,102,8,226,92,216,168,59,168,81,81,82,10,98,129,30,167,5,10,110,133,163, + 26,209,75,124,83,154,80,78,55,41,194,4,46,27,219,163,205,44,132,216,162,35,101,230,152,84,222,213,208,199,142,0,161,117,12,223,107,240,172,35, + 88,166,156,215,210,212,32,24,187,179,12,145,9,65,120,86,97,28,97,8,1,17,239,244,64,231,37,83,78,121,212,136,72,92,91,37,184,71,116,175, + 132,50,204,145,32,129,42,4,43,232,143,206,60,183,82,50,71,24,40,34,67,200,175,17,251,59,7,174,219,225,54,68,139,144,89,141,161,151,136,161, + 132,226,206,69,40,234,204,208,53,163,188,136,239,135,88,140,113,214,244,40,66,245,161,155,232,15,186,166,9,210,194,163,195,168,49,53,220,127,116,234, + 80,170,97,172,43,19,140,182,35,184,52,248,200,119,9,171,220,108,188,28,108,133,219,253,172,216,10,215,241,164,52,47,198,28,243,178,132,125,197,37, + 191,152,145,6,123,148,153,148,206,48,168,17,84,2,193,175,114,118,101,0,202,57,101,120,141,182,108,27,193,62,175,151,129,210,158,246,165,13,180,80, + 175,118,160,53,6,26,214,39,96,137,241,64,3,166,77,20,91,163,169,129,142,146,50,142,26,232,116,217,68,3,210,239,237,173,78,246,86,239,246,246, + 187,82,125,29,165,218,14,244,229,142,228,155,55,54,6,249,82,51,81,47,111,45,18,153,119,28,115,131,22,97,125,122,149,124,199,164,83,156,126,43, + 129,9,90,211,148,111,50,47,165,21,63,212,251,102,148,123,94,19,226,187,211,110,159,107,154,73,141,139,115,114,110,3,174,61,102,60,33,35,124,155, + 230,111,93,38,181,229,46,186,182,89,91,145,32,10,38,222,61,90,47,50,163,97,133,233,181,157,169,83,235,223,106,43,221,233,119,113,238,101,205,40, + 219,137,140,135,83,202,120,128,143,226,147,65,111,190,25,21,220,241,54,251,233,254,206,232,209,77,154,233,120,188,131,211,233,11,162,90,156,88,205,74, + 145,192,227,136,0,165,241,8,149,194,130,220,48,197,211,32,106,176,38,179,74,105,175,0,131,184,105,16,170,14,23,58,179,14,60,179,39,2,19,100, + 86,111,48,168,187,3,147,211,74,200,192,234,182,104,95,73,208,44,90,232,238,244,65,52,141,214,74,70,189,50,123,250,10,202,245,120,77,109,103,152, + 127,215,212,39,107,234,19,199,64,242,239,99,112,36,11,218,24,249,118,42,216,49,242,36,30,161,145,145,167,64,170,193,50,204,100,130,162,216,173,145, + 247,185,103,8,130,136,201,212,86,30,129,177,153,71,112,108,231,8,131,53,162,76,109,27,118,158,236,110,195,206,107,87,215,152,218,246,58,201,58,43, + 227,242,200,165,148,97,88,75,105,19,59,33,29,107,242,58,68,139,150,91,205,29,197,131,136,52,141,165,88,221,100,130,246,81,109,64,65,205,24,227, + 192,24,138,34,110,37,204,75,237,32,76,77,115,187,84,171,114,78,10,165,36,88,97,10,61,35,6,105,181,166,60,233,186,78,157,33,228,183,214,135, + 146,154,118,16,77,88,103,48,24,128,128,1,177,206,135,72,24,131,231,48,2,8,102,93,112,220,33,96,207,152,198,176,114,66,181,84,8,251,25,48, + 161,164,210,1,147,10,33,49,231,192,180,150,22,209,112,132,125,164,152,91,50,169,37,7,42,224,184,133,38,173,1,234,64,100,185,14,168,32,46,28, + 34,118,37,188,161,157,123,68,240,22,178,33,140,59,9,86,12,204,90,97,164,229,171,120,191,133,98,2,64,60,110,153,234,249,112,92,65,106,214,9, + 201,36,136,205,21,173,43,40,203,172,18,171,30,161,114,208,165,158,13,61,134,7,90,245,200,160,81,71,40,195,45,120,188,176,94,96,33,49,5,12, + 100,221,75,131,185,138,210,10,72,96,17,6,142,142,126,112,8,89,71,232,25,80,4,147,10,126,43,66,37,85,169,140,167,146,36,37,60,59,133,163, + 12,223,52,97,6,156,76,57,170,19,146,113,232,136,17,209,184,125,76,234,82,100,0,15,172,232,181,242,47,118,29,234,54,193,233,24,199,138,46,73, + 197,185,222,117,176,231,203,197,98,143,127,77,120,200,109,211,9,159,184,123,173,221,223,167,57,236,123,60,236,249,100,134,73,105,127,68,240,184,208,79, + 237,172,16,10,168,0,220,154,36,85,217,70,126,116,194,193,57,90,215,106,133,169,95,63,240,99,153,15,127,78,188,202,192,239,113,195,204,91,195,108, + 181,149,52,204,97,141,117,19,225,195,81,120,35,184,170,209,23,16,225,243,215,57,208,219,8,63,125,80,219,170,204,133,213,211,238,190,114,183,7,150, + 59,254,36,250,178,42,188,76,28,67,223,158,63,167,191,246,66,3,6,84,42,133,89,172,145,194,165,180,8,41,69,171,75,125,204,144,12,44,130,242, + 13,141,228,158,71,57,156,97,49,3,92,129,239,42,229,74,231,214,137,178,13,157,99,153,118,68,110,156,59,88,249,146,83,65,195,9,119,143,9,128, + 43,250,36,120,33,158,67,236,178,99,197,17,104,106,171,36,184,3,104,166,116,134,120,15,161,180,79,225,123,152,126,17,165,64,82,132,97,84,189,20, + 192,104,83,198,49,67,152,52,224,178,44,96,2,204,132,17,151,2,43,163,196,170,128,10,230,16,234,16,151,66,85,187,40,48,48,33,207,13,48,112, + 8,144,58,190,239,110,159,145,79,81,10,168,50,138,41,3,238,64,71,8,208,62,98,231,204,91,207,113,153,48,239,188,16,150,158,135,58,164,60,177, + 145,4,186,126,242,192,154,64,165,133,119,50,41,141,84,40,29,241,129,71,177,232,148,191,140,150,170,214,11,245,28,143,230,53,60,163,110,248,75,144, + 41,40,112,141,190,128,137,209,191,206,21,209,239,123,28,255,246,61,14,142,72,205,210,158,175,108,236,26,32,236,19,34,66,147,6,23,57,245,47,178, + 199,193,119,246,56,48,45,26,204,13,20,161,242,198,214,155,71,192,15,94,36,95,16,3,122,93,59,164,47,204,162,95,151,240,119,211,69,36,73,217, + 246,48,227,199,54,226,152,112,42,66,147,155,138,250,11,91,116,116,164,99,221,91,101,132,215,26,253,106,110,166,27,41,184,49,53,250,221,162,95,169, + 69,191,38,153,239,152,134,208,218,88,58,197,165,155,121,38,134,89,47,107,52,185,68,244,200,60,147,195,13,89,238,246,150,33,140,225,30,189,149,141, + 222,130,129,115,198,107,244,5,24,242,235,226,123,47,197,144,95,165,240,119,2,82,167,133,163,247,37,137,38,125,229,220,41,81,131,73,42,108,15,54, + 232,111,121,17,106,179,250,116,196,226,19,119,90,30,191,248,228,31,181,246,244,5,214,156,208,125,253,101,214,156,182,75,78,209,138,83,114,193,233,192, + 245,166,111,99,185,233,59,189,252,250,142,81,100,158,54,148,185,236,113,185,179,82,199,44,20,149,223,187,10,113,184,103,124,228,186,162,222,117,227,38, + 156,174,247,61,238,155,189,85,86,112,93,163,47,128,234,188,210,125,152,151,97,209,175,152,234,136,76,11,37,40,27,100,99,12,235,124,14,71,111,109, + 148,53,154,12,94,30,105,209,187,3,45,189,0,87,80,58,53,208,169,140,6,58,50,222,206,105,120,82,154,88,50,139,225,207,53,222,123,114,24,154, + 46,81,81,238,80,143,131,202,138,144,210,18,78,7,217,144,137,18,114,140,44,165,180,108,191,134,98,155,210,141,31,103,205,159,168,55,254,30,181,17, + 205,242,181,230,56,245,80,214,61,72,214,65,202,195,15,212,25,122,105,223,225,121,133,137,196,68,122,7,230,15,143,81,162,63,87,170,225,33,74,164, + 100,24,96,145,41,175,20,147,148,146,6,200,217,48,163,74,75,171,147,97,65,193,211,187,107,40,90,98,66,56,235,233,64,26,72,165,34,157,227,116, + 175,9,57,89,41,52,188,80,177,39,69,38,233,29,133,174,245,27,13,134,217,91,88,79,217,198,180,2,19,78,174,25,3,63,210,193,55,202,73,204, + 232,96,151,166,99,116,173,14,39,148,18,227,251,160,78,30,232,208,146,58,25,70,231,224,217,42,231,244,249,174,110,164,110,92,103,138,134,207,32,88, + 18,10,74,69,126,203,215,63,19,67,105,31,55,49,253,73,227,240,125,30,180,10,110,52,145,187,170,24,111,138,88,103,22,225,153,209,42,156,30,53, + 218,123,27,242,76,157,19,140,217,128,66,166,48,77,202,93,117,206,33,120,15,103,79,241,13,46,222,96,2,247,130,131,45,212,24,13,81,102,153,53, + 54,2,207,8,196,189,154,210,29,183,168,98,25,252,3,66,71,194,224,10,16,26,2,82,92,59,181,106,89,40,29,114,105,129,194,61,8,181,154,158, + 164,100,50,4,155,12,205,32,216,164,83,152,20,37,7,76,50,68,152,161,156,208,156,51,187,114,81,86,27,171,209,52,38,43,169,141,178,29,101,137, + 100,82,39,57,69,186,74,32,208,77,97,103,132,210,105,88,230,9,181,134,210,59,9,99,156,73,180,67,39,86,53,23,30,152,201,108,244,243,35,57, + 35,10,191,181,139,208,51,66,33,77,220,27,161,28,140,87,224,153,36,117,208,104,60,128,130,104,61,151,82,123,65,135,216,156,116,146,219,85,90,176, + 197,61,82,71,195,245,49,57,136,237,164,209,99,39,206,240,226,163,35,142,132,75,101,116,174,154,158,107,127,86,225,183,75,187,158,18,203,194,129,249, + 150,15,132,198,18,33,119,177,23,212,116,16,92,137,26,60,106,180,191,79,73,79,29,207,205,128,201,221,148,38,46,233,141,179,202,154,158,160,119,207, + 58,19,142,81,112,16,24,3,47,226,105,79,8,54,47,65,101,120,248,63,156,224,68,79,60,37,115,56,23,60,129,226,136,113,66,90,7,29,154,96, + 171,163,82,152,95,148,183,156,136,144,87,58,220,77,219,174,202,48,248,7,182,126,133,96,71,36,176,64,179,90,168,34,226,228,66,219,32,79,96,107, + 140,119,20,122,6,215,163,37,245,156,129,47,169,144,164,156,120,158,182,111,217,159,130,222,226,222,137,20,244,226,115,1,179,216,68,221,169,160,109,115, + 211,252,246,8,189,219,29,251,214,11,60,95,38,217,219,187,46,244,237,154,216,174,199,227,74,130,125,208,177,14,120,183,53,165,0,21,192,36,184,193, + 18,158,211,61,50,215,105,239,145,138,196,88,62,172,188,73,35,208,187,241,227,126,125,190,239,212,90,98,156,94,232,169,138,61,43,80,239,162,61,28, + 33,44,125,118,2,76,48,79,16,79,39,41,200,51,8,253,24,37,219,194,255,33,54,4,199,139,208,179,36,74,218,17,156,20,29,166,7,59,36,2, + 104,51,184,91,41,233,128,20,190,10,199,108,120,1,8,248,44,189,158,214,70,40,180,76,115,6,218,24,56,151,133,11,20,1,3,223,148,44,194,194, + 70,14,244,205,59,31,161,240,169,136,86,200,75,211,11,255,21,109,120,37,159,39,17,130,202,232,133,184,199,174,138,28,74,44,220,238,68,165,64,222, + 93,96,187,98,107,102,46,28,215,210,126,131,125,109,86,177,119,89,246,219,245,125,47,96,170,81,238,245,136,123,151,172,25,225,153,112,180,102,185,177, + 1,68,94,150,222,152,186,193,82,182,244,69,147,240,80,255,142,91,36,107,20,204,88,216,165,217,246,51,172,122,57,181,129,190,155,234,203,53,213,100, + 30,195,211,78,183,127,187,82,110,104,190,9,235,183,208,245,176,61,1,102,72,153,179,106,181,6,204,185,55,156,108,152,212,159,102,44,154,96,97,43, + 61,177,57,178,65,43,192,34,172,32,199,16,95,65,100,251,42,64,103,29,190,222,211,64,176,67,117,152,204,88,7,110,161,105,145,70,88,78,161,80, + 220,147,228,42,114,244,206,238,135,2,139,117,98,67,235,85,129,173,215,255,189,217,182,17,126,183,94,1,188,126,183,32,58,128,209,90,189,188,241,61, + 189,68,246,195,155,255,7,80,75,3,4,20,0,2,0,8,0,96,125,250,52,34,86,64,46,27,23,0,0,165,116,0,0,17,0,0,0,100,111,99, + 117,109,101,110,116,45,115,97,118,101,46,115,118,103,236,92,89,115,227,200,145,126,159,95,193,229,188,76,135,69,176,238,67,125,56,198,61,97,135,55, + 218,187,17,158,153,216,103,136,132,36,186,41,82,6,169,150,186,127,253,126,89,0,137,2,88,36,33,81,125,120,162,41,143,155,76,20,234,200,252,42, + 175,74,224,213,159,31,110,230,131,15,69,185,154,45,23,175,135,60,99,195,65,177,152,44,167,179,197,213,235,225,239,191,253,117,228,134,131,213,58,95, + 76,243,249,114,81,188,30,46,150,195,63,191,249,225,213,127,141,70,131,183,101,145,175,139,233,224,126,182,190,30,252,125,241,126,53,201,111,139,193,79, + 215,235,245,237,249,120,124,127,127,159,205,106,98,182,44,175,198,47,6,163,17,238,92,125,184,250,97,48,24,96,216,197,234,124,58,121,61,172,219,223, + 222,149,243,208,110,58,25,23,243,226,166,88,172,87,99,158,241,241,176,105,62,105,154,223,23,23,89,89,172,150,119,229,164,234,126,50,137,91,150,211, + 203,166,41,102,114,47,67,35,238,189,31,51,49,22,98,132,22,163,213,199,197,58,127,24,45,86,63,70,183,98,130,169,91,5,99,108,140,107,77,203, + 126,173,206,31,230,96,195,222,201,132,171,241,232,96,253,45,254,219,222,176,33,100,213,90,47,113,103,145,45,138,245,248,151,223,126,217,94,28,177,108, + 186,158,70,221,108,56,223,26,183,37,142,69,126,83,172,110,243,73,177,26,111,232,225,254,77,151,231,211,229,132,218,188,30,226,203,29,137,99,180,202, + 63,20,217,102,113,113,187,139,124,133,118,227,235,229,77,49,254,215,236,230,38,159,140,87,229,100,60,249,176,26,3,58,87,203,209,108,178,92,140,214, + 215,144,234,24,35,205,243,139,121,49,206,39,107,96,110,21,58,219,204,224,124,139,68,150,41,249,167,105,241,161,152,183,71,139,26,72,81,221,59,125, + 61,196,164,132,231,50,252,190,46,102,87,215,235,215,67,229,216,237,67,160,220,207,166,235,235,152,240,97,86,220,255,101,249,128,78,6,108,160,28,254, + 23,200,111,240,127,175,166,197,229,138,126,84,29,211,47,57,124,19,8,175,202,124,58,203,231,127,163,127,192,142,170,81,52,247,201,114,62,47,38,24, + 57,159,223,231,31,171,133,209,39,136,248,252,186,44,0,201,31,241,189,200,203,77,31,154,25,182,109,71,227,181,135,208,76,242,237,229,171,154,248,251, + 98,182,6,246,238,86,69,249,43,201,239,127,23,191,175,138,157,86,191,149,249,98,5,176,220,188,30,222,228,235,114,246,240,211,72,100,214,42,233,252, + 25,195,31,207,188,241,150,153,51,206,65,55,66,158,141,156,21,153,115,90,189,216,118,54,1,139,12,211,153,229,74,248,134,250,145,120,105,50,163,172, + 107,168,151,201,182,151,201,182,37,52,13,183,25,90,58,51,28,140,107,246,182,89,211,155,189,196,182,4,87,223,212,215,95,173,214,203,219,77,91,0, + 105,253,113,14,172,18,113,132,30,151,229,249,197,60,159,188,127,25,8,75,240,115,182,254,120,206,95,14,155,59,150,151,151,171,2,195,178,136,22,48, + 135,59,48,146,216,46,224,105,99,177,212,88,60,61,150,106,152,53,110,47,249,235,33,52,18,246,169,8,77,3,116,196,157,231,153,145,223,46,66,19, + 0,132,70,121,118,80,164,1,168,217,126,0,70,173,76,170,195,76,15,31,191,51,190,24,220,181,56,6,247,39,106,140,131,112,175,109,193,62,193,10, + 251,5,224,46,50,110,125,10,238,15,252,245,80,50,80,181,229,141,236,62,18,213,116,33,252,32,146,109,5,109,2,159,17,112,236,103,208,189,198,11, + 221,31,250,63,10,166,114,103,159,168,125,49,150,125,12,28,147,163,245,6,36,70,243,159,9,144,41,54,50,254,8,54,74,101,116,174,158,204,70,38, + 31,197,198,212,104,143,96,35,211,95,140,141,202,251,199,176,241,50,124,158,200,70,140,245,56,54,166,70,235,205,70,140,166,191,188,55,16,248,185,223, + 27,192,101,219,50,205,66,102,74,89,102,109,203,52,155,76,105,107,172,210,45,211,188,219,246,50,217,150,76,179,207,224,120,233,62,78,47,207,36,71, + 183,28,122,53,99,204,72,46,138,145,8,63,132,240,70,209,15,52,145,70,8,126,166,76,134,127,152,59,27,169,204,51,239,156,125,209,83,217,63,218, + 67,16,220,53,235,220,43,145,35,102,29,157,248,35,224,236,15,242,163,78,132,224,158,31,1,103,127,144,127,113,195,222,102,248,142,60,184,133,115,253, + 92,134,157,101,158,43,206,21,144,165,184,176,158,23,35,78,134,61,254,181,109,51,146,153,51,206,120,160,14,14,1,131,122,20,29,123,47,51,166,189, + 103,166,101,239,133,205,164,71,7,182,101,239,17,203,25,161,164,180,45,123,15,170,118,210,26,255,25,236,189,51,136,128,250,235,60,22,62,79,212,176, + 24,75,61,74,195,166,70,235,173,97,49,154,249,242,26,54,240,115,191,134,197,101,215,214,176,42,131,104,185,48,45,13,43,161,54,5,34,123,219,214, + 176,59,109,47,147,109,73,195,106,120,147,202,74,219,3,238,164,88,233,115,54,178,153,227,70,25,91,140,100,208,177,92,10,197,124,248,133,88,67,26, + 75,105,6,157,57,111,189,129,30,166,29,98,50,103,37,51,159,79,209,106,173,143,234,81,173,237,231,215,163,137,46,10,67,127,157,46,106,110,166,67, + 64,248,237,213,103,152,90,134,225,61,212,184,54,50,217,179,213,59,61,247,93,117,51,229,71,173,158,211,223,163,86,239,20,199,174,140,84,117,107,93, + 186,207,234,117,202,100,110,135,125,150,197,63,206,168,237,58,173,194,170,19,157,86,150,9,173,16,66,120,151,230,227,126,16,97,112,115,178,23,123,80, + 138,252,240,232,238,249,216,24,225,228,169,46,22,58,49,143,87,13,123,172,220,81,116,98,52,247,120,23,107,143,149,123,54,54,234,231,96,163,54,95, + 206,83,197,104,238,43,123,170,9,54,42,117,156,75,202,244,220,174,41,117,170,232,239,241,154,57,26,221,61,93,53,78,37,253,125,126,213,40,205,51, + 128,81,186,199,131,177,8,159,167,128,81,177,199,131,49,53,218,115,178,81,184,30,92,98,79,7,227,69,248,156,2,70,41,158,14,70,127,73,127,159, + 29,140,220,29,223,210,220,157,176,165,157,164,191,19,184,200,221,9,91,58,37,67,118,34,23,19,81,196,154,190,206,243,117,129,184,217,122,184,45,242, + 76,226,139,231,142,189,104,133,177,82,103,194,113,161,89,43,228,69,80,99,28,249,174,237,116,248,110,91,80,109,72,27,197,11,239,23,234,167,118,16, + 243,189,18,102,132,145,163,10,235,72,84,211,111,146,196,34,197,50,175,164,151,186,125,10,96,50,238,16,100,217,118,6,193,101,202,113,110,77,135,69, + 134,41,35,152,62,184,120,169,122,45,158,212,76,239,160,248,8,52,234,24,83,103,60,72,240,197,243,49,77,2,110,26,129,245,78,42,69,8,238,132, + 108,227,202,102,224,13,216,214,98,26,181,181,86,113,113,144,105,74,244,99,90,31,19,119,50,211,210,153,139,83,51,95,28,187,206,96,161,8,247,173, + 227,33,169,133,111,156,89,71,105,86,16,180,22,148,231,146,90,73,229,208,10,62,7,87,209,62,47,129,75,96,88,130,197,237,60,176,200,188,118,154, + 123,214,202,104,112,157,105,203,85,148,152,156,36,219,78,146,109,19,9,236,150,198,56,36,36,245,69,183,53,118,165,96,38,2,6,33,84,169,140,121, + 195,59,154,79,101,74,74,46,13,235,34,84,90,39,181,61,136,80,211,115,241,125,34,130,111,22,161,245,136,44,241,197,104,206,100,0,168,115,26,252, + 14,153,90,159,41,173,141,151,109,144,202,76,107,216,42,213,6,169,13,18,209,59,7,27,2,161,184,234,128,116,167,237,36,217,54,5,82,219,83,78, + 230,75,130,84,24,108,107,11,67,211,54,207,18,230,217,65,1,180,64,202,233,88,198,185,216,78,241,84,219,100,114,164,167,26,181,234,171,217,158,147, + 14,42,180,62,100,123,113,89,118,143,7,148,132,25,239,148,3,80,61,129,178,182,109,211,4,207,172,178,62,226,76,56,30,0,213,193,59,240,207,148, + 131,61,97,241,225,216,251,224,169,184,109,171,53,5,211,205,141,242,109,116,105,58,82,81,81,4,65,139,119,153,243,90,10,215,174,133,224,6,44,145, + 170,119,157,221,103,93,188,208,7,23,47,119,189,142,182,212,185,139,41,180,232,246,65,16,228,207,225,144,62,114,177,175,198,84,5,25,190,109,203,48, + 169,50,116,74,101,148,63,180,151,125,63,91,76,151,247,35,232,55,190,149,100,247,34,212,92,163,224,186,23,55,213,155,141,164,187,45,234,106,78,239, + 125,183,193,182,80,245,174,90,77,93,237,25,181,184,42,103,211,209,197,5,149,126,174,203,187,141,254,90,93,47,239,233,202,235,225,101,62,223,106,181, + 70,148,119,101,73,189,206,243,143,5,84,127,248,71,236,52,250,24,54,146,243,92,109,115,120,205,197,135,224,110,67,229,41,175,187,23,63,45,151,55, + 77,62,96,75,190,205,175,138,213,117,142,21,227,222,212,197,58,36,11,193,100,125,253,98,89,78,139,50,186,32,160,5,53,243,174,117,61,132,119,64, + 159,9,159,250,18,245,184,185,80,101,194,134,77,21,44,213,247,118,167,64,76,139,231,24,179,238,114,54,159,163,159,170,78,100,195,228,117,185,124,143, + 8,179,46,194,217,96,235,166,88,231,211,124,157,55,131,109,40,106,91,118,59,189,60,255,231,47,127,221,198,186,147,201,249,255,45,203,247,77,236,74, + 13,242,139,229,29,96,179,141,199,169,146,119,114,78,170,60,95,191,153,221,96,162,84,150,253,167,135,155,57,224,188,189,208,106,188,254,120,91,52,157, + 86,221,110,74,204,147,101,234,211,201,205,140,110,26,255,186,198,130,255,78,131,68,49,121,221,233,108,61,47,222,252,154,127,40,194,184,213,207,86,139, + 9,149,209,47,203,55,209,208,180,196,159,175,182,177,244,110,127,255,157,191,191,187,24,252,186,46,160,33,202,84,199,180,107,119,59,9,45,119,198,163, + 110,87,119,23,255,130,186,106,117,64,235,255,75,126,213,153,3,81,231,179,55,215,211,233,171,113,253,61,221,32,47,167,131,105,57,163,133,31,106,183, + 202,143,181,152,45,143,244,128,213,36,187,168,104,173,37,4,14,236,44,150,248,61,159,77,138,197,234,56,0,2,251,176,170,201,242,230,102,185,88,5, + 44,212,247,174,198,23,31,71,171,124,44,50,54,222,1,194,108,10,81,204,46,103,69,217,189,82,13,240,166,238,191,170,159,207,110,238,86,179,201,117, + 62,159,103,147,79,213,164,171,86,63,68,210,165,93,16,239,138,119,221,37,68,27,227,145,179,111,243,230,182,40,129,244,213,81,222,164,30,202,248,103, + 113,91,46,167,119,161,216,191,205,148,19,59,254,101,6,149,50,187,184,75,118,92,22,255,190,155,225,142,39,245,252,63,203,53,88,242,188,125,254,188, + 222,63,217,147,184,80,96,139,5,145,18,26,86,207,59,233,95,177,137,139,159,231,179,247,49,51,2,244,106,168,109,50,128,145,138,126,53,222,40,240, + 240,235,170,99,54,230,249,69,1,219,112,59,123,136,236,75,218,164,94,149,203,187,219,155,229,180,168,27,108,236,193,213,15,237,156,229,116,182,186,69, + 131,243,217,130,28,166,150,7,117,165,153,104,188,192,117,162,4,151,106,112,152,166,50,176,186,10,87,120,193,66,141,152,210,153,34,143,241,76,193,63, + 214,66,184,23,77,178,183,132,250,104,56,10,83,59,226,26,225,163,55,46,174,168,126,8,116,237,225,148,137,248,204,125,251,132,138,117,85,200,20,93, + 171,189,27,46,165,167,154,119,221,57,36,165,129,21,183,114,55,115,219,100,104,21,19,204,112,167,95,198,69,216,100,146,207,97,187,126,250,113,183,162, + 249,69,184,26,157,106,132,159,229,221,188,56,95,44,23,159,224,81,188,172,172,55,253,44,234,239,149,31,118,206,55,63,169,91,136,237,28,66,91,76, + 99,226,191,150,179,197,57,240,93,148,47,111,242,242,125,81,86,189,84,223,71,171,117,94,174,91,148,155,217,180,245,187,88,76,91,227,134,174,230,51, + 252,115,174,54,180,105,14,55,164,44,1,130,184,37,81,171,156,247,57,219,208,154,69,126,152,173,102,23,179,57,253,8,95,231,197,203,54,146,94,46, + 63,20,229,229,124,121,191,185,30,111,130,219,124,125,29,201,96,235,23,3,174,228,18,192,251,156,224,211,145,30,221,164,89,235,112,18,212,127,12,70, + 130,67,218,220,89,170,18,35,32,57,38,221,224,237,30,122,68,149,194,102,70,51,197,211,68,244,96,41,190,81,218,43,144,93,166,53,115,102,128,40, + 150,210,115,202,156,9,1,184,32,226,214,27,154,116,103,206,101,74,43,33,53,110,111,168,35,37,51,109,133,100,98,48,66,200,105,180,86,50,154,149, + 217,51,215,79,131,19,144,186,251,168,201,119,164,158,140,212,19,101,32,249,119,25,244,148,65,119,147,111,77,65,103,147,39,233,17,53,218,228,41,34, + 245,96,153,200,184,48,58,218,228,35,238,153,66,19,161,163,93,30,17,227,109,30,145,227,125,206,17,60,102,130,107,219,218,231,201,233,182,246,121,163, + 234,90,166,109,175,146,108,78,18,107,79,189,133,217,61,183,173,38,155,79,203,226,211,157,138,251,38,83,30,120,207,233,96,66,27,127,198,101,198,160, + 162,4,49,158,99,242,134,181,136,60,20,78,41,197,137,38,173,117,44,208,24,3,77,16,205,75,40,67,94,221,28,168,60,162,130,115,18,131,112,136, + 129,103,76,42,15,198,164,104,111,247,180,12,83,172,104,150,25,229,109,76,19,84,91,201,93,117,247,46,181,161,41,56,53,198,112,109,146,180,248,110, + 18,181,194,194,61,104,94,73,101,237,89,56,83,224,92,187,129,2,137,18,209,122,75,51,131,119,3,186,133,150,29,17,223,14,240,29,158,146,240,50, + 162,2,57,204,59,238,105,16,105,133,183,49,73,100,66,89,197,66,135,27,34,150,162,61,61,15,69,29,238,18,9,137,64,59,220,49,112,199,9,203, + 184,14,205,194,100,36,137,55,48,241,221,64,186,141,168,85,144,170,36,105,129,200,25,231,216,32,156,224,13,128,235,129,196,6,194,234,93,160,49,15, + 79,79,18,141,119,32,241,46,5,158,8,238,181,66,13,26,51,168,147,189,218,177,248,80,0,194,27,109,119,254,35,32,128,191,182,130,20,253,20,100, + 139,218,95,197,109,103,213,108,185,30,59,109,239,46,139,142,33,194,46,3,178,172,212,53,46,185,224,142,11,146,48,0,14,89,194,91,128,152,148,240, + 16,40,81,121,120,92,205,5,121,42,248,220,21,85,103,156,195,206,7,33,51,47,189,142,137,21,110,188,176,21,68,106,34,225,11,59,200,16,12,97, + 159,132,21,53,12,5,161,24,226,230,78,17,232,182,52,154,146,167,19,72,174,34,42,109,12,76,210,27,99,35,106,179,164,176,89,48,79,27,211,194, + 182,130,115,69,184,75,44,126,15,76,18,110,56,29,169,191,232,13,157,132,97,205,96,198,161,163,188,185,125,232,66,8,81,231,122,143,137,61,1,23, + 181,254,93,237,224,66,66,110,93,92,80,49,170,131,6,13,218,206,43,166,192,110,168,46,168,28,239,2,195,32,184,160,134,160,143,148,113,128,10,157, + 106,8,97,56,100,165,93,221,108,75,123,155,164,146,132,136,104,143,208,130,194,178,0,37,105,14,80,49,51,205,9,80,74,50,38,195,116,148,192,151, + 74,99,33,18,51,174,210,48,152,184,172,53,140,199,122,68,80,49,214,217,176,28,82,49,92,105,237,130,138,1,138,188,171,84,12,70,173,52,12,131, + 102,9,26,70,27,33,42,173,67,55,243,90,197,80,151,50,162,86,6,10,106,178,69,37,11,133,184,176,210,70,210,81,130,55,216,34,76,211,86,166, + 136,214,91,27,168,14,49,37,135,20,237,16,108,119,207,203,79,130,237,51,161,53,142,199,171,71,26,4,21,16,69,39,101,84,217,226,180,245,145,103, + 176,9,195,53,196,21,29,155,108,34,112,58,115,111,159,199,212,193,183,234,114,167,89,122,187,34,119,255,102,103,254,20,174,9,194,172,199,231,81,214, + 226,143,18,210,244,82,77,41,159,80,181,181,82,141,7,101,41,193,227,12,55,100,3,18,196,134,36,233,43,227,48,74,41,218,219,1,226,95,236,180, + 240,36,33,233,99,175,4,246,171,193,126,87,10,138,106,219,161,168,235,220,68,60,112,130,120,112,46,91,210,238,102,109,98,59,7,141,4,215,69,30, + 64,162,18,223,194,254,237,235,133,236,138,85,68,7,198,65,172,164,219,61,56,3,133,70,207,180,64,121,187,74,227,59,237,141,163,52,8,156,70,105, + 140,32,26,20,40,215,158,172,0,156,62,45,130,191,64,158,169,10,22,136,109,253,209,4,85,103,82,107,9,131,187,165,217,45,205,182,239,70,231,6, + 191,92,68,69,135,206,106,15,245,140,249,88,43,148,231,193,131,160,7,4,137,36,224,77,59,17,156,18,105,36,195,216,116,51,183,210,114,69,29,122, + 203,188,9,52,120,176,180,196,214,208,53,237,109,123,146,129,106,219,139,169,91,166,104,129,105,136,37,25,249,220,160,42,109,184,13,126,184,48,78,243, + 96,38,53,220,31,21,152,43,12,96,15,142,195,163,115,149,43,151,144,195,30,195,178,41,189,255,182,112,216,64,140,119,32,6,211,234,169,230,244,140, + 215,85,166,149,185,245,96,76,69,84,14,65,115,176,213,150,46,19,201,32,78,134,9,142,73,232,161,186,177,166,24,112,81,26,166,201,27,64,200,132, + 0,155,108,16,61,134,7,19,79,62,37,218,32,104,55,245,125,2,200,208,16,5,17,225,202,154,144,196,203,232,169,31,110,137,134,189,47,149,32,26, + 77,202,86,83,166,27,131,107,141,0,144,136,92,195,129,48,68,67,204,108,88,120,32,15,177,61,41,150,221,85,126,26,252,35,184,52,162,181,114,73, + 79,162,26,56,191,213,189,204,25,120,57,6,139,18,222,185,106,12,105,16,254,73,172,24,155,164,53,23,170,76,229,22,142,85,152,48,150,44,5,209, + 224,229,91,89,45,12,158,142,39,82,88,123,61,156,64,252,6,92,17,119,188,148,74,17,173,97,33,54,178,105,40,27,54,71,132,90,20,180,18,75, + 94,89,36,177,238,234,194,138,125,117,167,144,153,229,117,103,30,236,130,59,230,207,132,165,218,81,104,226,1,57,177,92,58,103,9,239,213,250,132,170, + 186,105,40,111,201,30,48,3,227,109,182,68,14,187,65,24,99,140,135,238,160,22,176,167,92,141,10,26,149,238,195,111,229,16,100,59,162,192,0,112, + 112,202,101,134,60,151,51,140,195,169,212,187,69,145,196,235,112,99,32,49,121,38,240,21,27,18,187,51,60,221,137,224,51,104,67,90,19,28,203,102, + 178,21,137,150,41,50,207,45,229,137,55,52,44,28,58,75,121,191,237,204,213,180,214,152,17,137,75,56,202,38,48,17,174,189,242,97,250,240,96,17, + 51,237,48,246,144,41,3,94,201,148,217,222,46,150,61,201,176,125,247,172,214,169,82,56,135,152,205,97,23,211,249,24,108,11,195,222,141,138,119,131, + 114,196,46,181,48,175,216,181,2,142,53,252,33,173,6,63,15,72,163,49,42,108,196,55,70,207,8,155,1,27,64,67,14,96,162,28,54,185,4,246, + 123,53,79,117,255,105,184,227,59,148,31,195,99,14,225,214,196,85,42,7,222,12,177,123,57,148,103,110,122,79,92,14,193,4,34,68,163,59,101,242, + 149,185,16,143,11,16,146,214,143,133,215,94,8,203,204,119,212,30,73,175,111,229,66,190,226,235,97,94,78,142,248,149,77,187,239,98,250,114,98,138, + 246,135,233,187,167,250,238,200,35,251,57,169,12,190,190,178,74,106,88,120,218,30,110,137,62,163,147,23,41,125,92,108,220,66,243,83,211,206,73,99, + 105,216,139,157,124,98,248,8,245,133,18,210,221,227,26,163,132,230,85,186,94,49,43,100,229,184,34,16,114,66,70,84,74,145,41,143,248,137,104,78, + 48,230,130,219,173,224,215,169,112,4,32,181,220,228,210,2,209,53,68,112,154,50,122,42,196,45,30,174,11,57,159,9,218,219,61,45,17,212,72,200, + 151,18,103,218,131,83,54,166,9,184,93,78,235,224,13,37,168,13,13,129,188,87,206,104,158,164,197,119,83,166,155,1,18,148,19,229,8,35,185,84, + 33,43,109,169,67,88,99,101,157,226,17,41,156,214,96,214,112,240,27,98,136,234,208,157,163,52,249,134,72,129,158,129,39,28,72,130,146,216,50,166, + 241,12,222,56,171,50,231,91,42,133,127,138,222,227,81,7,138,93,42,104,134,158,252,17,245,113,22,98,219,112,80,100,169,194,159,104,28,238,32,243, + 148,79,181,244,184,5,156,201,32,26,44,66,170,202,97,183,204,122,27,164,29,174,7,151,93,82,170,63,72,91,35,76,113,138,98,3,112,138,89,30, + 161,226,93,18,65,145,123,217,40,35,45,134,253,15,26,159,176,19,41,246,61,112,6,180,125,232,60,177,247,148,219,141,106,87,255,190,203,203,162,95, + 92,11,196,11,196,145,46,170,73,170,50,36,12,209,20,133,84,154,222,166,65,66,37,2,164,12,48,240,78,253,125,197,36,39,142,133,200,174,147,92, + 147,174,26,195,112,120,250,117,210,60,140,97,36,157,185,13,255,147,152,247,199,144,122,136,161,91,18,49,73,137,68,50,53,71,165,238,58,99,168,238, + 24,234,187,212,191,174,212,69,87,34,226,136,212,61,59,38,117,47,58,99,176,238,24,236,143,37,245,104,233,93,53,231,235,165,195,49,49,100,113,3, + 129,150,30,29,29,237,228,50,152,167,87,16,59,245,242,9,69,3,219,151,189,124,6,62,240,131,160,239,63,255,35,162,252,188,75,104,203,199,214,242, + 49,210,41,81,249,26,149,124,92,235,225,184,72,194,71,149,158,239,42,61,221,29,67,39,199,248,207,98,227,31,14,9,178,43,37,121,24,9,146,29, + 83,132,146,117,21,33,239,142,193,255,168,72,216,50,65,91,177,115,172,106,3,23,36,37,208,223,213,191,233,184,50,36,135,223,209,73,103,56,6,136, + 72,14,177,110,221,170,185,101,211,197,161,172,176,146,62,124,94,126,195,231,72,253,243,78,140,222,45,65,72,232,155,229,166,135,129,79,201,114,211,155, + 22,36,194,76,239,122,66,228,155,75,73,109,76,183,245,207,145,155,18,90,233,116,110,74,236,73,74,113,223,46,30,105,167,164,20,1,57,157,143,50, + 225,173,53,59,222,4,29,131,212,125,82,102,41,116,48,168,218,110,146,74,156,85,71,129,135,91,117,250,250,116,224,33,24,170,251,177,14,161,242,238, + 43,17,112,201,48,171,168,0,24,222,28,216,236,206,40,165,128,246,219,188,84,93,180,187,243,160,207,206,211,59,157,199,125,118,30,120,173,159,12,154, + 46,239,23,195,195,231,17,219,121,115,201,184,167,89,114,204,223,250,240,186,6,155,121,238,180,82,248,97,195,219,71,180,55,140,211,107,118,61,212,44, + 24,167,37,20,180,142,223,170,191,137,138,149,227,206,200,193,246,133,168,196,219,205,123,80,161,163,164,55,206,203,45,135,233,12,80,72,231,130,166,234, + 115,67,106,132,61,71,23,219,123,247,0,107,231,237,172,45,80,238,190,209,181,141,229,157,215,192,110,240,239,76,244,6,144,29,229,68,239,43,182,70, + 237,87,78,187,175,170,61,169,182,228,17,154,248,185,53,18,103,223,250,97,198,211,42,207,232,5,10,93,153,100,108,255,19,28,201,46,232,17,144,174, + 25,9,31,39,190,162,200,62,215,185,198,197,124,57,121,191,95,96,155,194,103,38,149,102,225,92,192,73,77,103,1,84,224,202,45,34,70,11,53,164, + 51,233,52,213,50,12,4,29,228,115,74,118,142,232,240,136,115,202,181,210,67,27,78,40,30,74,17,172,115,216,250,85,28,65,207,31,202,22,17,155, + 87,99,23,106,65,39,240,214,42,99,67,253,40,189,225,91,43,17,119,240,54,73,21,100,61,140,211,254,8,45,84,164,105,39,61,85,179,101,84,191, + 45,168,102,158,146,232,66,82,186,29,225,62,195,162,77,114,241,137,84,43,143,223,199,113,160,198,235,209,69,97,187,86,156,71,190,118,237,147,26,3, + 141,200,228,25,148,54,83,156,85,21,178,84,71,105,254,191,188,43,200,109,24,134,97,247,189,162,15,8,2,203,150,37,11,24,118,217,181,255,127,207, + 72,37,1,50,204,205,10,236,182,94,5,180,9,194,152,162,100,42,230,108,91,225,198,2,210,154,17,137,180,161,216,82,87,23,71,30,1,58,190,58, + 0,219,204,49,221,163,197,222,218,42,62,194,237,20,253,156,70,19,178,38,61,237,29,233,133,137,105,236,206,76,206,150,236,248,246,151,147,32,160,25, + 222,232,43,190,10,1,66,100,70,213,112,238,38,161,20,192,107,215,119,163,18,103,133,80,166,2,183,42,125,250,124,46,101,183,75,71,54,157,178,206, + 117,59,227,119,126,97,138,121,192,47,77,255,99,74,120,64,48,207,21,224,26,218,4,218,231,201,156,204,3,58,254,50,191,119,32,225,175,152,155,143, + 22,183,131,115,123,154,205,32,178,76,246,174,42,253,110,30,116,169,121,119,144,37,151,159,231,232,19,228,179,248,10,122,47,53,23,254,128,180,171,177, + 96,113,42,207,24,208,27,61,114,160,213,161,75,14,234,133,228,220,140,180,156,118,137,92,248,101,148,226,126,84,207,170,27,29,136,241,115,123,27,87, + 235,104,149,99,46,40,154,77,233,101,131,134,4,123,21,252,94,129,26,46,106,183,78,87,114,53,203,61,53,171,188,229,116,136,13,218,13,41,146,101, + 173,134,171,139,241,222,161,63,91,158,84,49,138,65,250,13,146,99,29,59,199,8,213,96,221,120,240,199,3,153,237,180,197,233,172,146,75,139,239,169, + 172,120,231,55,91,62,222,190,0,80,75,3,4,20,0,2,0,8,0,118,128,249,52,254,120,218,95,213,23,0,0,110,124,0,0,20,0,0,0,100, + 111,99,117,109,101,110,116,45,115,97,118,101,45,97,115,46,115,118,103,236,93,91,115,26,73,150,126,239,95,193,210,47,237,24,81,228,253,34,91,158, + 232,117,199,108,204,134,103,55,98,186,59,246,185,4,37,137,54,2,13,32,75,246,175,223,239,100,21,69,86,145,64,33,100,217,211,97,20,29,134,83, + 121,61,231,203,115,203,204,234,55,127,125,188,157,246,62,22,139,229,100,62,187,232,243,140,245,123,197,108,52,31,79,102,215,23,253,223,127,251,219,192, + 245,123,203,85,62,27,231,211,249,172,184,232,207,230,253,191,190,253,225,205,127,12,6,189,119,139,34,95,21,227,222,195,100,117,211,251,251,236,195,114, + 148,223,21,189,159,110,86,171,187,243,225,240,225,225,33,155,84,196,108,190,184,30,190,234,13,6,168,185,252,120,253,67,175,215,67,183,179,229,249,120, + 116,209,175,202,223,221,47,166,161,220,120,52,44,166,197,109,49,91,45,135,60,227,195,254,166,248,104,83,252,161,184,204,22,197,114,126,191,24,149,205, + 143,70,113,201,197,248,106,83,20,35,121,144,161,16,247,222,15,153,24,10,49,64,137,193,242,211,108,149,63,14,102,203,31,163,170,24,96,170,170,96, + 140,13,241,108,83,178,91,169,243,199,41,216,176,115,48,225,105,220,59,88,127,135,255,234,10,107,66,86,206,245,10,53,139,108,86,172,134,191,252,246, + 75,253,112,192,178,241,106,28,53,179,230,124,163,223,134,56,102,249,109,177,188,203,71,197,114,184,166,135,250,235,38,207,199,243,17,149,185,232,227,203, + 61,137,99,176,204,63,22,131,124,153,173,231,23,23,189,204,151,40,58,188,153,223,22,195,63,38,183,183,249,104,184,92,140,134,163,143,203,33,208,115, + 61,31,76,70,243,217,96,117,3,193,14,209,217,52,191,156,22,195,124,180,2,236,150,161,177,245,32,206,107,48,178,76,201,191,140,139,143,197,180,217, + 91,84,64,138,178,238,248,162,143,65,9,207,101,248,125,83,76,174,111,86,23,125,229,238,30,3,225,97,50,94,221,84,191,223,130,240,102,92,92,45, + 233,65,89,151,126,201,240,0,143,22,249,120,146,79,255,139,254,193,164,203,66,209,240,70,243,233,180,24,161,241,124,250,144,127,42,199,78,159,32,200, + 243,155,69,1,224,253,136,239,69,190,88,183,161,153,97,117,57,234,175,217,133,102,146,215,143,175,43,226,239,179,201,10,8,187,95,22,139,95,73,74, + 255,59,251,125,89,108,149,250,109,145,207,150,128,196,237,69,255,54,95,45,38,143,63,13,68,102,173,146,206,159,49,252,241,204,27,111,153,57,227,28, + 116,35,228,217,192,89,145,57,167,213,171,186,177,209,227,69,223,48,157,89,174,132,223,80,63,17,191,76,102,148,117,27,234,85,178,236,85,178,236,2, + 250,132,219,12,37,157,233,247,134,21,123,155,172,233,204,94,98,91,130,171,111,171,231,111,150,171,249,221,186,44,176,178,250,52,5,28,137,56,64,139, + 243,197,249,229,52,31,125,120,29,8,115,240,115,178,250,116,206,95,247,55,53,230,87,87,203,2,221,178,136,22,96,133,26,232,73,212,19,120,90,95, + 44,213,23,79,247,165,54,204,26,54,167,252,245,16,26,9,251,84,132,166,1,58,224,206,243,204,200,111,23,161,9,0,42,215,127,118,80,164,1,168, + 217,110,0,70,165,76,170,193,76,247,143,95,25,47,6,119,45,14,193,253,137,26,99,47,220,33,185,125,130,21,246,5,224,46,50,110,125,10,238,143, + 252,162,47,25,168,218,242,141,236,62,17,213,180,33,252,40,146,101,5,45,2,159,17,112,236,241,200,54,222,232,238,200,254,113,28,62,79,84,174,232, + 203,30,131,182,31,175,198,244,215,161,55,158,238,205,127,33,188,165,216,40,142,97,163,96,42,119,246,201,108,20,199,177,49,213,27,235,206,70,241,146, + 108,100,252,8,54,74,101,116,174,158,204,70,38,143,98,99,170,183,35,216,200,244,139,177,81,121,127,12,27,175,194,231,137,108,68,95,199,177,49,213, + 91,103,54,162,55,253,242,62,83,224,231,110,159,9,143,109,195,129,17,50,83,202,50,107,27,14,140,201,148,182,198,42,221,112,96,182,203,94,37,203, + 146,3,227,51,184,167,186,75,104,192,51,201,209,44,135,245,201,24,51,146,139,98,32,194,15,33,188,81,244,3,69,164,17,130,159,41,147,225,31,230, + 206,6,42,243,204,59,103,95,117,52,137,71,91,27,193,221,102,158,59,37,114,192,249,65,35,254,0,56,187,131,252,160,171,37,184,231,7,192,217,29, + 228,47,238,254,52,25,190,37,15,110,17,130,60,151,251,195,50,207,21,231,10,200,82,92,88,207,139,1,39,247,39,254,85,151,25,200,204,25,103,60, + 80,7,183,137,65,61,138,150,87,36,51,166,189,103,166,225,21,9,155,73,143,6,108,195,43,66,196,107,132,146,210,54,188,34,80,181,147,54,246,2, + 158,77,195,58,131,56,177,187,206,99,225,243,68,13,139,190,212,81,26,54,213,91,103,13,139,222,204,203,107,216,192,207,221,26,22,143,93,83,195,170, + 12,162,229,194,52,52,172,132,218,20,156,71,46,253,85,178,236,85,178,44,105,88,13,159,91,89,105,59,192,157,20,43,125,206,6,54,115,220,40,99, + 139,129,12,58,150,75,161,152,15,191,16,145,73,99,41,25,163,51,231,173,55,208,195,180,66,76,230,172,100,230,203,41,90,173,245,65,61,170,181,253, + 242,122,52,209,68,97,232,175,213,68,197,205,116,160,140,232,166,252,244,83,211,48,188,131,26,215,70,38,91,182,122,171,229,174,179,222,12,249,168,217, + 115,250,59,106,246,78,113,172,202,72,85,55,230,165,187,204,94,167,76,102,221,237,179,76,254,56,163,182,237,180,10,171,78,116,90,89,38,180,66,8, + 225,93,154,143,187,65,132,206,205,201,94,236,94,41,242,253,189,187,231,99,99,132,147,167,186,88,104,196,28,175,26,118,88,185,131,232,68,111,238,120, + 23,107,135,149,123,54,54,234,231,96,163,54,47,231,169,162,55,247,149,61,213,4,27,149,58,204,37,101,58,46,215,148,58,85,244,119,188,102,142,122, + 119,79,87,141,99,73,127,95,94,53,74,243,12,96,148,238,120,48,22,225,243,20,48,42,118,60,24,83,189,61,39,27,133,235,192,37,246,116,48,94, + 134,207,41,96,148,226,233,96,244,87,244,247,197,193,200,221,225,37,205,221,9,75,218,73,250,59,129,139,220,157,176,164,83,50,100,39,114,49,17,69, + 172,232,235,52,95,21,136,155,173,135,219,34,207,36,190,120,238,216,171,70,24,43,117,38,28,23,154,53,66,94,4,53,198,145,239,218,220,52,216,46, + 11,170,13,105,163,120,226,221,66,253,212,10,98,190,83,194,140,48,114,80,97,29,136,106,186,13,146,88,164,88,230,149,244,82,55,247,74,76,198,29, + 130,44,219,204,32,184,76,57,206,173,105,177,200,48,101,4,211,123,39,47,85,167,201,147,154,233,28,20,31,128,70,21,99,234,140,7,9,190,122,62, + 166,73,192,77,35,176,222,74,165,8,193,157,144,77,92,217,12,188,1,219,26,76,163,178,214,42,46,246,50,77,137,110,76,235,98,226,78,102,90,58, + 115,113,106,230,139,99,213,25,76,20,225,190,117,60,36,181,240,141,51,235,40,205,10,130,214,130,242,92,82,43,169,28,74,193,231,224,42,90,231,11, + 224,18,24,150,96,113,51,15,44,50,175,157,230,158,53,50,26,92,103,218,114,21,37,38,71,201,178,163,100,217,68,2,187,161,49,246,9,73,189,232, + 178,198,170,20,204,68,192,32,132,42,149,49,111,120,75,243,169,76,73,201,165,97,109,132,74,235,164,182,123,17,106,58,78,190,75,68,240,205,34,180, + 234,145,37,190,24,205,153,12,0,117,78,131,223,33,83,235,51,165,181,241,178,9,82,153,105,13,91,165,154,32,181,65,34,122,107,99,67,32,20,87, + 45,144,110,149,29,37,203,166,64,106,59,202,201,188,36,72,133,193,178,182,48,52,77,243,44,97,158,29,20,64,3,164,156,182,101,156,139,237,20,79, + 149,77,38,71,58,170,81,171,190,154,237,57,105,163,66,235,125,182,23,143,101,123,123,64,73,152,241,214,161,9,58,117,161,172,109,218,52,193,51,171, + 172,143,56,19,182,7,64,117,240,14,252,51,229,96,79,152,124,216,246,222,187,43,110,155,106,77,193,116,115,163,124,19,93,154,182,84,84,20,65,208, + 228,93,230,188,150,194,53,79,140,112,3,150,72,213,249,52,226,23,157,188,208,123,39,47,183,189,142,166,212,185,139,41,52,233,230,70,16,228,207,225, + 144,126,27,147,53,251,39,107,155,147,133,183,202,12,87,198,180,97,142,217,72,213,60,27,148,40,91,122,193,74,90,229,197,81,147,127,51,164,131,178, + 225,91,125,24,151,142,8,143,63,78,138,135,31,154,108,120,152,204,198,243,135,1,148,59,175,117,88,251,33,116,188,170,119,120,218,15,215,103,120,55, + 48,111,151,168,14,245,122,239,219,5,234,19,203,247,229,108,170,83,192,81,137,235,197,100,60,184,188,156,63,146,114,187,95,43,239,229,205,252,129,158, + 92,244,175,242,105,173,210,55,162,189,95,44,168,213,105,254,169,128,221,11,255,108,13,159,236,25,39,237,232,253,214,188,201,170,129,245,177,211,92,63, + 251,60,159,223,146,187,230,132,131,190,222,122,124,151,95,23,203,155,28,243,70,161,212,195,42,42,13,241,116,245,252,114,190,24,23,139,232,129,128,33, + 208,172,30,87,249,60,68,184,192,164,9,159,234,17,181,184,126,80,38,3,251,155,227,210,116,214,187,61,4,98,93,60,198,152,129,87,147,233,20,237, + 148,71,101,214,172,94,45,230,31,16,100,87,231,144,214,8,187,45,86,249,56,95,229,155,206,214,20,85,159,207,30,95,157,255,243,151,191,213,225,254, + 104,116,254,127,243,197,135,77,248,78,5,242,203,249,61,192,83,167,36,232,200,247,232,156,172,89,190,122,59,185,197,64,233,148,254,95,30,111,167,0, + 117,253,160,81,120,245,233,174,216,52,90,54,187,190,113,144,188,181,48,30,221,78,168,210,240,215,21,38,252,119,234,36,74,75,84,141,78,86,211,226, + 237,175,249,199,162,247,243,50,116,93,82,26,133,70,116,177,98,190,120,27,245,78,179,252,249,186,206,40,108,55,249,223,249,135,251,203,222,175,171,2, + 170,99,145,106,152,150,239,118,35,161,228,86,127,212,236,242,254,242,15,232,177,70,3,196,130,255,204,175,91,99,32,234,116,242,246,102,60,126,51,172, + 190,167,11,228,139,113,111,188,152,124,44,246,151,163,107,6,189,124,185,191,208,100,126,160,17,76,40,217,79,73,107,204,34,48,97,107,190,196,242,233, + 100,84,204,150,135,97,16,56,136,137,141,230,183,183,243,217,50,32,162,170,187,28,94,126,26,44,243,161,200,216,112,11,14,147,49,164,49,185,154,20, + 139,246,147,178,131,183,85,251,229,141,138,236,246,126,57,25,221,228,211,105,54,250,92,14,186,44,245,67,36,96,90,11,241,218,120,223,158,66,180,60, + 142,28,125,147,55,119,197,2,120,95,30,228,77,234,166,206,63,139,187,197,124,124,31,174,127,52,153,114,98,195,191,76,160,88,38,151,247,201,134,23, + 197,191,238,39,168,241,164,150,255,103,190,2,75,158,183,205,159,87,187,7,123,18,23,10,172,178,32,82,66,195,242,121,7,253,43,214,113,241,243,116, + 242,33,102,70,128,94,5,181,117,42,52,82,212,111,134,107,53,30,126,93,183,140,199,52,191,44,96,33,238,38,143,145,149,73,155,215,235,197,252,254, + 238,118,62,46,170,2,107,171,112,253,67,51,121,59,158,44,239,80,224,124,50,35,103,170,225,93,93,107,38,54,142,207,42,113,98,155,14,35,49,77, + 231,225,170,67,219,194,11,22,14,203,41,157,41,114,157,207,20,2,5,45,132,123,181,201,122,47,160,62,54,28,133,193,29,112,141,56,218,27,23,31, + 192,127,12,116,237,225,157,138,248,240,65,125,103,201,186,50,118,140,158,85,158,14,151,210,211,21,9,221,218,45,166,142,21,183,114,59,133,189,73,85, + 43,38,224,7,58,253,58,62,179,79,134,249,28,22,236,167,31,183,15,192,191,10,79,163,237,157,240,115,113,63,45,206,103,243,217,103,248,21,175,75, + 27,78,63,139,234,123,233,147,157,243,245,79,106,22,98,59,135,208,102,227,152,248,199,124,50,59,7,190,139,197,235,219,124,241,161,88,148,173,148,223, + 7,203,85,190,88,53,40,183,147,113,227,119,49,27,55,250,13,77,77,39,248,231,92,173,105,227,28,206,200,98,1,16,196,37,137,90,38,255,207,217, + 154,182,153,228,199,201,114,114,57,153,210,143,240,117,90,188,110,34,233,245,252,99,177,184,154,206,31,214,207,227,69,112,151,175,110,34,25,212,62,50, + 224,74,142,1,60,209,17,62,45,233,81,37,205,26,187,180,160,254,163,55,16,28,210,230,206,210,113,57,2,146,99,210,245,222,237,160,71,84,41,108, + 102,52,83,60,77,68,11,150,2,61,165,189,2,217,101,90,51,103,122,8,231,41,79,169,204,153,16,128,139,99,86,175,105,210,157,57,151,41,173,132, + 212,168,190,161,14,148,204,180,21,146,137,222,0,177,183,209,90,201,104,84,102,199,88,63,247,78,64,234,246,205,164,239,72,61,25,169,39,202,64,242, + 239,50,232,40,131,246,34,175,77,65,107,145,39,233,17,53,90,228,41,34,181,96,153,64,24,106,116,180,200,7,220,51,133,34,66,71,171,60,34,198, + 203,60,34,199,235,156,35,132,204,4,215,182,177,206,147,195,109,172,243,141,170,107,152,182,157,74,114,179,165,90,121,234,13,204,238,168,182,28,173,63, + 13,139,79,53,21,247,155,28,72,224,61,167,29,26,109,252,25,151,25,131,138,18,196,120,142,193,27,214,32,242,112,130,76,41,78,52,105,173,99,129, + 198,24,104,130,104,94,66,25,242,178,114,160,242,136,10,206,73,116,194,33,6,158,49,169,60,24,147,162,189,219,81,50,12,177,164,89,102,148,183,49, + 77,208,33,83,238,202,218,219,212,13,77,193,169,49,134,107,147,164,197,181,73,212,10,19,247,160,121,37,149,181,103,97,115,133,115,237,122,10,36,202, + 200,235,154,102,122,239,123,84,133,166,29,17,223,245,240,29,158,146,240,50,162,2,57,204,59,238,169,19,105,133,183,49,73,100,66,89,197,66,131,107, + 34,166,162,61,93,159,163,6,183,137,132,68,160,29,238,24,184,227,132,101,92,135,98,97,48,146,196,27,152,248,190,39,221,90,212,42,72,85,146,180, + 64,228,140,115,44,16,78,240,6,192,117,79,98,1,97,246,46,208,152,135,167,39,137,198,91,144,120,159,2,79,4,247,74,161,6,141,25,212,201,78, + 237,88,124,44,0,225,181,182,59,255,17,16,192,95,83,65,138,110,10,178,65,237,174,226,234,81,109,150,92,135,149,182,115,149,69,251,49,97,149,1, + 89,86,234,10,151,92,112,199,5,73,24,0,135,44,225,45,80,218,82,120,8,148,168,60,220,110,116,65,158,10,62,119,73,213,25,231,176,243,65,200, + 204,75,175,99,98,137,27,47,108,9,145,138,72,248,194,10,50,4,67,216,39,97,69,5,67,65,40,134,184,185,83,4,186,154,70,67,242,180,21,203, + 85,68,165,133,129,65,122,99,108,68,221,76,41,44,22,140,211,198,180,176,172,224,92,17,238,18,147,223,1,147,132,27,78,103,11,94,117,134,78,194, + 176,102,48,227,208,81,222,220,61,182,33,132,168,115,181,195,196,158,128,139,74,255,46,183,112,33,33,183,54,46,232,84,174,131,6,13,218,206,43,166, + 192,110,168,46,168,28,239,2,195,32,184,160,134,160,143,148,113,128,10,109,239,8,97,56,100,165,93,85,172,166,189,75,82,73,66,68,180,7,104,65, + 97,89,128,146,52,7,168,24,153,230,4,40,37,25,147,97,56,74,224,75,169,177,16,137,25,87,106,24,12,92,86,26,198,99,62,34,168,24,235,108, + 152,14,169,24,174,180,118,65,197,0,69,222,149,42,6,189,150,26,134,65,179,4,13,163,141,16,165,214,161,202,188,82,49,212,164,140,168,165,129,130, + 154,108,80,201,66,33,46,44,181,145,116,148,230,13,182,8,195,180,165,41,162,249,86,6,170,69,76,201,33,69,219,7,219,237,131,3,39,193,246,153, + 208,26,199,227,229,221,14,65,39,169,162,45,67,58,226,227,180,245,145,103,176,14,195,53,196,21,237,31,173,35,112,58,124,208,220,171,169,130,111,213, + 230,206,102,234,205,163,201,187,23,59,243,167,112,77,16,102,61,62,71,89,139,63,75,72,211,73,53,165,124,66,213,212,74,21,30,148,165,4,143,51, + 220,144,13,72,16,55,36,73,95,25,135,81,74,209,222,245,16,255,98,165,133,43,149,164,143,189,18,88,175,6,235,93,41,40,170,186,65,81,29,248, + 19,113,199,9,226,222,177,212,164,237,197,186,137,237,28,52,18,92,23,185,7,137,74,124,11,235,183,171,23,178,45,86,17,237,156,7,177,146,110,247, + 224,12,20,26,93,238,129,242,118,165,198,119,218,27,71,105,16,56,141,210,24,65,52,40,80,174,61,89,1,56,125,90,4,127,129,60,83,21,44,16, + 171,253,209,4,85,103,82,107,9,131,91,211,108,77,179,205,218,104,220,224,151,139,168,104,208,89,237,161,158,49,30,107,133,242,60,120,16,116,83,146, + 72,2,222,180,19,193,41,145,70,50,244,77,149,185,149,150,43,106,208,91,230,77,160,193,131,165,41,54,186,174,104,239,154,131,12,84,219,156,76,85, + 50,69,11,76,67,44,201,200,231,6,85,105,195,109,240,195,133,113,154,7,51,169,225,254,168,192,92,97,0,123,112,28,30,157,43,93,185,132,28,118, + 24,150,245,29,132,111,11,135,27,136,241,22,196,96,90,61,29,190,61,227,213,113,219,210,220,122,48,166,36,42,135,160,57,216,106,75,143,137,100,16, + 39,195,4,199,36,180,80,86,172,40,6,92,148,134,105,242,6,16,50,33,192,38,27,68,247,17,97,226,201,167,68,25,4,237,166,170,39,128,12,13, + 81,16,17,174,172,9,73,188,140,174,63,113,75,52,172,125,169,4,209,104,80,182,28,50,85,12,174,53,2,64,34,114,13,7,194,16,13,49,179,97, + 225,102,34,98,123,82,44,219,179,252,220,251,71,112,105,68,99,230,146,174,228,26,56,191,101,93,230,12,188,28,131,73,9,239,92,217,135,52,8,255, + 36,102,140,69,210,24,11,29,209,229,22,142,85,24,48,166,44,5,209,224,229,91,89,78,12,158,142,39,82,152,123,213,157,64,252,6,92,17,119,188, + 148,74,17,109,195,66,44,100,179,161,172,217,28,17,42,81,208,76,44,121,101,145,196,218,179,11,51,246,101,77,33,51,203,171,198,60,216,5,119,204, + 159,9,75,135,104,161,137,123,228,196,114,233,156,37,188,151,243,19,170,108,102,67,121,71,246,128,25,24,111,83,19,57,236,6,97,140,49,30,154,131, + 90,192,154,114,21,42,168,87,170,135,223,202,33,200,118,68,129,1,224,224,148,203,12,121,46,103,232,135,211,153,247,6,69,18,175,67,197,64,98,242, + 76,224,43,22,36,86,103,184,230,138,224,51,104,67,154,19,28,203,205,96,75,18,77,83,100,158,91,202,19,175,105,152,184,167,195,36,190,110,204,85, + 180,70,159,17,137,75,56,202,38,48,17,174,189,242,97,248,240,96,17,51,109,49,118,159,41,3,94,201,148,217,206,46,150,61,201,176,125,247,172,86, + 169,51,129,14,49,155,195,42,166,253,49,216,22,134,181,27,157,98,14,202,17,171,212,194,188,98,213,10,56,214,240,135,180,234,253,220,35,141,198,232, + 132,39,190,49,186,44,109,122,172,7,13,217,131,137,114,88,228,18,216,239,84,60,213,252,231,254,150,239,176,248,20,238,123,132,170,137,167,116,46,122, + 221,197,246,227,112,78,117,221,122,226,113,8,38,16,33,26,221,186,47,80,154,11,113,92,128,144,180,126,44,188,255,67,88,102,190,163,246,64,122,189, + 150,11,249,138,23,253,124,49,58,224,87,110,202,125,23,211,203,137,41,90,31,166,235,154,234,186,34,15,172,231,164,50,248,250,202,42,169,97,225,105, + 123,184,37,250,140,118,94,164,244,241,169,235,6,154,159,154,118,78,26,75,195,94,109,229,19,195,71,168,23,74,72,183,183,107,140,18,154,151,233,122, + 197,172,144,165,227,138,64,200,9,25,81,41,69,166,60,226,39,162,57,193,152,11,110,183,130,95,167,194,22,128,212,114,157,75,11,68,183,33,130,211, + 148,209,83,33,110,241,112,93,200,249,76,208,222,237,40,137,160,70,66,190,148,56,211,30,156,178,49,77,192,237,114,90,7,111,40,65,221,208,16,200, + 123,229,140,230,73,90,92,155,50,221,12,144,160,156,40,71,24,201,165,10,89,105,75,13,194,26,43,235,20,143,72,97,183,6,163,134,131,191,33,134, + 168,14,205,57,74,147,175,137,20,232,25,120,194,129,36,40,137,45,99,26,207,224,141,179,50,115,94,83,41,252,83,244,66,147,42,80,108,83,65,51, + 116,5,74,84,219,89,136,109,195,70,145,165,171,14,68,227,112,7,153,167,124,170,165,123,39,112,38,131,104,48,9,169,74,135,221,50,235,109,144,118, + 120,30,92,118,73,169,254,32,109,141,48,197,41,138,13,192,41,102,121,132,138,247,73,4,69,238,229,70,25,105,209,239,190,209,248,132,149,72,177,239, + 158,61,160,250,246,125,98,237,209,43,140,219,171,111,249,175,251,124,81,116,139,107,129,120,129,56,210,69,103,146,202,12,9,67,52,69,33,149,166,215, + 138,144,80,137,0,41,3,12,188,117,17,161,100,146,19,135,66,100,215,74,174,73,87,246,97,56,60,253,42,105,30,250,48,146,246,220,250,255,78,204, + 251,115,72,61,196,208,13,137,152,164,68,34,153,154,131,82,119,173,62,84,187,15,245,93,234,95,87,234,162,45,17,113,64,234,158,29,146,122,116,149, + 164,236,131,181,251,96,127,46,169,71,83,111,171,57,95,77,29,142,137,33,139,27,8,52,245,104,235,104,43,151,193,60,189,177,218,169,215,79,99,69, + 253,226,155,47,192,10,190,23,247,255,38,83,104,138,200,86,34,50,210,41,81,186,27,165,136,92,227,162,96,36,228,131,122,207,183,245,158,110,247,161, + 147,125,124,71,194,87,69,130,108,75,73,238,71,130,100,135,116,161,100,109,93,200,219,125,240,63,43,18,106,38,104,43,182,118,86,109,224,130,164,28, + 250,251,234,55,237,88,134,252,240,123,218,236,12,59,1,17,201,33,220,173,74,109,170,172,155,216,151,24,86,210,135,207,235,111,120,43,169,123,234,137, + 209,123,54,8,9,93,19,221,116,49,250,148,68,55,189,117,66,34,210,244,174,35,68,190,185,172,212,218,122,91,255,28,233,41,161,149,78,167,167,196, + 142,188,20,247,205,243,35,205,172,148,34,32,167,83,82,38,188,193,103,203,161,160,157,144,170,77,74,46,133,6,122,101,217,117,94,137,179,114,55,112, + 127,169,86,91,159,247,220,131,161,163,63,214,33,90,222,126,61,4,30,25,102,21,157,1,134,67,7,54,187,51,202,42,160,124,157,154,170,206,237,110, + 221,245,217,186,192,211,186,241,179,117,243,181,186,28,52,158,63,204,250,251,183,36,234,113,115,201,184,167,81,114,140,223,250,240,234,10,155,121,238,180, + 82,248,97,195,155,88,180,55,140,211,43,135,61,212,44,24,167,37,20,180,142,255,63,12,235,192,88,57,238,140,236,213,47,135,37,222,174,223,9,11, + 29,37,189,113,94,214,28,166,109,64,33,157,11,154,170,75,133,84,15,59,118,47,234,186,59,128,181,245,166,218,6,40,183,223,110,219,196,242,214,43, + 113,215,248,119,38,122,27,202,150,114,162,119,55,91,163,118,43,167,237,215,246,158,116,188,228,8,77,252,220,26,137,179,111,125,63,227,105,135,207,232, + 101,18,109,153,100,108,247,37,142,100,19,116,11,164,109,70,194,199,137,175,40,178,47,181,181,113,57,157,143,62,236,22,216,250,236,51,147,74,179,176, + 53,224,164,166,237,0,58,227,202,45,130,70,11,53,164,51,233,52,29,103,232,9,218,203,231,148,239,28,208,254,17,231,148,110,165,123,27,78,40,30, + 78,35,88,231,176,244,203,56,130,174,32,202,6,17,139,87,99,21,106,65,155,240,214,42,99,195,17,82,122,219,185,86,34,110,224,93,146,42,200,122, + 24,167,253,1,90,56,148,166,157,244,116,160,45,163,35,220,130,142,205,83,30,93,200,255,111,239,90,114,27,6,161,224,190,167,136,212,173,101,241,248, + 188,7,82,213,77,183,61,70,239,127,134,206,96,91,197,53,118,18,119,151,70,89,5,41,177,147,129,121,3,204,96,174,184,99,198,239,240,163,181,251, + 227,59,171,173,210,158,77,114,96,243,186,219,23,182,173,226,210,104,237,89,147,170,130,17,93,24,64,218,46,138,155,76,178,180,82,42,227,109,142,123, + 11,40,107,74,36,170,19,69,7,63,154,24,234,8,208,177,209,0,216,228,143,73,86,66,153,87,183,156,229,98,218,180,126,116,91,43,100,65,82,117, + 120,84,59,76,233,182,125,178,146,115,85,54,175,190,178,211,8,104,178,5,90,139,143,154,0,33,42,99,140,197,184,161,132,169,0,186,93,154,189,74, + 140,11,97,154,10,220,188,164,238,255,115,40,187,77,18,170,105,151,117,142,247,163,174,243,11,75,204,14,191,132,248,136,37,97,135,96,110,155,128,199, + 18,131,64,251,220,88,147,249,176,146,191,68,248,22,36,236,63,214,230,101,149,219,192,185,169,250,205,32,178,84,230,133,85,90,222,172,208,168,102,201, + 64,150,28,126,86,211,79,144,207,98,35,232,221,249,58,240,51,164,157,47,3,6,103,228,243,22,226,133,54,57,208,106,142,67,205,234,21,169,209,25, + 9,53,240,82,234,192,119,217,57,179,101,246,28,227,68,7,162,60,122,112,226,234,152,131,103,210,5,147,102,141,180,179,65,67,130,189,28,62,31,129, + 26,46,170,151,68,99,178,87,173,219,106,234,121,203,213,36,150,233,56,164,72,150,209,43,174,46,202,123,135,254,12,245,169,29,217,41,164,95,38,57, + 250,60,115,140,80,13,250,137,7,55,127,72,111,179,173,52,207,109,57,116,249,118,125,253,167,245,142,201,61,122,231,213,190,248,218,233,244,250,136,1, + 214,43,250,102,137,62,104,73,242,59,37,129,57,38,123,104,115,44,228,146,170,168,135,131,102,239,87,25,12,238,19,135,212,30,68,205,185,138,27,125, + 201,33,255,104,131,201,207,161,30,92,213,228,53,38,27,199,210,122,75,31,129,124,41,186,91,166,22,164,159,113,230,147,189,33,108,50,51,219,112,141, + 173,34,56,43,216,195,10,89,119,126,212,183,111,158,64,158,0,210,54,64,110,112,44,45,142,141,195,145,64,250,118,29,232,141,167,109,189,191,124,3, + 80,75,3,4,20,0,2,0,8,0,106,128,249,52,126,63,165,149,12,18,0,0,232,90,0,0,18,0,0,0,100,111,99,117,109,101,110,116,45,112, + 114,105,110,116,46,115,118,103,237,92,91,115,218,216,150,126,239,95,193,144,151,78,29,35,246,253,226,196,57,213,147,212,153,58,83,153,75,157,238,174, + 121,22,66,216,116,48,120,4,216,78,126,253,124,107,75,136,45,16,32,108,39,233,153,9,116,151,165,181,239,107,127,235,182,247,34,111,255,250,120,59, + 235,221,231,197,114,186,152,95,245,121,194,250,189,124,158,45,198,211,249,245,85,255,247,223,254,54,112,253,222,114,149,206,199,233,108,49,207,175,250,243, + 69,255,175,239,126,122,251,79,131,65,239,125,145,167,171,124,220,123,152,174,110,122,127,159,127,90,102,233,93,222,251,249,102,181,186,187,28,14,31,30, + 30,146,105,69,76,22,197,245,240,117,111,48,64,203,229,253,245,79,189,94,15,195,206,151,151,227,236,170,95,213,191,91,23,179,80,111,156,13,243,89, + 126,155,207,87,203,33,79,248,176,191,173,158,109,171,63,228,163,164,200,151,139,117,145,149,221,103,89,92,179,24,79,182,85,49,147,7,25,42,113,239, + 253,144,137,161,16,3,212,24,44,63,207,87,233,227,96,190,124,21,53,197,4,219,154,10,198,216,16,101,219,154,221,106,93,62,206,192,134,131,147,9, + 165,241,232,96,253,29,254,175,27,108,8,73,185,214,9,90,230,201,60,95,13,63,252,246,161,46,28,176,100,188,26,71,221,108,56,223,24,183,177,29, + 243,244,54,95,222,165,89,190,28,110,232,161,253,166,203,203,241,34,163,58,87,125,60,172,105,59,6,119,197,116,190,74,54,171,139,43,142,210,37,42, + 14,111,22,183,249,240,143,233,237,109,154,13,151,69,54,204,238,151,67,96,231,122,49,152,102,139,249,96,117,131,109,29,98,168,89,58,154,229,195,52, + 91,1,116,203,208,217,102,10,151,53,20,89,162,228,95,198,249,125,62,107,142,22,85,144,162,108,59,190,234,99,82,194,123,21,222,111,242,233,245,205, + 234,170,175,220,221,99,32,60,76,199,171,155,234,253,29,8,111,199,249,100,73,5,101,91,122,147,161,0,69,69,58,158,166,179,127,161,63,88,114,89, + 41,154,94,182,152,205,242,12,157,167,179,135,244,115,57,119,250,132,109,188,188,41,114,192,238,21,158,243,180,216,244,161,153,97,117,61,26,175,57,132, + 102,146,215,197,215,21,241,247,249,116,5,124,173,151,121,241,43,237,209,127,204,127,95,230,123,181,126,43,210,249,18,128,184,189,234,223,166,171,98,250, + 248,243,64,36,214,42,233,252,5,195,151,39,222,120,203,204,5,231,160,27,33,47,6,206,138,196,57,173,94,215,157,101,143,87,125,195,116,98,185,18, + 126,75,253,76,252,50,137,81,214,109,169,147,214,186,147,214,186,5,180,9,183,9,106,58,211,239,13,43,246,54,89,211,153,189,196,182,22,174,190,171, + 202,223,46,87,139,187,77,93,96,101,245,121,6,56,18,113,128,30,23,197,229,104,150,102,159,222,4,194,2,252,156,174,62,95,242,55,253,109,139,197, + 100,178,204,49,44,139,104,1,86,104,129,145,68,189,128,167,141,197,218,198,226,237,99,169,45,179,134,205,37,127,63,132,70,155,253,92,132,182,3,116, + 192,157,231,137,145,127,94,132,182,0,80,185,254,139,131,162,29,128,154,29,6,96,84,203,180,117,152,232,254,249,146,241,205,224,174,197,41,184,63,81, + 99,28,133,59,118,238,216,198,10,251,13,224,46,18,110,125,27,220,31,249,85,95,50,80,181,229,219,189,251,76,84,179,11,225,71,209,90,87,144,16, + 248,132,128,99,191,130,238,181,134,139,238,208,127,197,194,231,137,218,23,99,169,115,224,216,58,90,103,64,98,52,243,237,245,111,224,231,97,253,139,98, + 215,80,134,66,37,229,42,155,202,144,39,206,234,152,58,105,173,59,105,173,75,202,208,39,92,52,136,135,113,205,171,94,47,88,203,131,12,159,45,69, + 216,196,115,99,236,235,142,98,117,182,46,86,112,110,206,0,228,36,124,118,32,130,181,75,203,185,84,173,200,172,150,210,134,80,12,174,78,171,103,212, + 114,173,29,115,38,149,114,194,245,207,158,242,102,15,216,89,250,186,125,245,93,5,4,203,48,79,212,216,45,187,166,120,255,36,219,148,236,184,31,45, + 75,29,103,248,166,231,115,45,26,93,183,49,166,219,232,163,116,228,71,246,228,232,207,230,162,148,167,185,40,245,211,185,216,170,81,147,74,90,186,177, + 81,218,19,248,234,174,200,95,138,109,198,187,211,108,107,176,230,76,182,5,49,27,191,136,200,142,232,227,15,118,213,234,245,29,83,88,204,116,217,52, + 38,158,142,253,86,155,255,242,216,55,238,244,38,26,255,140,77,52,225,243,12,13,98,188,248,243,65,223,69,225,222,33,191,229,228,194,156,56,225,194, + 181,201,132,157,152,137,238,30,110,68,163,169,243,217,216,54,218,75,178,209,116,0,159,101,231,115,201,229,110,236,236,115,130,178,87,217,40,243,25,63, + 75,99,8,171,157,17,204,246,91,151,209,69,99,24,251,12,141,209,186,232,23,215,24,66,251,83,123,38,204,51,244,69,206,232,251,213,252,180,19,91, + 168,152,134,194,49,190,109,11,157,51,231,33,40,56,79,231,217,156,224,201,90,215,62,124,7,39,89,24,254,116,0,41,79,223,175,13,32,174,205,225, + 88,99,179,14,170,164,158,233,57,236,197,39,221,141,14,13,111,158,206,200,137,163,239,83,25,217,30,30,35,188,20,136,176,132,101,220,52,34,81,97, + 18,47,180,246,170,17,181,82,36,234,181,242,205,8,119,191,110,214,90,183,219,161,205,126,160,205,149,148,93,226,245,224,59,158,52,160,39,162,88,58, + 164,177,34,97,70,201,136,37,116,160,227,17,45,11,199,165,104,28,254,104,155,128,125,70,179,198,65,145,79,28,38,195,34,91,124,252,44,74,48,103, + 218,99,118,195,172,244,120,48,220,89,238,46,232,84,74,226,191,215,79,224,234,142,196,40,101,59,113,213,70,220,127,14,87,181,74,184,52,92,54,143, + 201,56,157,75,56,17,141,65,92,53,42,49,90,196,42,159,184,186,95,247,24,87,37,118,64,169,86,174,42,193,161,142,163,147,144,234,225,37,184,170, + 121,55,172,118,113,246,58,112,213,136,68,56,1,27,191,131,85,203,52,84,190,106,112,213,178,196,10,229,173,217,193,170,5,212,181,20,127,106,174,118, + 212,0,238,101,52,0,247,64,154,85,70,54,184,42,192,63,110,93,164,168,137,171,66,39,92,49,17,207,144,151,117,45,52,171,239,116,106,199,189,179, + 166,60,141,102,137,211,82,27,125,49,96,232,87,146,98,0,35,37,112,245,34,66,31,221,70,28,97,100,105,78,95,130,147,224,142,128,10,225,188,201, + 73,149,88,231,109,228,213,134,131,244,196,88,167,149,182,77,78,234,132,105,99,57,239,192,73,150,120,165,188,220,156,235,51,58,166,182,23,38,1,100, + 181,181,249,64,92,168,132,121,201,173,125,17,94,250,46,188,20,81,181,103,233,79,151,56,201,69,228,193,4,253,169,19,229,44,148,98,147,147,2,94, + 159,23,210,53,245,167,78,164,179,177,35,122,12,147,48,221,220,240,10,147,8,170,172,226,23,152,130,7,16,5,113,82,188,4,11,227,213,28,179,65, + 47,132,70,231,18,1,111,84,178,38,15,93,226,173,0,107,27,60,108,169,75,60,4,150,52,156,3,214,73,91,10,207,161,156,43,30,42,169,4,132, + 28,60,212,154,91,255,114,60,116,221,120,168,248,139,242,80,158,193,67,217,202,67,222,205,226,48,97,69,205,66,11,142,134,71,237,20,180,226,75,240, + 207,118,180,216,166,179,109,121,59,164,228,149,240,84,39,200,80,210,206,248,126,154,63,252,212,236,225,97,58,31,47,30,6,240,163,165,218,8,230,110, + 33,220,105,89,115,107,183,112,147,87,99,244,161,230,85,162,141,171,207,1,234,10,215,235,233,56,31,140,70,11,140,176,42,214,27,62,45,111,22,15, + 161,104,217,32,215,205,234,212,163,117,201,236,42,161,39,238,184,152,142,15,244,91,208,30,76,210,217,114,175,219,108,93,20,212,235,44,253,156,35,50, + 9,127,246,86,77,17,199,0,104,131,34,132,75,188,87,138,1,157,71,196,13,231,123,143,29,95,22,139,219,237,233,84,77,190,75,175,243,229,77,10, + 78,193,216,180,21,86,209,86,8,20,171,242,209,162,24,231,69,92,0,109,233,225,172,187,70,133,16,186,1,74,229,121,101,85,68,93,110,10,202,152, + 178,191,205,122,162,148,173,221,57,16,219,226,73,198,204,155,76,103,51,244,99,133,159,100,147,13,252,110,243,85,58,78,87,233,182,219,13,69,213,9, + 85,227,201,229,63,62,252,173,14,89,179,236,242,191,22,197,167,109,4,74,21,210,209,98,13,100,213,113,53,229,104,101,151,36,159,233,234,221,244,22, + 83,162,164,186,191,60,222,206,128,248,186,160,81,121,245,249,46,223,118,90,118,187,73,16,108,77,50,28,103,183,83,106,52,252,117,133,165,253,157,6, + 137,66,235,170,211,233,106,150,191,251,79,202,123,235,125,168,176,24,102,80,22,52,234,102,148,14,185,40,222,69,147,160,197,254,114,93,199,198,251,61, + 255,107,250,105,61,234,253,186,202,161,1,138,182,142,73,196,247,59,9,53,247,198,163,209,102,211,44,159,47,79,51,34,52,158,222,3,30,183,183,139, + 249,50,240,164,106,187,28,142,62,15,150,233,16,206,224,112,143,33,101,55,239,170,94,202,84,191,228,118,189,156,102,55,233,108,150,100,95,194,212,170, + 90,205,150,235,209,31,80,96,141,165,209,212,254,57,189,222,225,14,81,103,211,119,227,154,223,21,161,181,214,236,174,56,94,33,36,45,158,232,99,145, + 165,179,19,85,32,45,39,6,26,173,71,163,89,254,71,126,98,48,8,219,201,58,29,230,12,121,185,91,159,168,147,173,239,150,167,184,55,110,171,80, + 210,26,59,83,238,107,115,15,3,52,73,152,99,225,254,184,139,192,72,190,207,4,95,19,218,119,121,1,129,93,158,132,118,91,102,240,63,242,187,98, + 49,94,135,132,211,38,166,159,217,241,135,233,18,222,195,104,221,218,113,145,255,247,122,138,22,79,234,249,223,23,43,176,228,101,251,252,101,117,120,178, + 207,226,66,94,76,239,195,150,18,26,150,47,59,233,95,111,210,34,255,101,54,253,20,51,35,64,175,130,218,230,56,50,178,52,111,135,27,59,20,222, + 174,247,156,134,197,250,238,118,49,206,43,219,191,107,7,103,233,40,135,177,251,72,101,61,30,25,205,202,83,168,70,188,254,169,121,136,58,158,46,239, + 80,227,114,58,39,143,174,225,10,94,107,38,182,145,197,170,197,251,84,28,193,189,38,95,189,74,21,19,94,176,16,255,40,138,188,188,150,23,210,39, + 86,11,225,94,111,207,159,11,136,227,150,171,193,99,209,8,162,188,113,241,133,255,99,160,107,159,8,45,226,116,138,58,83,218,186,68,106,203,227,147, + 251,202,151,227,18,163,26,217,200,31,8,39,167,24,88,113,43,247,143,146,183,39,214,138,9,102,184,211,111,226,76,65,242,35,46,97,134,127,126,181, + 159,118,247,58,148,70,119,94,225,181,88,207,242,203,249,98,254,5,126,208,27,136,219,226,83,120,205,171,231,210,235,188,228,155,87,234,22,187,120,137, + 61,158,143,99,226,31,139,233,252,18,24,207,139,55,183,105,241,41,47,202,94,202,231,193,114,149,22,171,6,229,118,58,110,188,231,243,113,99,220,208, + 213,108,138,63,151,106,67,27,167,240,157,138,2,32,136,107,18,181,60,132,191,100,27,218,118,145,247,211,229,116,52,157,209,75,120,156,229,111,154,72, + 122,179,184,207,139,201,108,241,176,41,143,5,225,46,93,221,68,123,80,71,1,64,55,121,55,112,154,51,124,118,118,143,26,105,166,227,253,6,245,223, + 122,3,193,125,56,1,166,28,69,2,146,99,210,245,222,31,160,71,84,41,108,98,52,83,188,157,136,30,172,73,172,82,218,43,144,93,162,53,115,166, + 199,133,78,172,67,96,121,33,4,224,226,152,213,27,154,116,23,136,233,148,86,66,106,52,223,82,7,74,38,218,10,4,107,189,129,148,232,95,43,25, + 205,202,28,152,235,151,222,51,144,186,159,15,253,3,169,207,70,234,51,247,64,242,31,123,208,113,15,118,133,188,54,5,59,66,222,74,143,168,145,144, + 183,17,169,7,203,232,154,207,232,72,200,7,220,179,112,203,162,35,41,143,136,177,152,71,228,88,206,185,133,13,20,92,219,134,156,183,78,183,33,231, + 91,85,215,48,109,7,149,228,246,106,243,122,19,189,70,246,181,248,76,39,74,150,115,173,236,246,228,184,120,172,169,46,58,27,165,108,237,132,129,45, + 113,182,54,44,45,44,120,253,94,31,168,36,202,115,104,198,109,243,202,248,74,71,7,81,186,121,101,73,134,23,28,234,239,56,31,135,236,42,29,59, + 237,73,74,37,23,175,180,167,111,83,52,88,226,195,199,137,99,208,173,251,218,50,45,150,239,86,22,47,163,79,203,154,216,150,83,1,167,54,225,146, + 57,111,248,133,224,137,238,125,236,41,150,56,11,29,161,75,194,251,158,226,216,127,109,54,53,240,106,41,27,215,209,171,117,14,0,233,41,68,18,154, + 51,229,1,190,68,8,233,185,167,134,2,254,14,172,17,39,170,209,112,151,84,15,120,179,206,106,186,251,84,137,131,219,3,146,74,56,243,138,58,4, + 254,188,245,70,81,99,133,93,225,210,6,170,53,116,165,66,52,152,5,233,237,133,48,137,0,220,180,104,210,172,85,152,4,45,162,166,74,58,160,101, + 94,243,178,207,13,21,78,158,81,90,148,19,178,12,106,241,2,11,15,43,113,6,48,171,94,63,246,194,117,144,196,228,75,2,58,73,132,228,52,225, + 146,32,1,43,207,201,102,110,251,140,104,245,232,31,35,234,118,166,239,155,84,225,24,84,46,104,134,193,81,243,97,237,240,24,141,34,154,87,90,195, + 89,37,26,23,12,126,100,152,140,116,156,27,99,136,157,116,14,205,37,102,172,149,119,198,40,98,59,132,219,90,144,156,118,92,88,114,1,18,174,49, + 127,106,108,18,180,148,206,217,176,147,82,42,99,65,179,82,40,181,217,236,29,116,68,114,95,9,68,51,151,238,176,120,24,215,221,144,188,50,150,190, + 59,182,164,186,126,148,102,215,168,32,212,90,125,15,155,242,85,44,120,119,249,110,200,54,181,82,113,104,81,201,118,121,111,76,155,231,173,214,82,96, + 215,45,36,199,10,31,209,76,2,233,246,198,7,57,229,204,98,199,65,147,76,73,79,216,0,136,56,23,128,53,196,42,129,82,132,131,41,9,132,16, + 94,83,138,21,112,228,45,97,4,146,234,149,55,134,42,122,47,49,58,161,218,25,120,159,28,32,148,30,27,72,234,160,166,125,36,129,163,107,66,4, + 94,91,234,123,146,74,231,96,221,68,68,13,52,19,100,2,104,198,52,137,98,152,64,33,209,20,132,71,6,217,231,40,135,36,4,252,91,11,132,251, + 82,139,105,169,4,11,84,225,181,6,21,52,50,29,218,68,204,128,80,27,1,51,161,35,218,199,54,78,238,203,66,64,255,171,201,136,190,135,193,158, + 223,231,216,206,241,17,175,233,238,241,12,136,119,180,20,7,165,53,140,223,85,50,219,69,91,189,222,179,109,148,32,103,25,255,63,41,170,59,34,70, + 170,218,151,54,142,174,165,181,41,109,40,229,27,104,23,81,223,19,213,194,248,16,180,106,42,25,87,102,132,148,1,172,220,25,81,194,210,67,86,32, + 163,18,250,151,11,39,75,0,35,54,211,78,19,21,225,152,135,31,6,225,129,5,14,118,23,70,1,182,93,105,18,10,230,165,240,65,70,13,41,204, + 82,158,32,204,26,49,28,228,9,98,98,109,168,168,33,60,218,19,77,105,131,129,154,52,120,39,48,61,180,156,154,10,123,6,187,36,76,37,163,27, + 170,135,145,84,210,233,114,28,44,60,28,163,160,84,210,18,233,246,26,30,164,143,104,100,87,181,100,154,153,136,72,154,196,24,39,157,112,113,243,68, + 89,8,164,140,71,169,73,245,116,62,110,137,219,153,191,111,16,49,158,36,254,36,198,67,195,113,95,42,18,15,215,22,147,65,88,164,130,186,129,34, + 193,100,57,53,166,71,73,233,142,193,87,241,210,96,104,216,76,198,5,244,33,237,2,204,164,145,146,116,165,71,189,176,49,204,192,201,182,193,184,162, + 186,181,46,184,68,48,208,14,26,140,146,203,40,99,39,218,255,54,252,68,154,101,171,219,163,148,180,211,110,95,119,107,82,126,246,252,68,248,8,158, + 55,145,206,57,86,196,173,189,32,221,14,181,170,72,47,194,253,134,147,230,164,143,168,239,137,10,39,14,86,38,162,74,75,153,13,90,153,11,48,155, + 145,153,104,144,224,226,192,230,135,46,107,42,184,46,21,220,27,11,42,167,31,91,56,102,228,1,234,182,135,247,13,106,53,20,38,15,199,138,240,191, + 157,81,203,130,158,238,223,232,51,14,43,94,57,79,223,118,255,134,139,63,77,208,252,36,173,57,154,45,178,79,71,252,155,56,214,251,154,86,73,155, + 215,237,12,22,170,27,131,75,234,255,26,6,239,75,176,137,242,45,171,80,151,146,175,224,129,69,41,131,155,232,152,83,58,146,129,209,138,227,104,78, + 134,8,190,84,35,226,214,228,218,9,21,229,62,23,225,202,156,195,101,199,127,186,17,179,215,100,209,142,128,40,218,143,226,250,131,209,190,176,176,171, + 141,31,207,210,191,68,80,253,202,150,237,45,10,54,113,231,7,184,155,144,31,65,95,179,201,54,64,142,50,235,79,6,253,122,47,232,175,51,184,143, + 98,83,30,192,38,107,67,204,110,217,222,88,237,234,62,186,254,8,143,179,116,149,255,124,36,155,179,84,242,20,252,211,150,245,232,192,73,32,202,55, + 189,95,122,240,81,96,79,37,103,209,19,158,241,237,57,196,9,136,112,73,91,119,107,208,54,194,151,125,211,86,2,163,106,219,82,252,120,180,56,43, + 177,82,118,223,82,28,18,218,181,103,92,70,9,148,181,173,133,239,122,24,2,251,201,236,167,32,208,226,225,63,111,187,247,214,67,198,252,170,159,22, + 217,89,97,100,112,25,178,22,87,67,238,91,126,171,100,200,87,135,240,195,205,212,178,180,211,18,158,107,69,13,33,28,153,126,155,80,224,199,77,160, + 58,38,164,234,201,144,54,198,100,168,137,248,18,177,87,160,85,125,170,77,235,143,68,229,85,102,188,160,95,179,87,35,249,196,59,104,2,29,81,75, + 111,218,91,217,160,130,134,232,140,201,224,138,113,230,224,159,145,223,204,173,144,37,173,30,9,84,83,81,213,102,77,225,196,138,123,207,37,11,179,103, + 210,250,16,100,210,216,44,28,208,72,202,162,12,167,68,220,178,224,242,213,180,176,118,3,101,231,84,68,229,178,228,71,104,205,20,167,113,218,248,121, + 32,154,108,85,31,202,30,132,220,57,97,230,166,209,179,194,205,122,228,237,21,131,52,186,252,135,97,142,69,162,7,172,60,246,84,31,94,196,246,55, + 59,199,195,229,99,6,125,47,94,110,64,29,27,139,221,10,219,26,206,66,19,199,69,249,214,34,39,230,132,75,30,137,227,245,83,181,242,254,5,142, + 68,140,160,120,115,62,215,202,41,127,232,190,250,176,151,21,191,196,63,58,247,116,70,106,244,89,87,61,187,106,235,187,56,87,187,147,136,157,172,147, + 122,245,121,151,62,181,3,225,36,111,185,224,247,201,222,143,194,106,215,171,229,7,99,100,222,212,126,147,224,126,237,90,253,182,4,5,219,189,207,99, + 211,56,50,251,104,189,45,233,9,63,192,246,21,192,118,112,195,127,48,253,27,75,184,254,154,18,238,59,73,56,231,201,183,147,112,251,67,194,127,72, + 248,255,43,9,247,45,50,194,95,74,194,17,20,236,70,238,101,46,196,230,79,215,84,202,77,178,164,56,144,91,153,22,197,226,161,127,222,89,240,126, + 68,232,76,148,52,17,220,100,129,245,138,112,75,128,128,203,121,37,233,0,158,254,1,50,231,37,93,35,182,82,185,161,211,113,68,114,20,210,53,95, + 195,229,53,252,110,115,225,232,84,215,146,151,107,132,184,224,26,141,141,179,228,139,135,49,165,65,116,181,71,109,206,100,63,148,218,158,171,181,9,80, + 106,233,251,140,11,187,77,46,135,118,223,83,112,56,251,46,73,103,1,178,111,233,135,35,239,126,250,31,80,75,3,4,20,0,2,0,8,0,121,128, + 249,52,162,251,72,104,220,10,0,0,238,60,0,0,13,0,0,0,101,100,105,116,45,99,111,112,121,46,115,118,103,237,90,91,147,218,200,21,126,223, + 95,65,240,139,167,118,144,250,174,110,230,178,229,216,217,212,166,156,77,213,218,91,121,76,9,212,48,218,17,18,145,196,0,251,235,115,186,37,144,132, + 154,241,48,198,246,110,101,160,166,6,78,159,190,125,231,126,196,245,15,155,69,50,120,208,121,17,103,233,205,16,123,104,56,208,233,52,139,226,116,126, + 51,252,245,227,143,35,57,28,20,101,152,70,97,146,165,250,102,152,102,195,31,110,191,187,254,203,104,52,120,155,235,176,212,209,96,29,151,119,131,159, + 210,251,98,26,46,245,224,245,93,89,46,199,190,191,94,175,189,184,38,122,89,62,247,47,6,163,17,204,44,30,230,223,13,6,3,216,54,45,198,209, + 244,102,88,243,47,87,121,98,249,162,169,175,19,189,208,105,89,248,216,195,254,176,97,159,54,236,107,61,241,114,93,100,171,124,90,45,63,157,182,57, + 243,104,214,176,194,73,214,212,50,97,165,148,143,136,79,200,8,56,70,197,54,45,195,205,40,45,94,181,166,194,1,93,83,9,66,200,135,177,134,243, + 105,92,227,77,2,48,28,61,140,29,109,239,14,208,47,225,111,63,97,143,97,117,215,25,204,212,94,170,75,255,221,199,119,254,142,123,132,188,168,140, + 90,203,236,102,117,246,237,136,35,13,23,186,88,134,83,93,236,183,176,243,215,113,84,222,221,12,153,92,110,236,247,59,29,207,239,202,22,33,142,110, + 134,112,67,134,149,180,223,119,103,24,239,181,8,121,148,84,172,245,194,237,33,70,191,143,244,131,78,186,115,163,108,58,9,11,56,174,127,151,45,180, + 95,198,115,157,151,254,244,161,240,103,185,214,145,46,238,203,108,105,207,13,186,56,207,70,241,52,75,71,229,29,168,137,15,59,36,225,36,209,126,56, + 45,97,143,162,183,176,185,233,205,80,71,113,57,154,102,203,173,183,19,207,254,116,217,170,92,174,202,255,232,77,169,211,234,152,176,81,11,45,59,108, + 166,237,105,195,91,88,224,58,210,179,194,44,84,97,98,190,49,144,191,29,131,81,16,172,14,243,191,231,97,20,131,46,87,124,21,103,119,4,115,130, + 101,61,9,166,21,112,209,29,51,220,163,220,38,112,120,67,132,195,39,89,62,126,53,67,51,164,103,87,150,148,129,0,227,114,59,6,187,173,94,87, + 195,102,110,54,155,21,186,52,152,215,131,173,49,43,68,88,1,54,39,96,242,254,145,237,119,108,132,8,229,92,153,43,69,164,224,98,248,232,145,181, + 52,239,131,35,95,61,105,219,192,185,173,36,1,151,130,208,199,183,157,217,215,211,183,117,44,17,73,120,211,19,192,198,159,0,155,236,183,191,246,187, + 122,240,184,218,236,116,21,206,149,232,41,108,20,38,235,112,91,12,143,235,21,33,92,157,162,86,110,176,28,232,15,157,130,194,39,225,234,218,205,141, + 167,123,55,250,76,24,29,40,17,118,2,74,193,212,188,159,141,18,17,39,161,52,145,230,253,132,221,220,40,17,249,133,148,205,6,173,241,93,174,33, + 200,190,114,224,249,24,220,180,65,102,131,111,134,148,123,74,9,46,201,158,186,5,42,131,56,1,52,210,220,107,67,128,151,122,66,48,213,162,110,13, + 53,240,130,0,5,45,234,188,222,236,215,52,46,33,74,175,10,157,127,48,145,238,95,233,175,133,238,113,125,204,195,180,128,176,186,184,25,150,230,99, + 2,73,205,107,225,97,129,37,21,151,204,67,148,50,140,47,26,40,207,105,161,248,235,89,40,167,95,211,66,57,255,22,186,199,241,227,112,7,93,221, + 163,30,85,2,33,214,209,61,42,60,80,49,74,105,87,247,152,135,3,96,149,93,221,147,30,10,16,149,95,70,247,64,221,185,60,139,238,61,2,90, + 149,126,28,71,141,17,46,63,255,118,139,176,204,227,205,107,136,142,144,44,40,121,185,203,73,218,31,148,12,184,226,151,35,233,113,38,41,65,151,35, + 230,73,133,3,76,47,58,98,35,196,163,72,82,138,59,98,195,18,28,9,193,12,117,197,198,189,64,114,162,88,87,108,202,99,74,18,42,191,36,176, + 54,254,62,134,171,64,103,195,21,192,83,146,35,230,198,21,174,202,196,229,8,244,26,116,85,225,10,87,162,16,62,192,85,128,50,11,164,186,174,24, + 168,66,9,17,136,46,174,144,131,97,140,3,210,193,149,17,216,53,160,28,127,67,92,49,21,28,159,21,88,197,8,118,0,187,203,244,46,77,4,195, + 20,171,86,172,248,19,194,250,41,63,96,112,165,103,117,4,1,1,31,231,118,4,138,4,38,244,130,178,10,201,44,174,144,58,7,95,218,13,92,251, + 166,134,179,159,246,245,163,41,30,163,135,88,175,155,66,207,20,170,245,58,203,112,174,109,188,4,56,171,128,89,15,76,178,60,210,249,110,104,162,205, + 187,51,84,135,212,126,193,176,151,161,89,123,207,5,232,184,198,139,187,48,202,214,128,197,225,224,239,89,182,48,107,51,12,202,75,197,225,240,116,115, + 51,228,160,129,224,103,25,235,13,110,77,181,239,65,8,228,146,247,6,87,121,14,18,29,37,225,86,195,213,236,191,157,4,138,187,108,61,207,13,68, + 179,48,217,99,180,159,106,134,70,147,73,182,49,193,110,213,27,134,74,125,101,186,62,163,85,165,83,117,187,161,197,177,142,83,184,237,168,238,80,200, + 128,30,97,216,181,44,132,82,71,56,54,198,0,217,145,65,184,62,97,61,68,205,229,218,144,87,87,172,21,103,161,203,48,10,203,176,81,146,29,133, + 17,68,119,29,129,60,154,141,127,121,247,227,62,7,155,78,199,255,206,242,251,38,125,50,12,225,36,91,193,217,247,121,161,233,51,76,199,198,120,194, + 242,54,94,192,9,76,127,233,251,205,34,1,117,221,15,116,152,203,237,82,55,139,86,203,238,122,101,206,126,91,52,93,196,102,146,255,161,140,147,228, + 39,179,73,43,87,172,23,141,203,68,223,254,45,138,203,193,219,108,185,181,155,87,180,14,27,220,89,223,18,132,248,8,163,17,230,150,205,210,58,92, + 83,211,58,204,242,219,214,41,13,26,111,230,251,244,176,191,245,155,52,130,89,197,224,231,56,41,138,44,117,29,192,152,112,127,25,203,217,219,209,44, + 92,172,38,191,129,155,236,44,96,192,250,107,56,63,56,133,161,38,241,173,105,34,93,251,245,23,39,199,212,98,211,231,168,104,157,133,237,185,122,71, + 48,56,36,241,84,167,197,167,101,104,47,21,63,128,11,90,44,178,180,176,226,172,231,22,254,100,59,42,66,31,66,135,223,147,229,52,75,193,11,79, + 86,167,138,224,31,225,253,106,50,248,80,106,136,12,249,169,2,232,239,105,121,141,5,180,45,226,253,225,221,91,70,113,226,181,187,160,46,117,14,90, + 94,124,18,84,87,103,249,23,189,204,179,104,101,27,140,93,52,63,115,225,119,113,81,161,226,90,56,215,255,93,197,48,227,89,43,255,156,149,0,201, + 121,215,124,83,30,63,236,103,161,160,243,248,193,138,212,104,67,113,222,67,127,184,11,115,253,38,137,239,219,96,88,213,171,85,109,87,165,182,220,243, + 181,191,243,223,246,219,188,241,235,157,128,183,15,14,73,56,209,201,205,240,189,25,28,224,126,224,203,86,203,69,22,233,122,250,46,30,204,219,217,214, + 28,10,130,38,255,170,11,242,125,225,13,137,138,125,53,5,108,233,202,169,16,230,72,30,203,85,5,134,34,128,195,39,66,16,215,35,98,42,2,10, + 21,173,50,95,46,154,70,68,14,254,168,65,122,107,107,95,155,216,182,219,173,38,130,162,170,80,109,183,104,119,161,151,56,218,160,117,220,198,212,115, + 118,72,205,182,144,228,169,126,79,183,65,1,74,112,198,25,39,87,117,147,162,238,195,206,32,106,117,190,56,122,181,150,156,175,18,61,214,15,58,205, + 162,232,10,44,47,187,215,227,52,75,117,253,185,74,45,90,147,106,178,201,132,65,146,99,80,253,178,77,251,45,139,211,49,104,189,206,175,22,97,126, + 175,243,106,177,234,243,168,40,195,188,236,80,22,113,212,249,174,211,168,179,189,93,42,137,225,223,152,29,158,33,10,33,243,200,243,112,219,153,97,168, + 85,35,102,140,14,103,244,49,120,136,139,120,18,39,134,104,63,38,250,42,138,139,37,40,229,56,78,205,133,174,178,7,157,207,146,108,189,27,111,155, + 76,87,47,114,155,149,114,33,48,87,162,221,3,202,55,213,0,188,57,110,15,216,100,151,11,162,40,58,208,36,108,42,126,198,144,116,104,146,105,16, + 6,66,72,217,215,36,168,150,20,199,156,43,135,38,49,147,214,31,213,164,174,90,140,33,21,122,253,170,223,246,184,56,89,151,94,73,41,67,201,187, + 234,100,43,112,69,21,101,39,232,211,215,209,136,79,137,183,111,196,149,116,251,116,147,52,131,112,17,87,156,31,184,9,143,83,194,49,81,46,225,82, + 40,246,48,234,60,63,170,133,75,164,105,87,4,12,59,133,203,208,147,133,107,193,57,85,144,78,141,16,232,194,45,89,65,255,68,146,53,102,136,42, + 135,206,186,146,10,60,4,14,29,43,116,154,67,39,248,184,67,7,73,201,23,135,254,167,112,232,47,178,249,230,178,113,217,15,119,89,28,234,91,220, + 99,134,122,196,182,141,39,96,59,79,240,168,191,144,21,23,63,139,191,48,171,29,247,23,156,188,248,139,23,127,241,34,155,103,251,11,246,180,8,253, + 60,127,65,200,206,19,60,230,47,204,35,15,71,193,248,92,127,65,31,245,23,226,197,95,252,17,253,197,181,63,119,182,57,48,145,130,54,205,134,101, + 88,222,245,228,119,172,40,179,207,160,206,84,149,237,230,145,243,167,238,79,79,210,155,155,3,52,255,28,96,238,161,128,40,38,46,33,67,231,8,73, + 78,6,239,7,140,121,10,138,102,138,91,212,183,3,198,61,194,56,10,218,84,160,49,165,8,15,12,45,224,84,49,222,166,153,135,110,146,18,102,214, + 220,83,169,244,8,229,66,138,106,205,154,202,96,62,38,152,202,1,140,11,172,24,3,154,128,74,78,6,1,29,80,1,115,48,84,117,45,218,251,214, + 233,27,234,219,1,100,24,1,15,8,106,83,129,198,17,69,196,144,136,132,205,113,139,100,234,125,108,215,219,145,154,131,191,109,17,247,55,108,118,104, + 144,112,33,249,251,192,225,64,48,233,186,169,230,193,95,22,105,243,76,164,184,25,78,119,175,179,150,203,112,43,238,112,188,112,114,142,136,226,216,85, + 46,131,186,49,20,8,230,46,151,85,64,153,171,23,130,57,97,236,171,215,203,246,65,252,133,219,232,228,31,186,94,62,240,73,71,52,226,0,104,51, + 137,16,220,179,105,99,43,4,41,44,43,253,55,15,253,65,141,141,213,113,76,169,181,10,41,192,252,152,177,62,137,64,247,241,101,245,192,31,209,192, + 208,56,226,148,40,99,167,230,199,27,196,218,62,245,20,3,133,183,118,202,4,108,171,6,198,98,153,144,8,44,90,121,96,154,96,208,176,181,160,18, + 49,101,72,76,50,25,152,157,251,68,26,84,225,218,30,17,85,71,116,29,187,99,64,71,149,200,17,105,29,218,97,126,8,248,28,79,46,192,147,179, + 207,247,228,255,7,217,186,51,178,54,153,17,136,148,98,137,3,151,188,28,46,224,36,211,55,191,180,115,180,202,204,75,126,83,41,61,93,58,61,169, + 124,94,126,94,185,130,192,19,16,218,56,132,77,230,81,200,75,133,137,104,96,134,136,97,76,217,37,51,191,111,197,130,66,208,6,7,160,148,64,204, + 184,2,172,36,0,103,140,158,194,39,201,141,209,83,28,40,197,141,43,192,224,52,136,84,216,80,1,94,196,7,246,199,179,24,7,150,145,147,128,41, + 108,183,6,19,230,150,141,35,105,55,238,209,128,34,185,132,48,98,142,194,33,117,86,204,121,232,94,36,173,156,31,11,158,16,72,31,111,52,40,103, + 163,225,212,126,199,19,26,147,132,4,248,165,112,120,105,52,188,200,230,121,141,6,176,31,234,40,213,149,249,245,29,161,244,233,141,6,151,109,155,22, + 2,125,82,163,33,56,167,191,192,129,121,212,24,32,226,190,47,127,241,23,47,254,226,69,54,207,246,23,193,89,26,147,71,252,5,197,135,254,162,110, + 64,217,127,215,230,55,147,183,223,253,15,80,75,3,4,20,0,2,0,8,0,125,128,249,52,153,109,230,156,183,23,0,0,27,89,0,0,12,0,0, + 0,101,100,105,116,45,99,117,116,46,115,118,103,220,92,105,115,219,86,150,253,158,95,193,97,190,68,213,36,248,246,69,182,220,229,216,157,174,76,37, + 51,85,157,164,102,190,165,32,18,146,216,166,8,54,72,89,82,126,253,156,243,192,5,32,33,89,155,99,247,80,149,50,121,241,214,187,158,123,223,67, + 94,255,245,230,114,214,251,88,84,203,105,57,63,233,203,76,244,123,197,124,92,78,166,243,243,147,254,111,191,254,48,12,253,222,114,149,207,39,249,172, + 156,23,39,253,121,217,255,235,155,111,94,255,199,112,216,123,87,21,249,170,152,244,174,167,171,139,222,143,243,15,203,113,190,40,122,223,93,172,86,139, + 227,209,232,250,250,58,155,174,137,89,89,157,143,142,122,195,33,122,46,63,158,127,211,235,245,48,237,124,121,60,25,159,244,215,237,23,87,213,44,181, + 155,140,71,197,172,184,44,230,171,229,72,102,114,212,223,53,31,239,154,95,23,167,89,85,44,203,171,106,92,15,63,30,55,91,86,147,179,93,83,172, + 228,90,167,70,50,198,56,18,106,164,212,16,45,134,203,219,249,42,191,25,206,151,223,54,186,98,129,93,93,149,16,98,132,103,187,150,15,107,117,124, + 51,3,27,238,92,76,122,218,156,29,172,95,224,191,109,135,45,15,235,189,158,161,103,145,205,139,213,232,253,175,239,71,155,214,67,145,77,86,147,198, + 48,155,94,173,121,91,226,152,231,151,197,114,145,143,139,229,118,138,212,255,122,58,89,93,156,244,77,72,191,46,138,233,249,197,106,251,115,58,57,233, + 99,119,74,135,160,19,97,179,128,227,173,10,137,76,171,186,237,122,212,230,35,163,255,50,41,62,22,179,212,160,165,117,173,193,38,229,248,52,95,98, + 241,163,139,242,178,24,253,115,122,121,153,143,71,203,106,60,26,127,92,142,160,141,231,229,112,58,46,231,195,213,5,20,101,132,105,102,249,233,172,24, + 229,227,21,6,92,30,12,198,189,158,244,139,201,116,53,28,95,173,178,141,124,182,43,44,110,22,101,181,26,158,77,103,69,221,180,158,247,60,175,170, + 98,181,26,109,59,46,230,221,29,111,38,11,8,44,138,206,135,183,155,135,111,240,244,245,164,56,91,178,85,205,75,254,34,51,109,122,136,199,208,134, + 34,175,254,94,229,147,41,12,160,110,216,24,114,92,206,102,197,24,242,200,103,215,249,109,189,209,205,88,237,174,74,185,184,30,20,195,46,87,229,98, + 211,22,172,89,221,206,176,73,18,135,24,177,172,142,191,21,233,243,42,145,74,104,197,116,117,123,44,95,245,119,125,202,179,179,101,129,137,69,131,150, + 180,1,61,148,242,178,223,27,61,111,54,209,53,155,236,158,77,111,103,123,61,106,111,251,229,217,104,31,195,198,152,139,241,51,216,232,30,199,198,174, + 217,30,193,70,247,167,178,81,62,130,141,147,51,149,171,252,201,108,180,250,81,108,236,154,237,17,108,180,246,137,108,236,224,146,122,140,178,21,138,127, + 79,230,146,126,156,178,77,2,255,30,48,91,55,151,244,39,149,141,191,242,217,62,151,206,215,191,127,155,79,87,136,184,87,203,162,250,133,81,235,191, + 231,191,45,139,254,126,171,95,171,124,190,68,136,188,60,233,95,230,171,106,122,243,29,98,75,250,12,196,193,23,60,146,66,215,95,132,143,46,22,67, + 25,6,8,165,210,198,32,228,209,118,244,234,164,239,51,21,76,80,65,109,137,227,219,147,190,210,153,214,24,33,236,168,55,96,128,179,153,112,82,152, + 150,65,180,183,39,93,176,226,46,89,111,184,198,70,170,127,175,84,254,246,131,182,218,118,202,252,78,225,54,135,55,247,15,159,155,14,71,221,41,243, + 157,112,219,27,253,164,9,252,239,207,63,253,248,254,247,16,253,239,253,199,201,252,70,66,0,81,101,209,99,35,91,234,45,168,38,243,54,42,239,245, + 174,173,98,91,151,69,29,125,220,181,5,85,138,204,75,105,160,158,119,112,171,203,136,186,4,193,207,187,14,213,55,86,196,123,252,81,151,213,116,12, + 127,150,62,247,88,95,115,186,103,56,164,69,190,186,208,74,139,223,213,83,196,33,157,11,153,119,198,181,196,33,131,205,180,144,222,181,196,33,157,143, + 25,12,109,79,28,222,102,62,108,208,229,167,76,91,73,29,218,166,13,11,181,248,50,148,153,243,18,96,124,96,92,230,149,83,118,96,140,207,162,49, + 234,232,153,130,254,33,125,186,56,31,189,127,182,156,223,253,192,191,238,209,227,51,197,170,165,252,93,62,73,172,70,137,204,26,111,90,98,29,90,145, + 69,25,141,54,109,185,178,177,179,70,181,228,58,164,176,61,218,202,7,8,86,101,194,202,61,159,13,117,161,56,225,157,161,50,36,97,196,152,41,97, + 226,64,41,56,112,175,204,115,37,251,206,188,197,192,221,188,23,207,150,108,180,254,237,93,163,171,167,197,198,157,251,180,13,115,237,14,65,221,225,170, + 51,178,125,222,96,122,191,218,61,211,9,239,71,195,13,143,131,84,159,142,135,0,41,241,254,241,199,81,230,242,97,184,244,249,14,223,140,205,248,1, + 14,63,72,243,220,224,107,236,83,188,2,92,61,188,181,138,186,229,21,96,139,70,153,32,108,203,41,120,147,217,224,165,13,45,167,160,124,22,180,131, + 97,63,83,236,223,191,253,254,253,247,174,131,55,174,17,10,159,42,136,59,3,187,139,254,51,229,79,169,38,116,124,81,21,103,39,253,111,187,34,242, + 97,234,0,175,27,26,1,246,249,168,25,161,213,7,57,88,199,84,19,237,58,166,74,175,241,13,177,53,67,74,55,208,81,102,86,171,163,207,134,2, + 182,12,254,115,89,25,204,103,96,101,11,165,236,115,84,131,61,53,71,13,57,42,254,157,88,186,7,44,186,89,26,213,139,177,148,248,64,68,231,247, + 240,129,140,190,198,7,33,6,51,24,50,195,5,57,14,240,40,115,78,199,163,207,8,106,94,148,169,135,94,185,131,165,206,55,162,85,202,133,96,146, + 202,234,24,219,254,88,103,1,43,212,178,157,11,153,76,70,97,76,91,71,48,66,112,34,10,255,64,73,125,134,77,91,245,137,77,187,189,77,211,92, + 34,32,84,219,48,84,38,225,14,197,126,2,232,65,182,210,182,13,131,160,40,186,175,119,203,33,190,156,51,210,153,83,198,232,208,1,224,182,143,134, + 82,88,141,208,30,241,205,65,121,252,190,51,98,34,237,157,220,83,52,240,92,72,5,13,60,224,185,143,65,169,253,164,59,26,7,68,240,37,248,25, + 141,123,73,126,194,183,71,221,201,79,227,133,246,54,241,211,101,82,186,196,79,81,103,42,251,252,52,193,73,217,230,167,205,172,112,81,186,131,34,6, + 48,151,104,235,112,204,160,237,209,42,245,57,248,217,42,205,116,50,180,81,126,121,46,67,135,112,76,202,67,187,58,56,138,71,64,139,66,14,36,20, + 53,131,254,128,161,50,131,27,139,246,232,179,85,133,190,8,67,253,203,89,188,65,172,212,70,249,251,248,9,54,2,29,32,115,250,183,99,104,87,81, + 245,30,206,122,161,194,11,2,59,233,16,101,186,124,41,220,91,4,194,3,28,177,48,124,37,165,28,192,196,133,128,133,22,195,61,180,172,99,70,95, + 218,132,22,228,45,194,154,17,81,171,22,111,135,154,216,112,63,130,81,104,192,60,194,168,47,224,78,225,227,204,159,203,82,5,48,231,136,254,238,100, + 41,66,122,0,18,106,131,101,131,161,92,240,182,205,81,32,67,47,68,203,247,82,135,51,173,156,82,222,127,25,134,250,39,100,227,132,54,38,24,219, + 218,51,0,48,98,143,83,237,61,43,40,37,216,166,219,90,4,224,235,189,9,193,191,156,156,140,22,30,48,2,249,142,179,112,233,71,47,203,205,142, + 179,179,251,142,214,26,219,77,46,141,89,88,16,170,205,48,168,20,80,163,51,97,31,45,195,234,154,24,83,37,96,13,163,181,250,139,128,229,199,238, + 221,127,37,123,191,163,142,249,2,86,212,30,89,169,70,161,153,5,81,141,109,32,33,136,178,85,16,213,30,24,171,89,15,61,235,108,122,214,213,180, + 58,233,135,76,195,94,130,215,207,46,157,130,241,205,10,1,108,71,197,104,165,57,250,26,148,203,202,251,79,246,247,148,43,6,32,223,230,193,229,109, + 237,146,45,118,20,246,179,131,128,140,51,154,176,159,145,65,57,99,35,57,253,146,155,191,223,178,156,253,90,54,255,18,166,213,113,133,232,62,27,243, + 182,101,99,140,43,161,73,131,217,24,137,180,210,182,236,107,191,217,217,97,179,138,181,45,88,69,131,244,36,203,226,93,52,171,156,24,32,55,5,46, + 85,174,64,10,54,80,24,58,56,225,31,103,92,175,71,188,172,149,190,109,175,150,241,178,216,228,227,180,184,222,221,232,226,189,181,245,184,139,252,188, + 72,69,100,112,182,62,191,93,63,56,45,171,73,81,109,30,185,244,105,61,90,23,252,121,99,78,234,250,179,126,190,149,39,7,111,52,19,93,207,151, + 23,249,164,188,6,199,247,31,254,81,150,224,31,96,163,150,218,111,125,218,78,87,232,5,193,50,228,13,242,240,97,125,144,36,236,182,192,184,123,116, + 85,85,224,226,112,150,223,22,216,89,250,103,227,59,150,23,229,245,121,69,14,173,170,171,98,191,231,164,28,95,241,198,231,240,170,150,192,226,102,191, + 5,251,14,79,79,203,155,214,0,164,22,151,11,222,99,76,23,86,77,131,190,42,103,5,148,101,92,144,63,246,112,196,235,233,28,220,25,174,239,59, + 74,177,197,128,251,45,54,119,32,1,227,197,29,77,200,48,31,238,120,120,187,59,192,88,174,170,242,3,22,180,190,88,177,223,129,76,106,10,238,44, + 159,237,244,239,178,88,229,147,124,149,239,116,109,67,225,13,194,176,185,65,88,77,206,142,255,241,254,135,237,161,199,120,124,252,63,101,245,97,119,126, + 193,6,249,105,121,133,29,109,207,93,120,49,113,124,76,179,202,87,111,166,151,88,2,47,177,254,229,230,114,6,181,223,62,104,53,94,221,46,138,221, + 160,245,176,155,11,185,157,151,122,39,227,203,41,59,141,126,89,77,103,179,31,57,73,227,112,102,61,232,116,53,43,222,252,109,50,93,245,222,93,173, + 210,220,53,169,213,106,204,139,199,101,245,166,49,61,183,249,246,124,123,242,114,56,230,223,235,187,156,189,159,138,222,47,152,185,107,104,218,248,225,48, + 169,229,193,140,28,120,121,117,250,79,184,212,214,0,228,194,247,249,249,222,42,72,157,77,223,240,30,233,235,209,250,71,103,139,241,213,167,26,204,166, + 139,211,50,175,38,93,205,106,90,107,250,180,250,131,133,146,91,179,233,184,152,47,63,45,194,180,245,233,71,120,178,203,203,114,190,76,210,92,247,93, + 142,78,111,135,243,241,112,153,143,224,45,70,7,210,28,151,115,120,232,211,171,199,202,234,63,243,15,87,167,189,95,86,5,194,81,245,88,73,29,206, + 153,218,210,6,154,54,241,211,254,246,27,102,241,248,157,183,89,187,40,42,168,250,242,147,172,237,186,195,254,143,98,81,149,147,171,116,145,185,205,208, + 103,14,252,126,186,172,25,211,53,112,85,252,235,106,138,30,79,26,249,191,202,21,184,242,178,99,190,93,221,189,88,48,232,98,122,250,84,62,188,131, + 52,17,124,1,100,154,240,233,69,56,92,84,211,143,73,99,168,108,203,151,101,200,47,23,121,85,188,157,77,63,52,215,156,52,123,173,201,219,27,0, + 59,255,255,122,180,137,16,233,215,249,46,114,180,66,243,54,252,204,242,211,98,118,210,255,137,15,123,242,48,2,151,87,139,203,114,82,172,187,111,2, + 14,143,0,191,105,159,159,159,193,193,31,195,245,127,247,109,71,173,248,232,85,29,5,143,191,69,212,202,131,93,255,172,3,241,177,220,252,100,79,204, + 123,140,89,231,147,38,241,159,229,116,222,166,66,98,69,53,155,226,159,99,179,161,77,114,4,209,170,202,111,143,231,229,188,216,80,183,55,41,182,208, + 15,204,248,185,135,148,79,122,163,165,28,16,135,154,24,163,239,189,35,85,7,128,198,68,141,188,89,98,73,179,81,90,15,146,199,102,156,140,36,241, + 132,35,26,208,2,178,98,161,216,215,102,134,215,134,226,192,0,71,69,43,180,239,105,228,6,46,122,207,202,21,70,85,0,87,61,164,149,90,73,109, + 205,32,176,131,212,42,176,183,206,76,180,22,189,165,201,48,180,85,61,21,177,6,47,148,28,40,137,228,208,88,103,123,64,210,1,75,181,113,160,124, + 230,129,116,185,234,84,221,49,66,106,18,131,87,210,163,179,201,64,241,90,145,134,209,100,208,61,96,56,103,60,210,146,68,115,49,58,118,86,188,54, + 132,108,52,129,100,96,34,223,83,124,107,67,11,151,198,243,222,26,76,12,112,30,21,25,70,154,210,128,130,236,171,179,232,131,70,95,60,118,193,96, + 28,174,90,0,99,178,102,15,40,43,141,193,196,93,204,254,163,215,223,191,174,198,3,221,70,253,237,17,90,198,122,199,209,43,62,109,220,156,89,235, + 92,83,25,214,10,151,41,251,133,116,78,193,0,148,134,134,40,91,171,155,176,30,34,6,193,90,111,172,138,84,132,160,163,18,97,0,169,42,17,141, + 34,201,9,229,163,6,201,48,69,34,235,35,122,216,168,195,128,39,159,16,135,143,212,3,99,132,15,134,226,136,66,104,12,7,213,225,113,149,71,14, + 100,179,117,87,38,1,84,91,146,130,15,178,22,57,212,75,24,63,80,142,7,92,42,202,212,206,209,10,72,179,206,71,167,107,125,65,186,107,162,34, + 213,59,27,76,173,88,176,155,144,104,81,6,52,166,2,122,227,188,75,180,245,196,33,179,216,175,5,9,26,198,66,161,233,33,233,144,81,57,157,244, + 94,98,81,65,209,146,162,209,194,132,1,212,84,105,137,134,100,22,76,40,88,43,35,168,48,204,40,48,49,104,26,186,13,77,197,188,96,129,18,50, + 245,142,202,8,210,28,0,124,109,216,96,141,3,104,246,96,33,166,5,191,20,185,31,21,148,219,128,251,145,85,48,37,107,7,0,101,162,136,164,229, + 178,127,74,52,41,131,76,98,67,130,140,60,178,166,54,133,121,135,58,55,46,112,46,202,217,237,121,57,127,176,223,132,179,185,75,165,119,175,129,52, + 180,154,21,62,152,155,112,225,79,214,237,180,223,122,115,198,202,70,93,114,129,105,152,218,241,68,88,24,99,52,117,85,11,228,229,80,153,8,209,197, + 104,224,18,52,88,110,188,163,235,128,202,195,29,74,234,130,103,197,160,199,195,126,56,49,163,216,204,121,40,128,74,205,60,207,146,7,60,186,114,188, + 211,208,235,154,98,187,142,213,203,29,226,62,197,57,165,243,231,199,120,167,122,37,82,125,9,31,149,44,147,151,167,105,201,60,60,129,241,200,152,33, + 124,68,145,226,134,177,48,153,144,104,17,110,23,182,12,135,143,120,7,95,3,175,99,130,84,62,209,162,86,48,126,246,14,16,106,136,38,14,180,64, + 252,129,9,251,158,164,9,123,132,134,129,134,51,134,36,16,78,36,175,165,74,204,156,234,16,50,121,12,210,60,98,175,36,17,243,58,35,73,131,123, + 82,176,111,248,69,29,165,241,134,115,232,117,215,168,55,107,230,161,42,252,30,102,240,81,166,152,40,120,104,30,156,227,74,116,12,52,120,56,57,15, + 119,197,13,135,44,72,108,61,214,46,146,119,142,67,32,85,43,97,17,42,225,248,172,85,28,145,209,83,58,227,18,45,241,202,239,252,178,98,165,41, + 197,73,7,71,110,141,73,115,240,72,176,118,143,1,234,140,150,135,124,222,247,32,181,69,241,50,136,123,170,218,121,243,21,34,47,24,40,140,86,196, + 216,66,94,160,122,248,118,200,102,135,188,36,57,46,240,173,1,189,104,222,198,227,121,19,122,193,15,120,1,15,210,132,94,1,62,66,198,208,130,94, + 145,213,87,40,143,111,65,47,122,22,229,28,90,110,161,23,116,76,67,43,92,19,121,193,46,17,216,116,27,121,97,17,210,71,235,154,200,139,171,230, + 90,90,192,11,254,46,88,221,2,94,152,12,42,141,105,119,192,203,193,188,116,8,177,1,188,216,3,14,80,248,22,240,226,225,60,120,215,4,94,50, + 141,194,192,188,3,94,93,188,238,214,51,190,68,242,100,236,101,191,126,236,69,253,162,122,249,13,246,162,34,1,222,192,129,89,30,254,0,222,104,234, + 145,242,112,189,142,58,67,163,55,150,52,33,232,181,6,59,35,79,225,73,163,215,32,213,238,133,134,163,163,243,243,22,105,1,193,141,244,112,111,129, + 98,2,110,0,181,70,80,181,131,96,184,131,115,215,201,25,40,1,60,78,85,112,80,0,246,5,102,129,246,192,69,42,2,21,11,191,65,218,214,187, + 0,195,1,151,83,9,241,13,33,80,164,134,8,84,240,112,164,9,76,44,211,128,128,102,136,197,3,149,142,182,146,174,210,251,9,171,176,104,232,42, + 48,63,253,38,156,143,1,234,138,12,165,138,23,138,21,205,65,4,15,55,14,78,185,245,162,73,131,190,193,58,1,84,5,32,147,72,186,133,241,8, + 35,137,238,149,148,180,155,54,151,59,65,145,211,246,14,61,219,212,216,89,50,60,233,231,213,184,191,167,130,59,253,106,191,85,124,15,136,210,135,32, + 42,253,172,174,102,73,61,255,40,170,242,229,180,245,50,175,62,20,85,61,80,253,125,184,92,229,213,170,69,185,156,78,90,191,139,249,164,53,245,195, + 117,157,212,250,78,251,177,56,208,255,87,31,167,203,233,233,116,198,31,233,235,172,120,53,153,46,23,200,228,143,167,115,46,252,85,249,177,168,206,102, + 229,245,230,121,23,132,109,92,35,221,10,40,29,253,192,167,65,121,149,233,120,124,219,117,9,117,251,184,186,97,121,30,249,179,197,159,238,120,126,219, + 249,188,134,39,155,91,172,189,237,4,189,183,189,93,235,214,215,30,192,66,175,183,189,36,59,120,120,151,142,89,254,184,7,78,98,4,24,126,39,156, + 108,28,85,33,137,0,208,229,197,101,111,144,188,28,61,215,10,120,201,2,6,8,136,113,167,57,28,30,223,221,99,13,197,199,98,94,78,38,247,88, + 195,190,41,156,94,173,86,7,150,144,212,247,255,157,37,32,241,243,119,24,194,222,225,102,203,12,246,78,57,91,54,176,127,222,217,50,0,102,230,182, + 173,251,70,211,167,214,35,66,131,215,221,123,169,229,70,115,125,70,24,124,127,155,214,56,247,169,53,189,159,19,136,124,93,199,172,65,2,122,199,193, + 16,51,198,168,163,25,32,13,224,133,52,121,135,94,111,24,137,20,81,135,254,67,49,44,83,177,59,179,224,237,171,202,247,6,126,32,41,230,39,154, + 160,95,1,255,105,83,7,67,128,76,152,97,202,54,36,96,149,78,48,61,58,133,96,168,29,171,108,193,74,50,16,233,137,214,129,60,85,8,219,129, + 208,77,2,50,32,239,244,192,155,188,178,11,223,209,3,230,210,30,230,13,18,114,27,32,7,68,82,176,134,52,64,55,67,1,0,143,166,74,31,75, + 51,200,61,248,126,106,38,173,96,116,102,97,78,2,238,169,129,142,201,170,181,234,1,49,216,104,0,67,7,44,84,0,21,36,156,28,137,50,48,164, + 77,217,20,122,33,11,145,188,26,139,12,44,229,48,22,248,214,152,206,109,255,209,251,153,75,15,6,32,32,48,123,66,154,44,82,109,133,35,32,232, + 155,148,65,41,103,107,220,163,211,75,44,104,7,120,97,1,83,98,42,37,41,230,79,188,57,164,165,224,138,0,139,164,19,200,135,184,118,44,23,88, + 27,52,128,24,38,225,3,163,18,186,82,6,128,60,70,169,88,235,210,228,11,176,13,39,70,26,164,156,54,129,212,8,80,18,36,193,6,145,106,176, + 236,140,93,27,48,3,203,54,54,4,46,59,98,99,220,108,157,30,26,165,165,78,2,3,246,85,235,36,18,216,135,203,70,116,242,34,118,110,25,200, + 228,73,57,21,239,62,62,4,236,222,165,140,233,106,85,146,29,52,78,37,44,15,204,100,8,33,83,126,28,129,208,36,185,2,64,39,140,172,115,97, + 175,133,3,243,161,136,22,220,79,187,0,50,213,228,31,228,141,141,177,18,205,253,82,95,52,104,200,153,68,162,1,173,33,17,176,20,8,48,42,244, + 2,147,88,86,255,60,141,192,242,253,22,224,64,48,38,93,138,12,2,110,1,118,1,88,71,4,39,128,33,21,242,79,104,34,152,134,212,56,82,72, + 72,79,140,224,186,1,29,5,51,31,104,113,128,242,74,75,9,35,233,71,214,69,125,135,230,178,88,195,173,112,171,154,52,12,107,141,170,247,44,165, + 80,186,238,141,88,11,176,188,126,43,67,199,181,42,32,203,75,122,137,204,78,91,210,176,81,230,255,181,249,33,1,215,158,10,98,188,135,77,178,66, + 131,220,156,230,7,191,6,47,4,238,240,85,6,66,115,199,173,32,207,210,206,212,229,8,104,104,12,224,35,108,59,221,17,97,177,192,70,11,200,158, + 76,13,214,18,124,42,91,64,171,107,15,33,157,21,65,214,26,167,61,235,21,44,43,8,85,39,139,208,47,94,79,77,166,6,27,103,37,228,64,206, + 201,246,120,108,128,44,55,85,61,16,182,125,74,124,169,186,44,213,215,133,10,128,246,84,206,128,55,48,193,39,227,67,34,24,44,103,142,138,169,9, + 4,8,19,116,201,141,145,8,195,213,154,18,196,6,44,121,230,120,171,83,232,218,84,96,163,72,114,177,68,184,182,40,18,123,172,128,251,112,53,170, + 247,158,26,71,62,70,161,60,210,102,94,44,54,73,161,12,171,157,164,66,245,44,228,106,117,162,241,250,136,119,73,245,36,156,27,114,217,154,106,20, + 180,2,30,79,8,190,71,66,113,65,30,176,52,172,70,194,251,168,52,9,44,211,37,39,232,216,80,197,122,145,206,24,56,24,42,148,132,27,137,201, + 189,68,130,165,216,99,118,171,225,117,3,37,19,120,54,83,59,13,216,134,118,137,61,90,90,45,66,90,55,55,147,234,61,224,34,229,146,220,43,148, + 33,177,27,219,87,174,118,117,76,251,180,76,212,0,201,166,150,248,102,85,221,18,156,215,170,75,88,221,53,222,198,255,8,169,229,74,234,146,63,194, + 130,198,174,77,59,250,248,140,47,179,89,221,140,62,169,92,20,91,209,71,65,128,86,7,213,10,62,232,226,60,223,248,219,5,31,154,47,198,16,205, + 224,3,157,15,209,240,232,169,25,124,146,168,144,219,185,70,240,193,55,77,215,43,27,193,7,19,98,16,79,142,52,130,15,44,6,126,93,55,99,79, + 138,14,65,105,221,136,61,93,155,166,254,211,144,96,91,177,21,122,120,184,161,180,65,158,187,13,61,96,128,227,251,120,161,17,123,48,181,131,22,82, + 108,141,216,67,195,150,78,26,217,136,61,160,25,143,47,161,17,123,240,84,152,218,91,53,130,15,217,38,32,248,70,236,209,233,85,76,190,159,185,139, + 61,44,61,122,77,193,52,66,15,57,0,188,131,89,182,177,7,36,111,235,144,187,141,61,29,91,110,104,209,65,180,57,188,210,250,100,240,179,213,80, + 24,190,127,234,41,4,175,122,222,181,130,206,230,206,30,29,156,74,120,158,213,132,248,69,79,37,132,236,56,149,128,151,33,190,109,157,74,80,37,68, + 251,80,130,119,54,189,140,205,67,9,218,9,113,93,243,80,2,209,4,89,166,108,29,74,28,206,112,255,161,196,211,222,212,123,90,117,24,222,225,225, + 101,187,47,38,198,58,235,119,245,97,92,42,159,214,245,125,150,199,16,125,1,39,21,207,23,156,102,45,159,199,71,112,28,174,166,33,74,203,84,101, + 149,53,50,54,187,158,24,43,29,82,4,94,163,139,28,223,3,62,200,228,255,211,129,162,164,143,102,152,0,167,233,112,25,51,125,125,132,9,215,22, + 117,178,113,164,15,78,37,47,45,36,223,32,166,175,132,79,213,66,39,207,93,31,102,212,243,215,30,195,50,218,164,168,5,132,194,40,202,115,18,132, + 188,20,139,60,235,117,138,51,164,243,128,228,99,55,199,166,136,88,74,90,174,216,67,201,88,244,171,55,168,210,1,5,58,254,95,41,231,146,20,49, + 12,3,209,253,156,133,42,172,248,39,87,81,92,135,251,223,128,215,173,192,134,97,3,219,204,76,18,75,178,251,117,228,9,114,175,59,190,71,250,213, + 62,169,39,140,44,118,213,178,184,178,123,172,112,82,79,7,51,39,35,236,63,227,251,107,47,98,181,191,114,243,149,255,224,102,73,67,226,154,182,17, + 107,0,50,189,34,74,81,238,102,240,90,27,48,29,138,40,99,139,10,41,200,178,71,214,150,4,147,37,231,73,248,101,238,18,225,211,82,127,202,23, + 81,1,40,80,132,122,64,106,241,152,167,142,154,213,97,53,35,185,145,47,254,63,17,82,105,23,167,151,94,64,61,54,219,72,75,132,111,18,2,79, + 11,15,158,216,253,100,148,133,121,211,172,49,92,58,119,222,221,104,22,135,105,160,66,171,212,197,208,182,16,190,55,12,202,172,41,162,118,4,71,196, + 196,96,134,74,59,181,30,149,232,1,8,133,222,12,6,169,149,94,79,128,89,61,234,46,167,100,5,79,148,57,172,100,40,53,233,215,111,1,102,180, + 145,171,112,110,125,94,223,156,106,148,111,13,90,177,69,28,185,6,238,62,135,113,147,138,27,181,73,5,247,169,86,90,87,89,35,188,240,129,132,57, + 85,24,54,138,34,143,58,6,120,79,137,163,2,62,113,208,213,192,199,40,28,25,157,144,83,208,246,4,185,17,88,60,134,142,121,83,194,112,204,200, + 129,152,79,34,235,167,111,181,65,6,82,178,75,26,167,183,176,184,2,215,163,56,131,180,174,243,180,80,110,244,80,31,241,120,134,195,74,235,156,218, + 127,65,208,154,74,64,132,24,231,234,222,62,160,57,108,43,204,189,241,43,229,166,29,86,133,171,166,174,82,82,52,164,191,165,234,150,68,80,16,89, + 101,140,68,41,150,46,42,140,132,168,65,125,30,187,212,33,194,137,74,34,96,155,179,108,200,216,212,15,121,208,6,8,97,182,155,131,83,95,154,55, + 195,233,94,88,131,122,253,180,233,229,6,91,185,222,49,228,14,186,214,8,232,184,171,38,240,60,33,246,40,255,51,183,142,225,28,102,61,126,80,143, + 43,246,54,10,113,234,229,45,39,68,132,50,242,101,186,122,110,14,228,134,96,66,245,29,10,67,222,51,110,83,245,246,250,106,154,44,207,174,196,90, + 185,122,144,73,240,201,171,223,226,122,10,130,194,238,244,123,73,108,171,144,114,113,198,240,108,197,170,180,225,192,226,191,250,210,37,200,232,42,54,134, + 44,47,215,109,119,235,214,238,247,210,34,207,121,52,5,153,241,203,196,191,48,199,208,241,179,52,63,167,246,239,215,196,188,189,126,188,63,222,180,247, + 249,253,241,9,80,75,3,4,20,0,2,0,8,0,136,128,249,52,38,221,82,145,115,17,0,0,142,92,0,0,14,0,0,0,101,100,105,116,45,112, + 97,115,116,101,46,115,118,103,237,91,89,115,219,72,146,126,247,175,224,208,47,173,24,18,172,251,160,45,77,244,184,183,55,102,194,211,187,209,71,236, + 51,4,66,18,218,36,161,5,160,171,127,253,102,22,174,194,65,153,148,104,89,59,109,202,14,17,137,172,43,243,203,163,178,74,239,255,118,191,89,79, + 110,227,44,79,210,237,233,148,6,100,58,137,183,81,186,74,182,151,167,211,223,126,253,113,110,166,147,188,8,183,171,112,157,110,227,211,233,54,157,254, + 237,236,205,251,191,204,231,147,15,89,28,22,241,106,114,151,20,87,147,127,108,63,229,81,120,29,79,190,187,42,138,235,229,98,113,119,119,23,36,21, + 49,72,179,203,197,201,100,62,135,150,249,237,229,155,201,100,2,195,110,243,229,42,58,157,86,252,215,55,217,218,241,173,162,69,188,142,55,241,182,200, + 23,52,160,139,105,203,30,181,236,119,241,121,144,197,121,122,147,69,101,247,81,228,115,102,171,139,150,21,102,114,199,29,19,181,214,46,8,91,48,54, + 7,142,121,254,176,45,194,251,249,54,127,235,53,133,9,142,53,101,132,144,5,188,107,57,247,227,90,222,175,65,12,59,39,227,222,250,163,131,232,175, + 225,127,211,160,38,4,229,90,47,160,101,28,108,227,98,241,195,175,63,52,47,231,36,88,21,43,175,155,90,242,157,113,59,234,216,134,155,56,191,14, + 163,56,95,212,116,215,254,46,89,21,87,167,83,97,174,239,221,243,85,156,92,94,21,30,33,89,157,78,97,133,148,113,69,28,161,158,196,178,129,17, + 9,56,43,121,171,158,253,87,130,255,117,21,223,198,235,110,219,85,26,157,135,57,204,119,113,149,110,226,197,239,201,102,19,70,139,60,139,22,209,109, + 190,0,0,94,166,243,36,74,183,243,226,10,176,177,128,94,215,225,249,58,94,132,81,1,253,230,131,206,112,121,167,211,120,149,20,243,235,48,47,226, + 0,149,114,6,92,239,87,241,69,142,220,229,74,240,9,151,194,220,75,120,157,133,171,36,92,255,39,254,2,8,150,140,222,66,162,116,189,142,35,144, + 71,184,190,11,31,202,113,241,227,244,184,188,202,98,192,221,91,248,30,135,89,221,135,36,149,160,234,49,187,67,72,194,105,243,250,178,34,254,182,77, + 10,0,216,77,30,103,191,160,146,254,107,251,91,30,15,184,126,205,194,109,14,136,216,156,78,55,97,145,37,247,223,205,89,160,181,224,198,206,8,252, + 208,192,42,171,137,154,81,10,116,197,248,108,110,52,11,140,145,226,164,233,44,186,63,157,42,34,3,77,5,179,45,245,1,85,174,2,37,180,105,169, + 23,163,188,23,163,188,25,184,19,170,3,224,52,106,58,89,84,226,237,138,102,111,241,162,216,70,164,122,86,189,127,159,23,233,117,205,11,64,40,30, + 214,160,125,36,206,161,199,52,91,158,175,195,232,211,59,71,72,65,158,73,241,176,164,239,166,109,139,244,226,34,143,97,88,226,209,28,208,161,5,140, + 196,154,5,60,109,44,50,54,22,29,31,75,180,194,90,116,151,252,245,16,234,41,251,185,8,29,7,232,156,26,75,3,197,95,47,66,71,0,40,204, + 244,232,160,24,7,160,36,187,1,232,113,169,177,14,3,57,61,220,50,94,12,238,146,125,14,238,79,244,24,143,194,29,52,247,152,98,153,126,1,184, + 179,128,106,59,6,247,123,122,58,229,4,168,82,211,86,119,15,72,85,125,8,223,179,81,94,134,70,96,3,4,142,254,2,190,151,49,105,247,135,254, + 219,11,247,121,162,247,101,76,209,67,224,56,58,218,222,128,132,209,248,23,2,228,168,24,233,203,137,81,242,151,20,163,148,47,40,70,254,130,104,20, + 47,138,70,241,84,52,142,72,137,137,3,164,164,35,252,121,178,148,152,58,72,74,231,6,127,246,24,109,92,74,204,188,32,216,168,58,64,140,196,125, + 158,44,70,106,14,18,227,216,104,7,128,141,145,99,129,141,74,198,15,65,155,213,86,155,176,39,166,128,84,235,25,205,106,170,151,35,11,193,193,213, + 231,243,37,96,19,108,60,97,26,246,61,50,231,136,69,236,220,238,156,243,33,122,211,43,189,82,23,7,44,159,126,102,249,230,136,138,164,230,16,231, + 74,46,72,124,113,60,69,178,61,18,95,112,54,118,92,143,214,66,102,223,201,138,71,166,28,27,252,217,63,3,246,134,213,163,195,26,166,165,129,205, + 246,244,41,97,232,16,216,172,12,252,240,227,193,134,177,163,193,70,8,115,136,253,71,202,128,212,142,5,27,24,252,176,240,99,172,34,244,104,246,7, + 195,191,92,60,162,92,139,67,2,146,18,74,72,251,196,128,132,131,29,22,145,198,134,219,59,34,193,112,146,188,124,53,164,20,233,238,114,8,78,139, + 117,138,19,76,224,182,76,51,214,45,78,200,128,105,38,141,238,20,39,134,188,23,163,188,25,176,2,204,40,165,154,239,177,207,172,17,57,35,35,95, + 40,37,82,235,153,8,172,209,156,147,120,78,225,129,4,76,41,97,78,246,220,234,62,119,23,249,152,192,157,183,120,212,155,88,210,217,30,171,128,18, + 77,181,16,157,237,49,37,129,144,148,249,188,184,61,230,110,119,44,120,103,123,204,117,96,180,53,94,221,235,235,45,223,197,216,71,99,48,19,157,229, + 51,22,112,98,184,87,55,118,203,55,1,4,60,42,122,203,151,129,54,146,89,209,93,190,13,132,53,152,40,28,171,208,1,0,132,80,107,205,40,0, + 1,119,210,202,217,156,6,82,9,193,237,76,7,2,161,200,226,57,59,249,194,178,229,226,113,217,138,46,180,152,12,4,17,82,179,110,229,37,48,212, + 16,234,73,17,101,139,188,74,48,74,59,178,181,1,103,156,75,98,143,41,91,201,20,103,35,178,109,236,30,100,171,141,21,90,52,239,190,168,96,221, + 62,232,209,221,38,235,22,180,20,72,144,245,202,89,54,160,82,121,196,251,18,153,196,167,161,68,5,235,210,190,154,169,50,223,18,71,43,17,93,48, + 129,241,89,171,164,233,130,73,160,159,50,32,193,190,159,2,127,108,25,237,251,41,173,137,102,244,53,44,158,219,71,23,47,100,223,146,148,97,198,43, + 195,59,47,133,117,79,70,164,237,91,146,130,165,123,137,60,46,126,14,49,138,128,235,34,86,189,134,229,75,250,120,49,79,119,117,207,3,14,121,37, + 17,189,18,110,0,235,228,156,119,117,47,64,40,196,47,75,59,221,155,128,104,194,205,171,208,189,124,92,247,170,167,123,5,83,87,196,118,129,15,84, + 101,149,210,170,87,191,6,215,0,105,14,27,216,60,209,92,210,87,17,160,249,227,102,111,248,209,124,61,108,91,185,209,130,143,198,81,73,33,10,169, + 25,36,58,134,16,3,78,31,72,134,41,65,78,158,21,195,122,188,120,122,0,241,153,18,175,242,254,117,196,170,143,25,66,9,238,112,71,197,106,12, + 183,204,160,52,21,211,150,161,236,141,192,205,199,201,23,75,13,74,185,190,95,224,253,3,247,173,185,188,128,55,23,86,183,73,124,215,94,82,192,155, + 17,85,63,215,225,101,236,246,86,32,206,178,132,80,189,56,79,179,85,156,213,175,148,251,116,94,85,219,47,220,59,83,204,7,105,147,116,54,74,196, + 206,61,54,50,246,62,191,10,87,233,29,44,176,255,242,143,52,221,180,251,184,22,24,247,101,240,151,82,75,49,120,9,227,80,17,16,161,12,151,131, + 151,55,89,6,186,156,175,195,135,24,214,228,126,213,221,231,87,233,221,101,134,178,185,8,215,141,112,154,166,248,106,126,126,158,194,216,69,118,51,120, + 189,74,163,27,188,96,52,191,41,209,84,221,108,241,56,238,146,45,172,114,94,93,134,49,154,237,96,168,111,199,152,225,218,42,14,92,190,145,59,94, + 194,242,245,64,202,184,54,95,210,229,10,43,192,108,226,34,92,133,69,216,130,163,166,224,45,22,217,220,98,89,93,44,127,254,225,199,102,163,30,69, + 203,255,73,179,79,237,30,27,25,194,243,244,6,230,222,84,15,240,114,76,180,68,179,9,139,179,100,3,83,192,171,76,127,189,223,172,1,167,205,139, + 14,115,241,112,29,183,157,150,221,214,215,178,70,175,118,173,162,77,130,141,22,191,20,201,122,253,15,28,196,43,40,84,157,38,197,58,62,251,143,85, + 82,76,254,27,239,238,184,209,75,98,135,15,86,29,159,49,176,235,57,37,240,207,177,57,90,135,43,194,107,106,105,118,230,77,19,197,241,253,101,83, + 67,24,142,253,253,118,5,173,242,201,79,201,58,207,211,237,216,4,208,120,135,221,56,206,193,136,216,113,126,115,254,59,56,200,78,7,40,173,191,135, + 151,189,89,32,117,157,156,225,221,165,247,139,234,97,148,227,186,20,206,144,165,164,117,122,118,19,27,204,1,5,177,78,162,120,155,127,94,139,110,85, + 201,45,120,159,205,38,221,230,78,161,85,219,124,113,254,48,207,195,5,132,236,197,64,155,81,186,5,15,124,126,115,168,14,254,25,126,186,57,159,252, + 82,196,16,20,178,67,53,48,28,211,241,162,13,248,54,241,177,191,118,207,44,14,92,118,87,168,215,113,6,56,207,63,43,212,177,107,140,63,199,215, + 89,186,186,113,23,219,186,210,124,102,199,63,36,121,41,149,177,142,179,248,127,111,18,104,241,164,158,127,74,11,16,201,113,251,252,190,216,61,217,103, + 73,33,206,146,91,167,82,68,67,126,220,73,255,114,21,102,241,247,235,228,147,47,12,7,189,10,106,117,45,211,115,208,239,23,181,11,119,79,151,173, + 107,239,132,188,38,62,172,195,243,120,125,58,253,136,47,39,116,24,250,210,155,235,77,186,138,171,230,117,68,184,124,211,173,210,174,146,252,26,24,150, + 201,22,179,174,78,26,118,41,137,183,123,47,70,238,180,112,38,97,179,22,207,89,117,173,69,24,9,41,43,62,11,1,169,41,100,81,51,193,97,207, + 78,184,61,105,139,211,25,248,158,86,170,16,251,230,84,18,220,17,24,255,138,210,189,163,75,27,192,24,254,25,74,115,17,85,155,128,75,237,149,204, + 154,75,171,176,175,178,120,137,76,246,138,201,56,176,240,235,168,141,20,154,154,52,100,118,12,242,93,35,223,249,183,154,46,32,70,45,33,122,125,247, + 118,120,69,232,196,189,245,138,232,238,49,187,89,199,203,109,186,253,3,18,174,119,96,110,233,39,247,24,87,223,203,140,2,152,171,71,236,22,212,182, + 4,165,109,87,62,241,247,52,217,46,1,227,113,246,110,19,102,159,226,172,236,165,252,62,207,139,48,43,58,148,77,178,234,60,199,219,85,103,92,215, + 213,58,129,95,75,81,211,86,33,164,24,89,6,32,240,57,145,90,86,229,151,164,166,181,139,188,77,242,228,60,89,227,131,251,186,142,223,117,145,244, + 46,189,141,179,139,117,122,87,191,247,13,225,58,44,174,60,29,52,41,47,192,21,147,2,72,197,34,248,244,180,135,141,36,145,190,190,129,250,175,201, + 156,81,208,54,53,26,239,83,33,144,12,236,149,39,31,118,208,61,42,103,58,80,146,8,58,78,132,30,180,10,180,16,210,10,32,155,64,74,98,212, + 132,50,172,164,82,161,102,140,1,92,12,209,178,166,113,51,51,38,16,82,48,46,161,121,75,157,131,21,192,126,129,19,54,153,99,125,71,74,193,189, + 89,169,29,115,253,99,242,12,164,14,239,110,126,67,234,179,145,250,76,29,112,250,77,7,123,234,160,111,228,77,40,232,25,249,40,221,163,122,70,62, + 70,196,30,52,97,1,101,74,122,70,62,167,150,8,96,97,210,179,114,143,232,155,185,71,246,237,156,106,60,204,163,82,119,236,124,116,186,29,59,111, + 93,93,39,180,237,116,146,237,185,232,101,189,233,243,226,107,15,177,237,105,246,174,144,230,14,217,250,40,13,136,135,211,248,54,134,57,212,184,91,190, + 213,84,68,84,117,161,74,2,235,62,90,245,49,11,153,92,177,3,178,35,160,107,166,187,55,248,250,45,154,53,116,79,114,65,68,184,81,110,37,92, + 165,14,120,236,192,165,242,10,121,77,190,1,82,0,157,115,175,186,11,68,172,238,112,63,165,192,67,220,250,230,80,123,136,123,143,119,5,184,209,150, + 235,118,34,217,67,67,245,111,251,63,166,190,221,106,195,195,193,71,156,75,95,105,198,152,16,220,86,215,191,84,178,99,226,121,74,123,134,167,24,81, + 146,160,124,160,36,128,151,68,75,26,40,9,15,90,180,82,198,248,74,2,163,230,140,67,132,245,149,164,2,201,176,19,221,81,18,9,164,2,199,96, + 188,212,49,123,232,144,247,82,83,215,202,222,202,8,127,6,54,229,241,140,42,105,36,2,244,209,253,213,173,106,112,1,166,81,28,215,222,141,171,58, + 49,103,65,143,189,177,174,65,71,247,238,36,187,71,124,24,187,242,83,42,206,26,176,36,233,29,168,148,138,107,200,7,216,151,147,194,190,166,52,98, + 140,120,12,114,50,174,57,97,94,145,109,73,230,221,156,168,84,196,192,1,82,65,133,30,218,22,22,104,137,86,194,87,145,13,36,133,0,64,59,14, + 80,131,87,84,210,120,250,119,42,234,106,230,41,150,52,162,152,207,155,81,123,171,236,117,7,168,221,166,36,173,30,232,137,235,128,128,132,165,28,234, + 9,52,104,153,53,157,64,37,3,193,45,23,254,129,122,73,36,90,107,217,51,37,216,90,107,107,188,83,200,210,148,26,242,168,230,186,209,108,44,242, + 233,110,144,20,154,49,237,57,229,123,119,6,160,45,21,158,251,174,23,165,7,174,196,4,86,104,174,213,64,92,144,176,181,237,7,25,59,37,218,74, + 33,101,229,154,125,240,236,19,55,187,186,235,218,54,101,95,207,182,143,161,18,62,200,91,74,149,184,59,39,108,168,146,1,96,247,80,141,87,226,57, + 60,53,197,75,58,39,135,219,127,21,126,199,117,246,250,204,127,167,42,241,207,169,177,112,192,251,246,58,32,59,189,131,25,40,237,157,188,163,50,241, + 166,13,229,108,152,221,242,234,0,121,224,103,108,160,44,234,146,143,41,147,78,15,78,84,241,144,124,255,60,117,119,10,244,234,140,237,16,9,232,255, + 239,18,24,203,246,196,136,31,32,150,91,59,116,29,42,160,198,139,58,165,155,177,146,67,230,209,117,72,224,162,100,207,113,193,186,187,238,236,193,167, + 54,170,241,11,55,195,178,141,49,10,12,70,189,235,254,193,204,110,141,49,118,200,150,120,183,206,14,218,90,253,187,148,112,92,1,7,179,18,106,56, + 81,51,174,2,38,39,31,39,213,13,191,89,117,171,15,41,184,207,170,40,142,183,226,242,219,121,181,146,186,82,194,24,109,33,246,249,58,201,35,200, + 160,123,3,130,31,86,35,49,10,182,219,226,27,38,122,152,128,104,40,45,49,204,105,28,100,164,196,228,195,132,211,192,224,201,19,71,42,68,54,73, + 149,67,1,24,45,177,51,188,8,73,53,211,6,105,18,189,11,155,97,73,221,26,35,177,26,7,239,177,2,224,224,66,97,207,47,217,4,54,46,210, + 8,171,233,140,203,64,41,45,132,194,161,133,86,140,114,164,97,228,147,10,27,143,80,241,90,154,166,18,39,73,161,31,55,201,177,137,143,3,147,28, + 7,152,16,227,169,50,212,80,125,172,29,170,232,239,80,235,29,145,125,5,213,31,135,14,72,86,132,50,120,186,82,253,254,80,146,96,107,41,144,166, + 137,65,253,32,77,19,216,177,34,205,226,86,95,249,77,155,102,90,26,124,36,76,235,146,129,27,10,200,194,70,144,225,72,93,210,170,54,31,155,39, + 17,240,102,232,234,217,80,193,152,173,38,35,40,144,4,33,0,64,218,142,139,36,244,105,101,59,13,64,84,142,6,187,27,46,75,54,220,212,33,13, + 226,16,108,214,58,77,113,28,152,129,116,225,175,38,124,112,4,90,183,194,137,2,70,45,166,212,142,32,181,148,212,209,122,109,12,222,155,53,72,18, + 76,105,202,145,134,7,88,210,117,36,193,150,20,115,52,215,172,150,52,88,10,5,191,203,38,46,255,183,22,16,14,52,97,24,103,216,23,152,145,6, + 170,163,149,147,196,107,221,101,67,129,252,40,22,35,185,228,194,120,76,150,9,32,248,205,172,27,240,99,67,129,12,181,233,167,122,22,48,67,34,75, + 10,174,18,105,154,48,42,180,207,213,204,187,92,38,144,192,252,36,103,78,38,229,50,145,102,40,113,168,145,213,82,45,88,86,51,160,6,68,25,36, + 113,41,153,41,91,130,241,187,150,220,72,74,136,147,2,182,106,244,11,143,68,32,131,160,176,153,118,207,176,95,226,142,194,97,35,94,206,92,186,81, + 172,167,22,24,129,50,129,36,197,240,144,208,209,64,206,6,91,194,80,144,115,187,193,148,107,39,219,89,42,0,160,180,72,19,176,153,45,133,169,52, + 199,174,36,56,68,89,206,177,90,156,108,102,9,18,195,179,6,32,105,232,187,92,28,180,82,194,209,12,186,212,26,6,240,108,155,121,86,80,129,125, + 0,94,156,44,231,89,65,10,143,44,173,129,116,182,134,157,13,154,225,42,100,34,5,61,174,109,209,91,50,213,232,46,159,32,206,87,89,64,221,5, + 62,27,194,84,69,128,71,88,44,248,97,175,71,164,117,91,128,92,8,64,182,157,23,208,24,53,210,233,167,158,63,210,252,53,226,179,2,164,50,79, + 14,72,179,218,42,230,201,11,104,149,18,101,51,32,103,74,121,114,71,138,162,70,80,79,59,72,211,190,10,129,0,254,130,83,225,233,25,105,88,94, + 81,30,30,144,86,105,81,52,51,133,125,53,248,28,15,91,72,179,78,63,37,254,224,217,135,39,62,82,102,28,208,106,4,35,13,76,67,48,15,233, + 72,171,86,215,78,19,88,180,107,89,91,13,210,164,6,127,229,89,23,210,74,197,85,38,232,8,2,2,140,103,167,30,83,101,205,30,165,214,191,123, + 174,61,194,7,159,82,121,13,164,104,78,136,245,124,75,203,101,218,121,131,197,106,214,120,41,199,196,141,161,206,11,214,222,172,132,65,235,241,90,168, + 180,94,177,133,84,235,61,43,212,9,79,41,21,50,91,47,220,128,183,226,170,193,221,248,118,60,104,228,157,110,28,69,212,109,202,152,128,52,64,177, + 17,94,236,240,91,86,58,118,36,46,173,31,137,144,86,142,88,135,43,143,210,76,193,25,98,80,247,1,200,53,194,11,136,174,95,6,48,105,194,102, + 51,120,219,136,89,105,148,23,122,203,201,128,95,241,66,180,215,172,150,118,185,52,161,221,120,16,155,117,181,92,194,33,31,118,52,216,206,85,115,104, + 154,185,168,220,207,7,112,178,202,107,81,6,92,208,178,215,243,32,149,232,37,107,101,57,131,179,29,185,216,231,238,167,180,249,158,87,54,47,51,92, + 20,157,149,212,226,223,89,194,200,164,66,140,209,88,161,69,34,120,2,134,86,164,2,240,206,218,64,230,105,48,163,36,152,244,106,48,79,64,173,112, + 91,31,34,97,143,139,173,33,76,128,80,5,69,170,4,229,90,133,25,46,23,96,170,28,105,218,66,16,147,56,180,194,191,247,116,153,176,5,187,183, + 85,114,61,160,34,13,178,99,174,103,144,82,91,202,136,25,155,183,39,178,97,114,10,178,135,228,212,140,109,159,158,159,170,74,189,35,85,53,236,79, + 180,115,218,167,232,68,208,225,10,87,222,30,209,196,161,197,238,61,110,160,252,9,118,170,173,127,240,142,238,235,195,50,58,40,109,117,235,173,157,114, + 22,221,113,122,140,175,236,142,102,195,110,235,161,201,216,12,249,244,27,50,190,89,226,191,191,37,202,97,173,249,16,75,100,124,167,37,50,125,176,37, + 210,177,25,234,111,150,248,205,18,255,4,150,104,7,150,200,15,177,68,78,155,63,129,188,60,123,243,30,255,208,236,236,205,255,1,80,75,3,4,20, + 0,2,0,8,0,130,128,249,52,145,40,234,161,189,30,0,0,76,213,0,0,15,0,0,0,101,100,105,116,45,100,101,108,101,116,101,46,115,118,103, + 236,93,219,114,35,55,146,125,159,175,224,178,95,220,49,98,17,72,220,213,151,9,239,56,102,195,27,218,217,136,177,29,251,184,193,75,73,162,155,34, + 181,36,213,106,249,235,247,36,138,151,42,22,68,145,20,69,117,88,148,236,104,49,11,133,203,65,34,243,36,42,81,252,248,183,111,55,195,198,215,124, + 50,29,140,71,159,154,50,19,205,70,62,234,141,251,131,209,213,167,230,111,191,254,163,229,155,141,233,172,51,234,119,134,227,81,254,169,57,26,55,255, + 246,249,47,31,255,173,213,106,252,125,146,119,102,121,191,113,63,152,93,55,126,30,125,153,246,58,183,121,227,135,235,217,236,246,188,221,190,191,191,207, + 6,115,97,54,158,92,181,223,55,90,45,220,57,253,122,245,151,70,163,129,102,71,211,243,126,239,83,115,94,254,246,110,50,140,229,250,189,118,62,204, + 111,242,209,108,218,150,153,108,55,87,197,123,171,226,247,121,55,155,228,211,241,221,164,87,84,223,235,149,75,78,250,151,171,162,232,201,189,138,133,100, + 8,161,45,168,77,212,66,137,214,244,97,52,235,124,107,141,166,239,74,183,162,131,169,91,73,8,209,198,181,85,201,237,74,157,127,27,2,134,71,59, + 19,175,150,91,7,244,183,248,127,121,195,66,144,21,99,189,196,157,121,54,202,103,237,159,126,253,105,121,177,37,178,254,172,95,170,102,129,124,165,221, + 202,116,140,58,55,249,244,182,211,203,167,237,133,60,222,127,63,232,207,174,63,53,181,191,253,22,63,95,231,131,171,235,89,73,48,232,127,106,98,132, + 198,197,79,139,30,156,47,117,72,100,138,138,130,243,106,203,151,180,254,107,63,255,154,15,171,247,246,199,189,110,103,138,206,182,175,199,55,121,251,247, + 193,205,77,167,215,158,78,122,237,222,215,105,27,218,119,53,110,13,122,227,81,107,118,13,197,104,163,214,97,167,59,204,219,157,222,12,245,78,107,149, + 241,216,62,53,243,254,96,214,234,67,151,102,121,198,83,242,25,197,62,246,243,203,41,23,47,198,193,159,84,188,128,75,152,137,188,51,249,143,73,167, + 63,128,242,21,133,138,98,213,43,138,180,156,223,131,187,166,179,241,237,162,44,122,49,123,24,162,105,22,182,122,227,225,120,114,126,127,61,152,229,31, + 162,96,12,184,7,179,135,115,249,161,185,186,99,124,121,57,205,129,175,40,201,34,196,184,3,45,169,102,163,253,156,182,68,170,45,153,110,203,44,219, + 250,216,174,14,121,103,132,40,108,143,208,59,19,124,183,215,221,27,35,37,31,199,168,52,186,144,170,48,115,198,242,127,190,185,177,135,116,105,122,193, + 214,122,184,195,212,188,35,161,114,107,182,24,100,122,114,148,218,115,114,22,139,16,221,24,230,61,212,223,25,222,119,30,166,205,13,179,39,157,217,126, + 246,186,195,78,239,203,190,115,39,157,219,5,196,68,91,219,235,183,116,225,136,16,154,112,44,8,173,60,30,132,86,29,204,68,200,93,140,232,187,142, + 134,99,21,123,99,180,155,25,125,119,121,217,211,61,189,239,90,149,7,52,164,66,248,35,185,26,33,197,78,24,245,21,255,238,139,145,144,116,40,140, + 40,184,35,97,68,193,239,136,145,225,223,61,49,66,107,116,52,131,69,193,234,227,24,44,180,100,143,101,176,208,150,127,10,66,254,212,25,238,12,97, + 228,237,231,215,147,28,113,198,187,106,197,70,88,81,129,186,218,132,117,114,69,69,174,230,194,223,70,131,25,2,138,187,105,62,249,133,73,249,127,143, + 126,155,230,181,82,191,78,58,163,41,34,128,155,79,205,155,206,108,50,248,246,67,139,50,231,180,242,225,76,224,87,102,193,6,39,236,153,148,144,91, + 82,103,45,239,40,243,222,232,247,203,202,122,223,62,53,173,48,153,147,154,86,29,233,61,48,197,183,153,213,206,175,164,151,201,178,151,201,178,19,204, + 129,116,25,74,250,213,4,31,78,67,35,170,71,209,80,180,68,199,210,80,180,165,191,71,13,117,7,211,208,180,130,182,164,15,50,179,234,251,213,208, + 132,2,106,223,60,184,82,164,21,208,136,167,67,26,148,178,201,144,198,52,119,95,25,71,83,119,243,82,62,109,163,186,107,191,193,178,64,221,205,17, + 212,157,50,68,32,41,117,255,38,63,53,149,128,212,148,59,242,192,82,187,174,194,223,40,89,150,120,17,132,140,21,199,237,174,217,202,63,74,197,151, + 132,205,211,19,202,155,164,209,252,179,189,174,173,26,83,79,232,211,118,91,31,153,215,218,90,65,244,225,96,124,220,238,96,2,146,227,23,153,20,74, + 4,114,62,105,13,50,81,252,164,56,179,13,59,6,49,169,214,231,245,39,23,236,166,198,221,193,248,186,20,118,135,237,133,119,93,211,19,70,174,41, + 209,166,97,108,194,16,109,239,68,62,223,121,227,115,117,185,67,235,114,115,235,238,96,40,98,66,158,88,70,210,169,45,225,73,12,220,74,219,19,254, + 209,129,63,185,134,165,211,91,162,147,104,92,7,3,172,158,108,252,185,16,218,39,205,158,180,180,63,132,198,153,96,204,51,32,180,106,127,8,93,207, + 229,46,188,56,132,198,61,9,161,241,251,67,216,237,116,251,93,251,12,8,77,216,31,194,75,121,105,242,222,139,67,88,218,152,126,148,228,60,57,76, + 177,187,119,158,143,99,103,239,44,141,220,217,59,39,27,59,32,134,222,238,242,188,161,23,248,119,207,232,80,122,183,219,38,144,243,174,227,186,123,110, + 2,161,53,185,31,74,219,17,217,200,28,67,166,17,66,9,85,97,153,46,51,20,164,44,237,85,48,35,37,151,41,103,45,201,10,123,101,161,242,86, + 248,45,8,178,202,96,221,133,180,145,32,139,76,105,173,120,159,130,178,224,72,120,119,214,66,1,225,165,246,121,139,222,55,55,153,30,218,134,251,111, + 181,188,158,187,91,177,109,251,245,109,55,97,252,193,66,15,133,25,19,90,202,37,178,158,97,6,158,66,185,32,61,162,17,163,53,25,247,254,137,185, + 123,100,158,211,58,81,209,159,23,196,49,110,80,110,220,4,22,149,97,97,0,213,88,74,234,202,80,112,221,82,53,130,146,62,115,70,136,3,6,131, + 139,169,112,1,63,252,161,37,51,25,130,119,230,253,10,171,195,111,239,196,29,241,199,183,119,40,120,93,217,107,65,224,232,130,37,77,149,189,22,5, + 125,242,158,74,176,95,38,203,94,38,203,78,0,113,102,12,33,26,166,173,116,87,106,142,195,207,108,22,72,123,111,177,250,207,90,22,170,203,200,241, + 7,4,214,136,230,36,164,210,101,158,60,155,10,43,1,173,13,225,253,150,51,246,170,152,31,114,161,239,0,150,205,164,39,173,82,96,29,101,238,95, + 19,243,64,175,131,185,206,148,34,99,34,230,254,173,97,110,95,7,115,202,172,99,35,203,152,11,37,141,121,51,152,171,114,36,115,84,204,225,217,188, + 225,237,77,43,178,16,192,218,222,18,230,250,117,48,7,80,94,89,42,236,185,145,142,94,11,243,195,115,188,152,237,176,41,25,34,28,238,177,20,20, + 214,107,163,212,124,159,158,132,50,30,49,9,162,16,25,68,140,71,36,41,25,100,149,44,19,188,169,145,74,85,131,162,150,193,244,8,41,75,207,99, + 230,20,19,116,82,121,87,101,153,42,83,152,182,242,131,233,227,107,175,20,238,85,180,215,71,199,56,215,222,183,229,25,21,226,166,87,193,220,190,105, + 204,205,171,96,174,223,52,230,225,85,48,167,183,140,57,169,87,193,92,188,105,204,95,197,135,202,204,90,206,48,120,147,144,171,87,113,161,234,77,67, + 254,42,30,212,124,55,144,191,64,152,195,169,239,27,51,227,93,37,232,208,98,125,43,91,101,158,200,149,162,33,14,55,170,197,56,210,176,153,119,206, + 107,218,117,119,244,37,134,108,194,198,33,91,83,141,179,212,250,144,169,26,90,169,181,177,218,204,122,103,190,135,129,150,122,145,26,168,175,62,57,163, + 234,48,215,158,183,172,61,160,80,148,209,247,48,70,162,141,147,73,106,87,2,24,145,208,197,163,117,91,157,119,147,121,229,96,133,170,184,212,203,82, + 4,239,69,71,189,121,213,210,218,170,37,56,106,231,130,172,14,39,112,70,160,17,213,149,75,76,93,149,41,113,184,184,124,81,129,86,193,217,157,102, + 252,99,155,207,52,198,191,150,39,34,249,56,100,255,235,32,191,47,42,154,94,143,239,187,227,73,63,135,193,155,77,238,22,211,192,99,226,83,152,243, + 143,183,157,171,60,62,193,6,18,69,42,217,252,66,113,235,226,146,181,182,34,159,63,225,230,12,15,169,138,159,69,253,11,240,185,230,82,49,145,186, + 62,189,238,244,199,247,128,102,253,226,31,227,241,205,234,81,249,106,66,97,231,181,206,76,240,102,153,45,185,186,200,230,62,100,66,43,45,106,21,246, + 238,38,19,96,218,26,118,30,24,144,248,207,162,122,70,234,106,194,192,92,118,134,75,100,150,183,242,165,86,183,59,254,86,197,113,113,185,63,238,221, + 241,49,230,214,93,49,95,243,243,179,165,18,247,131,17,70,217,154,31,185,245,142,30,41,176,56,131,187,122,30,187,94,226,27,107,81,120,236,234,3, + 47,36,187,126,145,71,87,198,186,60,70,30,90,126,115,203,7,132,227,73,112,189,126,243,184,251,59,22,80,107,52,238,231,211,244,240,231,37,110,199, + 131,17,143,62,137,224,188,76,129,97,26,227,59,116,100,99,1,158,132,69,35,155,250,209,153,93,47,187,49,95,43,55,249,172,211,239,204,58,171,5, + 176,144,44,14,195,124,156,244,47,207,255,245,211,63,150,233,30,189,222,249,255,140,39,95,86,153,26,92,160,211,29,223,97,122,150,41,40,124,206,184, + 119,206,220,167,51,251,60,184,1,198,124,38,252,175,223,110,134,88,158,203,11,149,194,179,135,219,124,85,105,81,237,226,124,123,242,140,124,191,119,51, + 224,155,218,191,204,6,195,225,207,220,72,41,45,101,94,233,96,54,204,63,255,20,143,64,199,150,11,65,165,12,70,155,127,142,23,227,95,149,107,61, + 62,225,63,158,124,46,117,140,1,248,241,106,153,124,82,111,237,63,59,95,238,186,141,95,102,57,204,227,36,213,40,219,168,122,37,177,100,173,61,174, + 118,122,23,39,176,82,1,163,243,239,157,171,181,62,176,116,56,248,204,231,190,63,182,231,31,146,37,250,115,68,54,149,153,194,11,244,251,60,132,122, + 169,66,86,233,64,236,127,173,171,220,255,219,187,238,112,48,189,206,119,131,241,159,227,175,249,112,120,214,248,121,212,203,118,68,49,209,32,55,55,28, + 244,242,209,244,105,37,139,147,48,248,10,227,127,115,51,30,77,163,190,205,239,157,182,187,15,173,105,167,77,153,104,215,148,173,55,30,129,229,119,239, + 118,85,152,93,117,164,222,76,44,203,171,178,188,74,47,214,135,91,90,168,59,142,180,138,227,109,62,193,202,155,62,137,99,234,13,21,255,202,111,39, + 227,254,93,124,109,65,21,192,103,86,252,211,96,90,160,146,170,120,146,255,223,221,0,119,236,85,243,63,199,51,64,114,216,58,127,156,61,222,217,103, + 161,144,79,6,95,227,148,178,54,76,15,219,233,95,174,59,147,252,199,225,224,75,25,140,168,122,115,85,91,36,233,149,92,198,199,246,194,161,196,79, + 87,43,71,83,225,25,75,95,53,236,116,243,225,167,230,5,95,108,200,186,171,27,223,221,222,192,227,206,111,95,248,168,171,191,84,179,15,251,131,233, + 45,10,156,15,70,204,81,151,244,113,150,56,172,66,150,148,87,28,122,47,206,171,32,80,230,212,187,51,176,41,21,140,12,103,26,82,143,192,189,154, + 140,119,101,157,40,229,254,78,96,246,106,89,144,171,83,7,224,93,194,74,111,62,148,143,16,93,194,111,157,195,163,253,240,174,126,30,231,125,188,90, + 202,151,140,31,39,119,195,252,124,52,30,253,1,158,249,1,10,63,254,18,63,230,243,191,11,34,117,46,23,31,185,90,0,119,14,216,70,253,178,240, + 119,208,133,115,104,89,62,249,112,211,153,124,201,39,69,45,197,223,173,233,172,51,153,85,36,55,131,126,229,115,62,234,87,218,141,85,13,7,248,231, + 92,47,100,253,14,120,213,100,130,105,40,151,100,105,145,239,121,46,22,178,213,32,191,14,166,131,238,96,200,31,226,159,195,252,67,117,46,63,192,43, + 76,46,135,227,251,197,245,181,148,81,158,6,76,76,57,233,121,78,46,249,161,37,159,183,43,31,14,91,190,218,197,249,76,25,39,203,137,218,160,91, + 45,105,76,64,196,73,229,52,244,135,40,23,153,13,214,155,242,66,96,126,181,191,6,212,15,32,158,52,96,103,13,128,2,252,87,163,69,8,50,129, + 180,227,83,103,60,81,94,40,223,248,251,35,242,146,84,113,74,164,17,90,166,133,168,193,89,222,158,51,65,67,236,51,99,132,183,13,73,38,115,108, + 30,206,136,48,203,94,56,179,144,41,127,230,125,166,141,38,101,112,251,74,218,210,42,51,142,148,160,70,75,41,212,111,180,42,245,202,62,210,215,63, + 26,107,218,206,42,7,85,169,164,158,47,99,94,152,73,166,199,160,252,61,252,108,208,212,199,238,72,182,165,106,112,47,23,201,26,220,73,121,73,90, + 130,59,37,228,26,156,224,44,4,107,74,112,183,100,16,26,69,200,148,240,46,9,203,128,151,196,101,196,165,211,38,35,105,92,5,241,100,119,43,136, + 63,123,73,135,211,146,222,114,73,175,18,254,231,17,70,69,103,107,19,161,188,53,193,5,189,149,119,229,45,200,245,137,200,196,46,83,193,51,31,127, + 106,115,2,74,55,251,147,91,217,184,232,117,230,176,254,100,227,162,129,117,69,139,63,41,83,142,215,42,36,248,104,56,191,124,249,105,113,71,105,69, + 45,172,138,226,115,122,203,25,79,76,116,156,201,197,81,168,71,87,80,254,53,135,5,91,172,136,243,119,198,24,103,212,19,139,104,195,132,237,12,249, + 170,83,43,205,52,235,184,65,107,188,48,103,210,114,106,148,32,182,148,42,11,198,122,173,21,75,181,213,198,105,128,231,200,57,10,254,12,168,10,97, + 12,160,99,153,39,133,114,44,147,138,172,194,221,38,243,1,222,3,254,131,183,255,172,10,86,54,92,70,30,82,7,238,106,50,13,73,240,13,159,121, + 29,32,157,203,240,99,113,183,207,130,48,214,122,98,41,231,254,147,107,40,207,59,151,65,233,249,221,48,250,44,115,40,167,231,50,141,30,225,110,48, + 99,229,141,210,50,74,61,121,24,82,238,27,225,102,148,84,153,135,175,116,196,50,18,68,214,197,158,123,227,28,183,205,82,105,37,247,28,82,195,184, + 176,58,5,111,165,44,16,82,133,0,63,232,96,5,50,24,104,107,3,233,146,84,58,222,68,246,214,150,100,9,188,19,10,40,93,233,68,215,99,238, + 176,236,17,151,1,201,228,127,123,213,189,207,234,181,135,249,181,77,202,189,210,21,82,112,229,24,193,86,86,140,15,206,60,199,157,136,239,197,116,237, + 101,164,186,195,113,239,203,218,210,82,112,252,46,24,125,6,90,224,192,26,108,128,217,193,74,16,46,0,88,150,90,31,200,106,86,31,172,20,9,237, + 113,176,72,25,214,145,9,212,64,116,224,189,145,208,91,226,228,37,167,37,69,227,38,53,104,24,203,164,71,136,96,10,147,87,107,41,165,85,62,168, + 39,181,234,249,42,117,85,9,74,149,12,171,216,167,166,97,18,102,1,131,245,133,86,173,20,172,4,250,92,97,22,239,184,40,219,206,76,61,195,38, + 166,130,240,248,231,176,51,203,127,128,113,82,220,53,142,187,75,127,191,111,238,194,89,167,61,254,47,65,91,21,9,185,78,91,41,100,210,42,141,169, + 141,76,91,11,199,138,145,146,194,214,16,184,133,83,103,164,160,24,70,27,46,102,164,139,186,98,227,49,51,19,111,102,27,169,61,108,23,174,43,43, + 172,241,92,146,216,78,249,51,232,28,73,33,173,75,202,46,184,25,239,181,66,51,144,162,15,248,171,48,116,53,41,100,18,28,54,192,185,10,216,90, + 15,155,207,178,192,169,10,142,123,100,80,183,98,6,173,36,226,21,184,142,192,93,23,104,138,226,221,176,191,8,88,230,67,132,79,72,202,46,146,96, + 108,34,196,178,110,184,146,42,246,168,203,222,172,116,111,128,99,237,22,163,109,210,247,90,152,22,178,32,73,75,235,121,50,157,129,131,102,5,73,73, + 165,100,165,210,66,179,210,112,124,37,93,67,98,13,88,11,5,96,245,210,65,41,42,238,54,2,134,18,138,204,11,66,192,138,26,46,41,64,176,93, + 84,110,197,129,173,78,202,46,184,29,109,16,156,185,51,132,192,104,70,89,246,236,41,41,238,135,91,215,100,89,225,65,22,131,176,92,14,33,26,236, + 25,247,200,58,33,66,188,155,152,156,240,10,84,208,93,75,129,203,193,192,99,21,196,17,90,65,32,46,41,217,69,18,139,147,186,191,142,186,159,144, + 126,209,45,50,25,115,40,165,141,154,190,240,125,9,33,191,68,15,158,132,247,182,96,10,162,235,147,76,239,5,22,115,180,4,11,215,135,123,201,120, + 237,163,37,208,133,235,243,240,25,206,35,54,96,47,132,200,33,36,36,188,234,60,89,88,17,207,235,221,41,68,9,209,176,212,132,124,188,141,36,175, + 78,21,121,12,59,61,25,59,37,84,52,1,11,159,39,225,83,209,145,64,209,6,20,62,15,5,227,137,122,55,31,27,251,183,148,236,34,5,66,114, + 215,13,38,214,52,183,179,207,135,51,234,174,70,98,100,146,196,36,164,68,117,18,35,147,36,70,36,72,140,76,144,24,153,34,49,104,38,144,55,8, + 244,32,117,32,198,49,76,76,73,33,171,145,24,46,87,39,49,232,112,141,196,160,100,141,176,164,100,23,73,48,78,86,253,100,213,255,132,86,93,153, + 148,53,72,73,149,173,89,3,20,75,88,3,94,175,235,214,0,55,243,86,188,11,108,156,97,125,65,198,18,162,11,222,50,18,206,89,89,236,1,6, + 56,13,54,237,41,41,110,175,7,52,54,25,208,184,68,64,99,19,1,141,77,217,130,20,20,143,89,247,240,108,235,126,210,246,151,213,246,164,239,75, + 73,85,221,247,169,164,239,83,9,223,167,18,126,78,37,125,31,154,113,193,4,175,89,10,98,65,202,113,157,9,169,74,248,62,149,244,125,42,225,251, + 84,194,207,169,164,239,83,114,107,125,127,250,25,226,161,217,76,253,73,162,82,201,25,77,72,25,246,245,25,85,201,25,165,196,140,34,70,116,202,153, + 184,165,34,148,42,192,95,23,93,196,70,44,66,209,56,115,154,223,101,103,11,139,88,147,242,204,214,230,83,39,231,211,36,230,83,39,230,83,39,231, + 83,157,184,204,137,203,188,9,235,78,46,25,217,36,164,228,235,145,141,75,70,54,54,17,217,128,141,88,237,180,98,226,18,124,144,88,205,41,89,220, + 12,117,164,133,37,150,42,225,81,83,177,95,92,147,226,254,122,100,227,147,145,77,72,68,54,62,17,217,248,100,100,227,182,183,238,71,143,85,101,61, + 86,77,178,211,148,148,234,236,148,146,236,148,18,236,148,31,212,240,169,145,104,159,193,52,141,215,73,217,5,215,105,131,148,209,230,147,23,94,134,162, + 63,235,66,74,176,83,74,178,83,74,176,83,74,48,81,74,178,83,50,39,235,126,178,238,111,195,186,39,153,94,74,74,117,166,71,73,166,71,9,166, + 135,146,245,125,43,149,220,183,130,37,17,204,229,216,142,243,91,31,133,156,219,151,117,41,37,184,30,37,185,30,37,184,30,37,120,29,37,185,30,169, + 237,173,123,56,182,117,167,218,227,84,126,169,143,4,236,190,186,165,156,144,74,208,102,10,156,67,185,218,83,142,231,203,57,207,175,178,167,140,136,72, + 232,160,108,105,79,153,119,124,37,68,33,62,73,42,102,47,37,187,224,102,66,8,80,148,248,224,20,241,23,217,98,115,184,38,229,13,99,235,172,180, + 229,157,101,19,55,135,157,175,110,45,115,174,141,81,186,188,179,172,57,81,39,40,83,222,89,78,200,46,146,88,156,204,251,201,188,255,25,31,47,97, + 189,74,144,39,197,9,50,134,4,153,248,108,54,33,141,182,205,96,53,196,4,27,254,122,49,201,50,240,111,254,102,28,240,41,226,92,222,120,183,143, + 150,213,74,94,165,252,13,115,150,183,246,21,74,22,139,153,243,212,156,74,202,226,99,9,199,15,143,34,165,247,86,107,53,247,24,107,66,62,157,204, + 182,128,248,9,21,90,115,222,242,3,17,99,60,188,0,119,71,64,18,204,252,25,11,115,202,248,148,73,133,32,164,225,146,158,15,73,23,227,131,151, + 160,148,232,34,9,196,35,166,189,114,242,224,180,13,249,61,234,122,50,172,73,73,101,61,172,145,201,176,70,38,194,26,148,172,209,150,148,236,130,155, + 73,80,153,148,84,38,2,27,153,12,108,100,34,176,145,137,32,70,38,3,27,185,253,182,59,29,61,80,165,90,160,202,111,13,145,22,198,136,151,167, + 118,96,11,166,0,176,38,5,44,129,183,78,13,91,47,18,194,7,201,50,105,3,204,68,180,94,82,233,48,191,155,135,13,88,57,155,140,172,8,161, + 160,9,224,32,158,141,141,23,90,249,148,40,194,23,44,170,113,103,113,143,24,54,114,174,97,53,41,79,147,19,82,197,86,124,208,194,71,179,233,249, + 237,50,220,29,21,4,57,42,76,177,226,62,74,158,79,15,219,103,53,151,36,37,96,87,207,138,99,21,154,147,103,18,178,139,36,20,39,38,115,220, + 227,16,235,89,159,94,53,247,118,0,137,195,42,252,62,181,247,91,207,79,242,132,196,27,142,110,79,169,165,207,78,45,93,157,13,33,249,242,20,40, + 181,2,132,208,167,21,176,231,10,56,37,155,62,59,217,116,185,0,132,160,227,114,34,42,191,113,233,148,48,248,204,132,193,189,140,15,127,65,201,201, + 248,28,97,159,39,73,125,132,59,97,191,47,245,57,37,164,62,59,33,117,69,125,142,158,98,44,149,58,37,21,30,58,169,112,79,43,164,204,201,10, + 29,251,220,148,172,236,63,157,210,12,15,148,102,184,239,22,196,201,15,191,26,7,82,242,132,253,190,137,201,167,52,214,103,166,177,150,236,241,177,83, + 27,100,34,113,237,148,138,248,236,84,196,61,173,208,198,55,38,157,172,208,139,122,0,121,226,159,123,71,193,167,84,215,103,166,186,150,236,177,58,182, + 7,168,28,253,58,165,43,30,40,93,113,95,43,116,226,161,175,228,1,248,11,155,79,216,239,155,21,116,74,135,125,110,58,236,234,113,148,183,199,126, + 0,22,252,41,165,241,176,41,141,251,62,131,23,39,19,116,228,77,80,104,191,56,37,57,30,62,201,113,79,39,28,232,180,2,94,139,0,5,123,194, + 126,95,2,116,74,162,125,102,18,109,201,30,235,29,249,207,198,183,102,71,117,143,170,176,173,106,223,95,67,173,94,249,61,202,118,254,230,210,234,59, + 95,13,88,135,182,94,74,54,186,160,160,197,78,168,129,63,81,154,180,158,75,81,166,1,183,100,164,6,1,131,78,4,229,45,65,18,140,13,26,36, + 72,11,80,36,231,5,51,40,40,158,2,169,5,45,229,119,191,42,67,40,201,223,98,143,214,249,155,64,192,232,156,214,130,51,147,2,88,156,112,174, + 36,155,231,42,4,169,100,73,170,112,187,33,184,68,150,65,105,13,116,140,223,176,76,152,116,29,101,198,107,17,223,166,204,250,6,141,136,237,192,43, + 145,182,81,166,2,124,84,236,15,137,32,3,191,117,89,88,232,155,225,111,38,17,10,62,84,22,239,98,150,96,94,70,241,120,136,35,137,248,46,102, + 43,36,136,59,35,1,143,22,40,190,139,25,220,79,145,42,201,226,19,6,84,73,69,150,218,92,138,149,96,53,127,131,95,196,209,40,131,182,83,136, + 167,94,233,93,250,18,200,180,198,198,159,23,121,161,242,163,239,125,39,181,195,118,242,59,18,186,227,221,107,168,125,85,199,227,214,58,41,226,47,141, + 53,214,199,55,103,219,76,192,110,57,65,44,115,82,6,135,137,33,161,172,83,129,69,1,51,204,111,92,151,78,113,226,33,230,17,246,53,68,45,201, + 80,153,231,136,15,102,206,123,169,64,232,51,97,160,76,252,134,109,132,131,70,73,15,155,197,54,217,4,88,39,230,95,132,168,128,21,20,186,136,240, + 2,81,34,116,7,90,109,141,181,176,223,153,55,66,4,142,13,65,253,37,214,140,107,192,30,6,86,95,23,141,27,226,143,248,210,110,222,102,116,32, + 125,234,255,219,59,183,221,56,138,32,12,191,202,42,185,33,146,89,250,124,144,200,5,226,54,47,97,133,0,145,0,9,115,16,240,244,124,127,117,175, + 119,188,51,14,227,36,128,192,78,46,226,148,187,102,122,186,78,127,85,247,76,13,71,216,72,179,14,166,255,53,166,50,184,241,254,93,52,198,25,96, + 92,114,43,243,116,250,206,185,168,73,81,65,52,157,96,134,155,249,56,114,45,22,34,105,113,120,136,164,169,167,174,251,12,110,44,175,144,25,137,234, + 42,6,111,150,64,158,205,211,104,147,38,246,97,48,100,185,177,65,177,47,64,155,89,178,64,133,123,68,86,22,32,89,90,52,91,75,53,100,173,127, + 170,69,153,18,70,199,144,138,227,208,151,198,201,163,202,176,232,24,186,203,38,59,108,54,216,167,217,21,114,218,20,39,209,108,67,194,155,95,147,78, + 126,135,73,189,254,155,140,106,241,13,105,173,105,202,27,189,22,78,95,220,255,16,200,148,247,117,185,24,212,255,91,75,5,156,110,150,118,131,48,124, + 45,227,235,229,61,128,132,194,164,234,235,229,175,136,61,46,55,181,30,145,255,71,113,189,33,28,141,205,184,107,139,61,153,60,39,116,243,20,165,181, + 140,66,67,4,47,181,234,33,233,220,49,58,171,144,18,177,41,47,90,208,221,201,146,100,20,138,123,109,244,108,184,152,210,134,98,194,84,118,124,60, + 127,167,118,37,2,113,204,110,163,165,202,243,55,250,243,250,73,187,222,75,187,154,206,3,224,92,154,116,166,232,88,116,52,157,1,121,7,82,111,211, + 25,80,136,157,138,87,30,140,239,235,166,73,181,0,36,162,233,28,168,216,219,200,134,122,4,97,32,220,61,42,135,210,228,163,211,209,253,52,78,232, + 161,111,41,216,72,194,2,42,41,124,209,149,134,199,108,196,136,74,22,145,74,233,174,143,129,76,163,54,57,76,151,67,45,214,204,162,225,49,123,152, + 135,254,92,17,46,242,71,185,216,58,173,96,245,68,219,234,217,118,245,118,216,167,159,214,162,33,185,240,164,159,31,87,63,55,69,44,109,240,68,27, + 3,196,192,220,90,194,8,170,4,218,50,212,19,104,77,208,177,70,36,4,213,1,188,5,146,147,193,228,18,249,57,200,167,245,226,155,57,79,124,30, + 161,62,122,171,95,118,213,123,164,96,168,34,142,118,210,116,250,126,91,235,54,245,171,184,247,119,127,167,241,26,251,242,217,185,99,175,173,243,70,176, + 6,201,254,194,53,63,5,247,19,130,253,226,51,239,103,222,155,183,223,188,253,225,250,59,139,41,2,37,173,102,252,251,76,48,34,202,11,236,18,28, + 1,4,102,235,20,67,238,89,68,41,65,64,18,52,194,79,121,16,242,0,155,164,193,173,118,35,37,53,211,48,180,73,34,211,149,88,145,135,19,60, + 12,110,54,187,226,96,179,119,202,66,96,213,234,81,209,38,17,102,132,164,124,44,217,54,10,88,124,229,66,130,154,213,170,132,193,248,7,204,172,8, + 46,22,165,32,136,151,9,11,101,54,175,80,101,56,177,87,252,79,36,42,233,94,162,12,120,73,38,175,22,29,6,27,209,145,129,46,85,142,30,92, + 45,48,117,67,151,103,38,230,15,180,234,54,34,37,50,191,50,80,101,138,222,50,32,71,52,114,109,162,202,49,207,124,194,147,62,4,43,90,38,31, + 213,44,76,161,83,39,169,162,50,70,157,193,244,134,39,203,88,149,88,79,96,50,43,196,29,116,4,8,100,216,102,226,22,108,45,117,214,167,244,187, + 114,91,40,221,157,238,236,107,84,248,190,9,254,102,178,148,234,139,127,57,231,63,117,245,90,103,151,33,214,181,226,223,183,44,95,77,75,80,111,42, + 4,19,39,170,135,64,250,222,202,160,33,75,75,182,81,193,68,178,93,205,26,82,51,92,47,37,27,148,60,34,89,83,204,12,70,82,171,5,47,26, + 9,148,74,60,162,41,53,80,63,153,5,15,174,164,69,215,154,145,208,251,156,117,154,156,219,135,49,169,76,242,129,150,197,105,4,11,206,32,216,86, + 141,208,80,28,59,81,102,7,125,45,107,33,101,151,117,168,0,229,199,36,251,208,179,81,116,87,145,26,123,116,141,56,43,173,196,226,179,226,250,24, + 231,172,182,97,214,190,224,196,32,34,113,57,218,179,116,153,187,208,97,97,152,211,244,121,240,164,194,68,57,45,75,157,86,155,143,77,47,145,246,96, + 153,101,118,36,122,234,88,69,66,89,130,209,42,94,89,77,193,236,126,205,216,141,173,6,178,185,168,137,118,176,168,171,65,131,106,5,58,68,13,139, + 37,130,55,150,140,115,162,89,14,6,255,93,161,33,63,143,184,68,83,99,44,227,12,145,137,249,8,109,50,234,21,215,193,72,2,211,84,12,82,83, + 65,242,60,235,183,21,107,5,130,136,214,170,115,178,103,132,145,175,250,173,91,210,94,41,88,40,167,43,189,188,87,88,134,40,39,151,42,63,95,233, + 173,193,64,62,125,208,158,43,108,222,31,141,9,31,85,45,161,212,235,104,202,212,15,218,153,0,126,147,187,251,200,2,247,78,242,24,143,201,86,211, + 15,110,227,67,51,58,233,166,104,140,175,120,21,34,23,90,18,148,217,50,23,198,235,188,232,16,131,118,31,198,44,131,48,87,183,23,210,228,152,66, + 210,171,45,140,142,158,149,49,90,1,200,119,104,210,51,63,151,213,24,181,65,169,61,94,111,126,158,213,18,13,167,171,83,229,170,5,105,187,38,29, + 116,112,229,202,183,49,99,155,169,243,173,187,241,6,156,98,116,3,218,97,187,4,235,96,85,34,29,73,77,229,228,173,141,82,78,43,234,112,179,190, + 212,65,52,65,36,107,123,153,71,209,137,129,57,154,26,221,225,195,63,163,238,4,178,73,236,165,0,7,83,233,37,207,75,241,107,175,55,57,227,93, + 70,214,205,3,61,91,25,243,66,204,85,101,92,173,100,158,55,172,177,217,169,153,33,197,51,171,118,169,170,75,169,79,86,19,101,178,66,196,228,236, + 81,167,96,209,187,118,193,170,122,28,49,36,76,154,234,196,248,124,108,36,150,56,89,245,146,169,80,202,197,124,5,102,154,34,217,156,27,246,120,48, + 0,205,4,198,51,148,226,202,168,152,164,53,111,143,221,228,41,34,202,100,213,150,158,8,229,243,249,37,153,131,176,251,148,203,201,53,74,153,28,11, + 60,36,234,212,103,14,26,49,46,5,19,125,5,96,169,14,153,199,250,182,83,108,147,207,209,142,158,162,54,225,30,247,98,67,90,239,214,167,13,191, + 17,186,93,106,248,28,171,190,183,19,43,222,145,236,66,103,10,8,227,209,174,238,85,240,52,69,102,202,78,161,50,15,235,55,210,237,100,29,154,233, + 172,220,83,193,138,201,238,138,78,214,24,76,191,49,162,81,104,178,155,137,52,53,94,171,86,180,33,46,90,140,10,199,162,85,109,252,24,43,70,202, + 106,138,150,167,117,222,50,2,108,178,150,49,154,183,40,214,167,174,54,128,68,145,165,107,186,213,218,135,197,33,22,127,108,167,240,207,106,56,205,86, + 40,7,111,217,6,70,192,207,226,86,184,64,181,26,150,218,158,202,247,204,103,4,35,129,149,162,156,88,77,217,147,34,153,6,97,117,85,253,178,192, + 31,77,106,43,196,171,71,108,39,103,96,16,184,248,146,228,54,129,22,209,198,228,238,48,94,249,219,142,131,172,134,148,103,16,152,174,21,2,158,60, + 215,100,190,92,149,64,11,132,64,48,86,216,170,101,242,207,134,83,46,98,170,26,99,90,113,49,131,155,250,136,169,196,69,201,194,198,9,253,25,109, + 21,141,19,240,172,180,65,195,48,198,40,34,151,171,147,211,171,166,121,55,140,3,141,246,165,109,77,181,65,44,116,95,107,189,94,63,240,216,193,35, + 174,51,160,216,163,176,32,181,15,35,183,146,105,41,248,204,92,30,164,65,172,150,5,8,36,88,46,47,174,237,228,42,252,117,114,245,78,29,216,213, + 17,214,245,7,188,106,244,188,181,118,221,242,229,247,104,70,71,216,22,255,211,125,21,119,201,24,63,133,117,235,221,125,111,77,53,157,183,116,89,101, + 236,26,133,3,110,169,246,110,37,198,108,213,248,91,170,118,196,130,48,41,180,98,128,33,222,161,233,234,246,145,132,5,113,114,199,113,201,21,181,143, + 142,166,128,242,119,211,94,45,169,167,27,125,121,135,120,154,81,31,63,73,111,111,103,190,245,228,23,106,171,6,244,145,136,240,17,107,78,167,189,207, + 181,243,250,224,109,220,169,181,97,117,82,225,167,31,127,185,190,121,243,24,90,25,123,55,132,111,14,137,60,92,24,235,213,130,26,166,164,173,78,164, + 186,73,34,212,222,67,133,171,168,204,25,55,122,28,187,123,122,28,47,250,97,126,127,253,243,205,219,223,62,33,92,121,46,151,174,156,254,18,230,1, + 128,150,76,182,72,184,87,75,210,80,122,122,113,217,254,148,156,239,240,5,240,92,91,114,196,70,119,0,1,31,14,74,61,182,232,99,252,31,107,53, + 189,249,253,229,51,13,220,248,205,111,47,159,133,227,198,47,180,131,228,183,232,48,164,101,15,228,197,139,230,247,118,41,221,56,156,243,252,181,115,251, + 221,243,181,53,231,190,84,244,144,192,74,0,222,71,169,232,23,117,198,235,155,125,245,72,141,123,128,148,222,124,29,122,232,31,84,117,242,235,170,211, + 227,150,220,194,98,234,14,3,251,75,147,188,215,134,87,102,255,81,188,202,67,157,27,215,75,218,51,122,113,214,79,5,212,251,91,102,3,56,122,110, + 251,90,102,131,77,86,239,180,29,221,131,154,102,91,126,35,191,255,8,79,246,221,162,27,159,207,170,104,235,130,74,157,221,249,183,111,222,126,243,237, + 207,47,159,229,227,157,207,41,160,119,231,49,232,90,177,84,117,167,152,9,23,190,230,80,30,252,33,201,39,137,238,147,104,89,75,52,174,36,234,151, + 194,244,97,41,205,115,141,94,14,102,233,145,228,87,244,255,77,65,75,15,238,185,232,250,166,115,98,62,111,205,255,93,77,207,159,148,231,239,80,158, + 7,9,250,73,40,255,180,69,215,181,225,244,135,88,116,219,41,104,59,107,252,249,103,63,253,202,63,127,2,80,75,3,4,20,0,2,0,8,0,131, + 128,249,52,23,55,187,63,234,22,0,0,20,138,0,0,13,0,0,0,101,100,105,116,45,102,105,110,100,46,115,118,103,236,93,109,115,226,72,146,254, + 62,191,130,163,191,140,99,65,212,251,139,187,221,27,179,61,55,19,123,49,123,23,177,51,19,247,89,6,129,217,198,224,19,184,109,247,175,191,204,146, + 144,170,68,9,132,49,211,179,14,67,116,180,72,149,234,37,243,169,204,172,84,86,249,195,95,31,111,23,189,47,89,190,158,175,150,87,125,154,144,126, + 47,91,142,87,147,249,114,118,213,255,253,183,159,134,166,223,91,111,210,229,36,93,172,150,217,85,127,185,234,255,245,227,119,31,254,99,56,236,125,202, + 179,116,147,77,122,15,243,205,77,239,239,203,207,235,113,122,151,245,190,191,217,108,238,46,71,163,135,135,135,100,94,18,147,85,62,27,93,244,134,67, + 120,114,253,101,246,93,175,215,131,102,151,235,203,201,248,170,95,150,191,187,207,23,174,220,100,60,202,22,217,109,182,220,172,71,52,161,163,126,93,124, + 92,23,127,200,174,147,60,91,175,238,243,113,81,253,120,236,151,204,39,211,186,40,244,228,129,187,66,212,90,59,34,108,196,216,16,74,12,215,79,203, + 77,250,56,92,174,223,121,143,66,7,99,143,50,66,200,8,238,213,37,187,149,186,124,92,0,27,90,59,227,238,250,173,3,235,239,224,95,245,192,150, + 144,20,99,157,194,147,89,178,204,54,163,31,127,251,177,186,57,36,201,100,51,241,170,217,114,62,104,55,16,199,50,189,205,214,119,233,56,91,143,182, + 116,247,252,246,199,101,246,120,183,202,55,195,167,201,29,116,198,146,132,184,79,180,204,99,135,50,211,249,34,195,54,175,250,163,155,213,109,54,90,111, + 178,47,217,114,148,77,230,120,111,57,25,10,147,220,45,11,198,109,135,117,57,89,141,139,103,170,98,201,150,185,126,153,235,116,93,213,251,175,249,237, + 109,58,30,173,243,241,104,252,101,61,2,232,206,86,195,249,120,181,28,110,110,50,108,119,156,46,210,235,69,54,74,199,27,192,252,58,236,108,53,19, + 72,34,248,95,38,208,197,69,216,154,87,128,179,226,217,201,85,31,58,197,132,117,63,111,178,249,236,102,115,213,135,225,20,220,184,123,116,244,135,249, + 100,115,19,146,63,2,253,195,36,155,174,241,126,81,17,254,226,238,6,220,202,211,201,60,93,252,140,255,193,108,40,10,121,125,29,175,22,139,108,12, + 77,165,139,135,244,169,24,8,126,28,164,46,111,242,12,166,192,59,184,206,210,124,91,135,36,138,84,229,176,189,176,9,73,56,173,110,207,74,226,239, + 203,249,6,176,126,191,206,242,95,17,47,255,179,252,125,157,237,148,250,45,79,151,107,0,231,237,85,255,54,221,228,243,199,239,135,44,209,90,112,99, + 7,4,190,52,177,202,106,162,6,148,2,93,49,62,24,26,205,18,99,164,184,168,42,27,63,94,245,21,145,137,166,130,217,154,250,132,108,83,137,18, + 218,212,212,105,180,236,52,90,54,7,205,70,117,2,37,141,234,247,70,37,123,67,214,116,102,47,178,45,194,213,143,229,253,15,235,205,234,110,91,22, + 128,179,121,90,0,54,145,56,132,26,87,249,229,245,34,29,127,126,239,8,43,224,231,124,243,116,73,223,247,235,39,86,211,233,58,131,102,137,71,115, + 24,131,39,160,37,86,13,224,121,109,145,88,91,52,222,150,168,153,53,10,135,252,237,16,234,9,251,84,132,198,1,58,164,198,210,68,241,63,47,66, + 35,0,20,166,255,226,160,136,3,80,146,118,0,122,165,84,172,194,68,246,143,159,25,127,24,220,37,59,4,247,103,106,140,189,112,7,201,237,19,44, + 211,127,0,220,89,66,181,141,193,253,145,94,245,57,1,170,212,180,150,221,19,82,85,19,194,143,44,90,150,225,36,176,9,2,71,159,65,247,10,41, + 88,119,232,191,43,108,239,51,181,47,180,37,142,129,99,180,181,206,128,132,214,212,51,1,185,195,37,42,149,106,101,211,182,65,44,36,162,211,150,120, + 126,93,235,96,167,238,211,96,237,246,209,247,135,149,6,54,31,211,26,180,99,243,6,191,7,155,63,206,144,65,215,210,249,44,159,240,192,0,48,146, + 192,156,161,129,250,87,34,145,74,7,10,93,38,76,234,192,26,52,31,156,70,30,220,63,203,91,120,24,67,109,132,71,63,17,252,246,99,188,151,154, + 183,139,232,72,81,216,20,191,173,162,136,55,47,61,17,133,210,232,38,34,118,80,68,148,34,171,141,104,202,72,29,148,209,206,147,223,74,72,74,125, + 83,33,41,115,72,72,93,21,18,83,246,144,58,98,154,60,95,25,165,28,191,207,87,70,76,211,231,171,34,49,198,239,115,85,81,103,22,202,195,44, + 84,39,176,112,154,226,247,4,22,170,19,88,120,237,62,47,172,205,79,240,211,16,175,237,171,18,48,93,158,22,57,213,79,35,224,154,25,166,249,96, + 43,168,250,2,88,192,153,86,122,192,19,46,185,148,88,70,9,37,132,14,151,40,38,49,76,8,106,73,160,0,121,162,165,162,204,200,64,225,237,150, + 157,70,203,130,182,228,26,168,84,211,218,84,156,131,213,242,16,171,205,233,172,198,40,80,230,56,77,132,229,200,87,65,41,103,33,23,57,135,251,202, + 55,206,142,139,176,162,227,202,210,208,108,236,150,157,70,203,2,23,97,241,167,137,17,222,66,234,12,92,44,60,190,189,124,84,230,207,5,89,42,184, + 179,112,62,179,117,194,20,44,50,148,110,64,182,89,118,26,45,139,144,133,178,210,40,43,15,49,123,215,25,136,25,254,105,87,223,34,230,132,236,227, + 31,99,176,26,139,241,175,186,37,18,69,185,100,22,24,105,181,53,196,92,28,41,190,93,16,48,102,120,28,76,13,151,170,21,137,221,152,170,247,122, + 188,211,142,46,245,191,11,75,229,30,150,242,147,89,122,138,82,112,139,229,246,190,195,109,19,114,91,36,156,128,8,100,24,233,98,9,209,192,174,80, + 128,59,69,167,177,162,24,231,146,96,112,168,164,162,131,16,105,68,118,181,16,141,0,205,90,83,56,92,1,56,58,11,241,232,48,155,16,130,28,114, + 185,160,12,235,31,237,243,235,9,126,79,9,125,189,187,166,248,237,224,207,123,209,184,93,87,204,27,134,57,236,226,65,41,241,124,31,79,25,252,158, + 219,77,22,128,234,195,66,107,137,87,118,26,135,102,118,58,110,4,62,0,157,68,27,193,169,120,223,133,141,158,75,115,52,27,227,205,43,173,192,165, + 147,47,201,71,48,172,7,7,226,185,201,157,193,31,13,28,117,98,219,41,139,180,88,171,32,53,81,240,237,5,217,166,245,97,157,127,120,164,207,224, + 107,75,172,179,3,95,13,61,16,163,236,30,235,124,169,197,46,7,103,175,187,50,108,129,84,183,48,47,180,213,65,247,49,174,69,87,173,218,29,126, + 128,61,64,32,59,78,245,31,136,188,118,155,34,222,184,200,139,73,205,136,99,164,102,82,252,30,101,194,246,140,195,236,179,96,177,168,141,193,239,75, + 113,209,72,242,199,71,41,66,101,19,89,243,189,224,219,164,253,174,25,215,176,32,28,12,49,182,64,137,50,217,16,28,53,102,18,11,75,65,115,209, + 244,49,41,39,132,154,112,145,173,97,69,169,45,99,77,39,179,81,118,26,45,139,94,166,74,36,51,138,177,147,223,57,237,11,85,32,190,247,189,117, + 57,250,101,53,190,112,99,58,1,109,199,5,13,94,184,49,24,144,33,204,170,240,133,27,77,56,151,214,123,111,243,228,94,195,37,82,106,173,207,58, + 120,231,13,239,27,252,11,230,146,224,40,133,180,241,248,2,179,148,89,54,24,42,88,196,113,35,224,74,39,66,17,37,77,243,69,102,162,164,98,146, + 132,47,50,69,210,152,197,142,175,28,116,177,209,126,217,130,219,4,43,32,103,5,21,87,251,65,197,249,51,64,69,13,240,137,41,205,131,193,83,158, + 40,194,168,183,160,198,193,83,141,70,204,88,30,12,158,201,68,11,142,30,222,57,87,168,232,173,239,211,96,252,88,13,134,58,6,7,47,136,109,100, + 108,48,154,24,10,139,211,48,182,180,91,118,26,45,139,129,60,88,242,130,158,151,244,188,28,81,251,117,58,127,201,132,24,9,3,87,28,103,144,6, + 73,19,146,13,153,24,12,93,14,139,16,220,253,98,9,147,160,212,129,12,136,32,210,106,137,57,4,137,21,148,144,80,181,195,74,95,80,193,117,35, + 84,198,19,92,26,145,48,126,176,91,118,26,45,11,108,87,229,52,222,206,194,15,35,204,154,115,87,85,154,30,102,13,78,190,204,179,135,239,66,1, + 60,204,151,147,213,195,16,163,133,91,182,53,239,97,124,177,90,143,53,111,110,179,251,76,165,135,155,37,202,60,63,74,232,78,137,201,106,124,143,121, + 173,195,251,66,62,101,102,160,87,98,150,207,39,195,235,235,21,244,97,147,223,111,69,182,190,89,61,224,157,128,88,99,234,62,207,177,210,69,250,148, + 1,119,220,127,59,77,59,198,139,196,26,98,5,223,185,249,232,102,183,229,70,147,157,129,127,93,173,110,107,231,191,34,223,165,179,108,125,147,194,136, + 225,217,216,205,210,133,114,78,90,121,255,122,149,79,178,220,187,193,164,176,132,86,172,44,238,59,119,12,166,129,114,159,242,22,214,184,189,81,184,187, + 253,58,105,18,211,63,155,93,64,158,249,125,156,166,139,42,228,243,225,54,219,164,147,116,147,214,85,108,41,162,202,189,156,76,47,255,249,227,79,149, + 251,56,30,95,254,239,42,255,92,123,122,88,32,189,94,221,3,24,42,23,23,211,57,199,151,56,165,210,205,199,249,45,52,143,185,192,127,121,188,93, + 0,70,171,27,65,225,205,211,93,86,87,90,84,187,205,107,142,230,70,79,198,183,115,124,104,244,235,102,190,88,252,29,27,241,220,220,178,210,249,102, + 145,125,252,207,201,124,211,251,9,80,233,26,47,104,65,177,245,253,245,191,64,27,125,244,218,119,227,254,91,58,243,105,37,117,49,255,136,89,184,31, + 70,229,143,104,137,169,107,110,95,137,197,106,156,110,178,253,101,214,160,255,198,55,177,50,5,45,232,160,27,221,206,80,80,96,139,249,56,91,174,15, + 179,119,140,137,236,243,47,0,176,219,219,213,114,237,56,93,62,187,30,93,63,13,215,233,136,37,100,180,195,102,247,220,42,15,250,7,205,254,48,171, + 124,252,93,161,252,234,210,158,123,63,167,121,14,98,140,73,6,71,180,91,139,43,185,211,160,147,162,27,204,78,223,86,75,80,233,215,247,199,246,239, + 191,210,207,247,215,61,232,37,24,161,252,216,238,237,182,233,202,226,196,241,39,210,47,77,185,120,115,169,155,72,10,121,132,210,190,203,114,152,25,235, + 131,210,142,237,28,248,103,118,151,175,38,247,46,35,60,20,243,137,21,255,56,95,23,44,137,85,156,103,255,119,63,135,39,158,85,243,127,175,54,192, + 143,151,173,243,135,77,123,103,79,226,66,150,207,191,56,121,34,20,214,47,219,233,95,111,210,60,251,97,49,255,236,51,195,225,174,196,89,149,176,82, + 171,244,15,163,173,194,119,191,102,59,102,120,117,127,119,187,154,100,165,57,245,108,77,220,188,46,210,235,108,113,213,255,213,25,155,173,9,153,125,23, + 6,27,38,243,245,29,60,126,57,95,162,135,23,248,116,51,73,188,229,235,38,226,152,81,37,97,57,9,14,88,153,189,41,140,212,206,33,27,8,240, + 145,136,86,3,193,18,101,192,27,188,168,35,46,57,168,196,154,167,96,114,135,84,194,34,8,150,230,126,34,238,163,163,75,139,126,29,247,232,213,78, + 6,13,142,174,212,212,143,81,111,189,28,206,45,166,74,203,70,8,4,27,22,84,243,221,24,88,29,235,18,132,17,69,141,124,239,231,238,78,193,166, + 93,130,181,251,254,221,110,34,236,133,187,235,197,243,220,207,252,126,145,93,46,87,203,175,224,89,188,135,201,182,250,236,126,102,229,117,225,143,93,210, + 237,79,172,22,68,118,9,18,94,78,124,226,191,86,243,229,37,32,60,203,223,223,166,249,231,44,47,106,41,174,135,235,77,154,111,2,202,237,124,18, + 252,206,150,147,160,93,87,213,98,14,255,93,138,45,109,146,130,59,146,231,128,1,191,36,82,139,152,210,37,217,210,234,65,126,153,175,231,215,243,5, + 254,112,151,139,236,125,8,164,247,171,47,89,62,93,172,30,182,247,253,105,112,151,110,110,60,25,84,238,49,96,27,157,8,112,66,199,240,105,72,15, + 31,130,101,141,47,111,160,254,163,55,100,20,164,13,203,98,204,26,70,32,25,194,77,239,83,11,221,163,114,166,193,103,39,130,198,137,80,131,86,176, + 224,128,21,190,0,178,73,164,36,70,245,40,174,56,13,21,106,192,24,192,197,16,45,183,52,110,6,198,36,248,58,147,75,120,188,166,14,97,54,72, + 205,56,97,189,33,172,225,149,148,130,123,189,82,45,125,253,218,59,1,169,187,59,20,222,144,122,50,82,79,148,1,167,111,50,232,40,131,230,36,175, + 76,65,99,146,71,233,30,213,155,228,49,34,214,160,9,24,50,166,164,55,201,135,248,198,3,138,48,233,205,114,143,232,79,115,143,236,207,115,170,133, + 76,24,149,58,152,231,209,238,6,243,188,86,117,129,105,107,85,146,117,56,127,86,248,16,51,223,121,216,103,228,15,58,22,13,63,226,111,222,130,118, + 235,115,208,106,101,234,25,245,178,209,240,21,92,219,172,112,169,115,205,105,81,189,224,104,157,30,45,53,169,139,198,156,169,106,234,52,119,2,170,143, + 254,102,53,62,222,155,247,118,71,113,218,100,220,51,123,174,97,221,250,185,125,242,108,157,30,12,199,213,33,172,210,75,226,34,193,80,178,23,98,174, + 92,43,146,88,70,132,173,99,158,143,46,190,69,184,148,172,6,165,203,199,116,73,115,94,78,95,142,33,157,132,10,152,19,254,158,177,110,240,112,195, + 125,25,36,40,243,134,132,40,18,148,151,125,189,69,2,238,193,146,198,11,35,111,145,192,49,130,170,184,9,144,0,186,19,42,145,60,64,130,72,164, + 225,182,137,4,82,34,193,203,181,203,31,3,114,133,144,89,100,157,225,46,23,233,6,115,98,139,236,204,193,144,39,218,26,203,113,145,113,17,174,86, + 24,230,230,87,150,123,22,170,212,25,245,95,12,85,32,116,176,219,190,170,62,22,121,239,66,105,199,80,226,181,184,121,102,50,160,85,154,24,10,23, + 76,8,171,217,133,31,96,136,7,246,91,98,242,97,14,152,159,185,72,172,13,239,120,185,163,36,184,179,205,71,109,140,205,79,151,108,86,54,109,173, + 172,219,126,149,200,123,242,182,92,137,174,123,87,130,13,36,34,216,62,119,160,53,122,184,53,161,241,219,222,154,10,3,13,209,29,43,17,223,211,107, + 171,242,15,131,70,156,159,196,120,34,152,113,111,32,221,91,10,184,2,23,197,167,202,132,8,14,84,124,119,180,165,225,166,73,6,52,88,132,24,41, + 67,26,172,99,116,98,12,109,148,84,9,51,172,174,177,73,171,219,246,169,48,167,172,194,146,88,99,65,35,54,1,84,135,109,87,180,79,126,47,43, + 170,63,26,172,177,73,219,182,29,184,85,181,99,69,195,36,194,163,103,145,36,71,204,162,50,91,152,176,216,44,210,71,206,162,120,101,127,146,89,36, + 217,31,57,139,164,248,99,102,145,42,193,20,206,34,85,78,34,127,22,185,157,199,142,86,35,185,166,249,179,200,43,89,205,141,186,70,143,230,181,237, + 81,203,73,228,207,34,89,78,13,191,237,154,230,207,162,154,234,141,166,156,68,36,58,238,214,89,36,131,93,127,163,217,254,53,115,155,251,143,201,254, + 23,221,86,193,7,236,171,147,156,77,172,133,149,19,177,3,6,151,176,206,98,10,198,95,83,57,174,217,165,228,4,104,138,105,240,81,41,210,180,6, + 238,74,160,193,170,13,174,124,218,167,158,73,52,35,70,24,238,81,77,185,109,132,149,53,114,66,61,154,223,118,64,21,214,192,220,118,53,82,162,13, + 65,26,229,84,90,237,181,93,211,62,121,189,244,75,122,99,20,214,82,198,162,227,142,46,43,113,83,43,57,24,225,216,35,45,121,22,105,81,88,80, + 43,77,117,40,45,124,129,207,96,133,236,75,11,16,206,12,40,65,95,90,53,205,151,86,77,173,101,80,215,24,208,170,182,3,42,161,28,26,240,164, + 5,51,174,112,67,253,182,43,154,47,45,191,164,55,26,168,17,92,184,232,184,91,165,165,155,75,252,134,208,124,145,237,46,160,0,177,114,199,143,197, + 151,125,171,201,164,197,143,45,214,75,176,6,52,160,74,56,221,9,59,93,223,111,54,45,81,167,14,235,165,186,99,132,106,41,184,241,82,107,28,40, + 192,166,75,130,81,148,129,4,116,11,166,149,234,253,226,81,5,40,41,66,76,99,235,99,193,45,165,107,219,24,143,152,212,204,124,97,30,86,233,174, + 93,214,156,47,197,66,88,165,43,109,188,148,182,130,131,172,76,247,5,14,18,70,36,149,2,57,88,81,241,221,12,55,140,153,40,7,69,55,14,54, + 2,77,157,223,82,201,150,232,210,63,210,217,114,62,125,154,47,103,189,159,23,233,122,155,133,20,15,96,237,89,51,214,123,255,8,124,105,124,239,95, + 113,193,18,174,184,98,166,186,181,179,160,148,188,237,181,85,123,16,227,157,189,198,111,19,66,18,237,174,150,246,168,136,239,55,140,89,224,182,37,106, + 52,229,220,124,179,168,69,16,183,48,106,247,77,31,99,69,247,69,228,5,97,44,17,186,72,233,114,84,223,137,6,223,218,70,74,151,161,10,152,63, + 74,88,255,173,97,17,218,32,74,114,75,140,167,160,223,80,242,237,81,98,206,137,18,74,147,55,148,188,2,148,88,114,86,148,240,55,148,188,10,148, + 176,179,162,68,190,161,228,85,160,68,156,21,37,250,13,37,175,2,37,103,245,94,169,125,67,201,171,64,201,89,189,87,246,230,189,190,6,148,104,114, + 86,239,149,189,121,175,175,2,37,60,226,189,218,196,98,223,37,63,2,37,34,177,248,105,162,164,213,123,37,202,48,34,24,183,111,48,249,183,128,201, + 11,57,38,45,48,121,115,76,94,7,74,204,57,81,194,223,28,147,87,129,18,65,206,138,146,55,199,228,117,160,132,157,21,37,111,97,181,215,129,146, + 72,88,13,143,99,128,190,211,23,64,73,123,88,141,40,98,165,100,29,80,82,231,99,204,130,247,198,84,235,125,219,38,73,162,160,42,173,163,105,191, + 229,45,24,169,53,74,72,76,36,129,70,185,244,246,79,182,236,158,195,23,244,87,253,52,31,239,219,52,70,53,165,140,89,243,190,235,230,140,221,13, + 142,145,188,232,70,46,196,201,200,62,207,22,38,186,101,115,247,173,76,135,19,250,79,218,218,180,77,187,16,66,203,216,94,159,248,73,84,126,129,232, + 65,83,94,1,196,116,125,232,84,172,128,219,197,97,57,103,38,152,86,46,145,68,224,217,68,0,67,210,171,26,233,253,208,171,234,235,85,15,246,72, + 143,194,183,167,19,133,41,78,74,13,58,62,16,107,225,235,222,164,121,154,8,161,4,143,39,118,72,252,235,117,100,48,4,81,91,45,36,238,178,114, + 135,131,43,115,113,228,254,211,245,122,60,30,151,255,190,194,39,34,53,102,196,14,199,168,193,20,48,169,240,240,94,119,26,180,192,93,106,20,183,144, + 25,193,125,42,199,228,77,13,107,229,129,77,180,128,113,75,235,209,92,110,39,76,123,204,73,171,169,76,37,196,37,152,249,53,50,220,234,76,165,241, + 219,174,104,159,122,96,89,41,209,148,9,143,10,139,119,170,141,212,100,0,158,55,19,70,43,217,99,192,40,226,142,172,130,53,27,227,68,82,220,29, + 7,84,97,165,165,18,243,28,25,215,220,50,164,41,198,153,212,238,105,16,159,182,61,134,27,226,52,238,106,5,26,136,0,174,122,191,244,184,77,4, + 3,29,66,6,2,101,163,141,192,241,56,153,131,29,118,155,195,165,177,84,203,30,94,17,99,97,140,112,37,96,104,68,245,112,51,157,33,156,186,167, + 161,26,110,44,62,141,123,237,168,226,102,0,181,91,67,173,166,72,131,238,50,28,185,73,40,3,20,105,124,154,105,24,36,71,40,18,169,164,181,216, + 35,150,112,202,53,148,132,81,72,102,169,65,30,65,159,149,96,76,56,14,91,33,45,1,89,144,196,48,232,18,69,154,214,156,81,71,35,96,212,185, + 163,25,128,173,82,197,211,214,10,134,84,145,112,112,130,133,232,129,175,202,53,30,90,56,96,120,74,152,86,138,123,180,64,186,21,181,198,1,182,168, + 148,178,62,94,98,200,250,218,115,136,147,0,123,41,6,208,184,194,179,198,156,220,84,66,45,21,148,123,84,232,39,32,70,51,11,45,225,233,227,48, + 0,143,134,25,139,10,92,36,94,140,168,164,66,61,156,43,197,84,175,192,30,225,46,135,214,74,152,197,198,107,187,166,125,194,84,61,38,44,33,210, + 163,74,0,10,232,48,162,6,128,61,208,118,212,42,143,230,183,93,83,109,162,52,112,83,81,172,17,83,58,169,173,70,67,162,227,222,183,97,186,86, + 217,49,39,110,50,198,239,209,150,46,114,38,0,30,175,215,216,122,134,235,22,105,192,167,121,179,126,221,55,87,159,69,94,237,158,137,120,147,77,22, + 51,102,132,89,156,200,48,255,112,247,39,45,141,25,104,57,229,83,193,68,81,80,123,196,160,18,35,154,107,235,211,80,221,105,176,250,182,48,102,37, + 21,21,10,55,168,238,188,26,25,58,192,204,112,191,237,138,230,140,25,177,160,43,141,71,117,198,12,140,7,115,230,72,43,65,85,97,204,164,85,46, + 193,158,57,115,177,53,102,214,82,167,194,152,2,55,93,20,198,76,43,93,60,109,185,52,210,25,51,240,189,133,198,86,8,35,194,136,210,152,129,163, + 162,185,51,102,218,40,75,11,99,6,102,83,148,39,157,72,46,160,71,104,204,80,157,73,103,224,192,46,129,10,3,115,164,184,226,160,214,208,152,105, + 201,156,242,7,195,5,14,57,177,122,0,245,16,14,230,138,57,99,166,209,204,59,99,6,38,12,188,37,120,26,253,38,77,209,152,81,194,9,227,165, + 49,131,15,30,69,1,198,12,15,72,150,165,49,195,179,55,29,135,193,118,43,148,15,24,51,48,55,133,129,211,232,111,49,103,204,64,13,131,129,196, + 114,184,172,114,230,8,70,12,22,84,203,194,152,89,161,153,51,81,160,199,209,104,162,49,195,63,156,225,209,2,233,86,212,26,7,206,152,25,46,124, + 188,196,144,181,53,102,96,100,96,68,10,4,4,253,21,78,234,34,49,176,58,5,85,191,165,130,140,240,85,6,122,142,3,48,14,28,132,206,3,26, + 166,223,203,242,233,138,202,192,253,100,138,67,91,117,141,24,160,102,133,145,169,218,174,105,120,136,7,24,51,105,193,221,168,169,248,23,49,13,3,46, + 120,53,214,52,191,237,45,213,120,189,172,107,172,199,24,27,119,116,67,128,16,156,188,140,10,141,154,174,221,3,42,222,86,123,47,171,83,65,139,72, + 220,89,37,10,45,2,158,40,110,208,226,136,45,195,113,59,145,77,56,17,146,112,212,44,232,71,115,208,3,206,29,100,202,160,30,32,150,18,116,189, + 113,30,91,238,102,124,140,234,116,3,129,218,157,110,224,20,180,88,148,230,230,7,55,224,134,59,151,88,104,33,172,65,13,8,64,7,231,24,81,143, + 103,84,48,130,52,9,62,184,59,35,7,183,34,129,94,43,180,226,206,120,218,144,219,229,60,139,113,135,117,90,135,72,199,94,232,119,59,102,160,139, + 171,199,249,206,41,3,140,192,234,84,188,65,191,37,208,17,236,158,13,2,29,187,231,251,54,2,29,197,222,45,198,121,107,160,3,255,96,150,145,193, + 170,60,8,116,196,10,20,27,62,13,6,108,193,9,233,85,141,96,220,98,91,220,187,42,227,22,10,150,187,12,140,189,30,116,124,32,214,194,161,64, + 7,115,75,234,248,233,210,197,173,33,110,216,148,232,1,12,21,250,10,4,0,121,48,136,237,29,95,132,225,0,73,236,139,77,146,150,93,80,120,250, + 148,228,246,109,78,196,98,221,160,112,101,36,212,109,17,64,34,200,162,168,206,103,73,192,129,22,218,240,48,212,13,6,131,107,112,207,116,24,234,198, + 195,54,136,81,68,138,70,172,27,15,19,7,27,192,84,35,212,205,192,87,212,220,242,67,135,87,128,19,107,13,254,165,35,133,97,26,61,24,226,33, + 29,198,18,6,36,173,8,56,133,187,208,189,56,77,189,119,141,90,243,103,68,173,223,129,105,44,254,58,103,232,202,104,33,149,149,127,58,236,158,130, + 210,184,102,102,251,52,51,254,9,43,186,71,51,3,28,153,109,13,65,215,103,146,183,104,230,88,129,66,51,203,196,252,127,123,87,146,194,48,12,3, + 239,125,69,30,80,130,181,88,142,160,244,255,207,234,140,27,130,41,110,155,75,111,189,25,37,194,11,178,208,140,45,57,1,130,98,57,58,129,163,61, + 126,31,90,187,163,101,210,111,65,28,82,174,39,21,102,61,124,243,204,6,195,23,159,122,230,253,19,252,177,34,138,103,241,63,214,184,223,178,126,164, + 160,95,61,51,240,18,212,235,249,115,26,203,127,228,254,115,54,132,55,116,129,234,219,202,35,142,236,156,2,208,92,122,154,142,210,109,109,198,231,122, + 132,168,47,196,162,155,221,33,11,62,63,162,189,248,220,32,133,93,178,130,125,48,181,188,106,180,218,19,216,91,201,2,252,143,70,203,234,204,89,229, + 201,134,136,251,147,104,45,38,8,38,136,203,29,176,188,54,142,199,130,181,131,40,107,206,247,47,23,49,168,3,56,142,50,104,39,169,110,13,29,164, + 196,197,205,176,217,251,40,183,42,136,230,177,63,20,129,140,96,60,176,203,146,145,157,75,177,149,1,144,231,21,115,32,231,2,116,194,251,197,78,38, + 103,88,139,217,170,189,193,7,161,211,98,118,55,86,43,191,95,30,80,75,3,4,20,0,2,0,8,0,141,128,249,52,100,188,189,164,140,9,0,0, + 25,36,0,0,13,0,0,0,101,100,105,116,45,117,110,100,111,46,115,118,103,221,89,89,147,219,184,17,126,247,175,96,228,23,187,86,4,113,17,36, + 52,199,150,227,201,166,54,229,36,85,107,187,242,152,162,72,72,162,135,34,21,144,26,73,254,245,105,128,20,143,17,53,135,199,187,78,69,83,83,35, + 52,26,221,192,215,7,186,49,151,63,239,215,153,115,167,116,153,22,249,213,132,32,60,113,84,30,23,73,154,47,175,38,159,63,253,226,134,19,167,172, + 162,60,137,178,34,87,87,147,188,152,252,124,253,234,242,79,174,235,188,215,42,170,84,226,236,210,106,229,252,154,223,150,113,180,81,206,155,85,85,109, + 102,158,183,219,237,80,218,16,81,161,151,222,91,199,117,97,101,121,183,124,229,56,14,168,205,203,89,18,95,77,26,254,205,86,103,150,47,137,61,149, + 169,181,202,171,210,35,136,120,147,142,61,238,216,119,106,142,180,42,139,173,142,107,241,113,220,231,212,201,162,99,133,157,236,152,101,34,82,74,15,83, + 143,82,23,56,220,242,144,87,209,222,205,203,215,189,165,176,193,177,165,20,99,236,193,92,199,249,52,174,217,62,3,24,206,110,198,206,246,181,3,244, + 27,248,109,23,180,24,214,103,93,192,74,133,114,85,121,55,159,110,188,35,183,139,81,82,37,61,49,199,85,3,189,3,115,228,209,90,149,155,40,86, + 101,171,194,174,63,14,102,106,191,41,116,229,30,146,13,108,70,98,132,237,103,148,103,255,4,158,69,154,41,163,243,106,226,173,138,181,242,190,164,235, + 117,20,123,55,170,188,173,138,141,183,75,129,3,109,242,26,185,93,154,84,171,171,9,15,55,123,59,94,169,116,185,170,122,132,52,185,154,0,204,132, + 176,70,221,17,137,89,235,203,24,49,58,220,73,111,138,179,159,18,117,167,178,225,218,164,136,231,81,217,110,177,74,151,74,87,94,124,87,122,11,173, + 84,82,111,213,162,7,17,177,44,220,52,46,114,183,90,129,179,122,160,33,139,230,153,242,162,184,2,29,229,137,224,250,236,42,73,43,119,155,39,5, + 58,58,73,187,187,98,91,109,182,213,191,213,190,82,121,189,77,80,212,179,153,157,54,203,90,218,228,26,4,92,38,106,81,26,65,53,40,102,196,236, + 4,76,129,111,169,72,255,85,71,73,10,225,84,51,245,52,198,69,150,169,24,96,141,178,93,116,168,183,124,148,51,92,74,25,21,141,80,16,91,2, + 10,71,94,56,100,117,200,224,100,134,232,130,196,66,207,94,47,236,231,194,146,10,240,177,180,58,204,200,197,164,91,83,44,22,165,2,197,184,71,179, + 38,133,21,160,11,114,142,247,50,109,120,76,27,25,213,198,112,171,237,210,27,30,251,251,195,72,158,3,99,204,35,136,166,111,134,145,60,15,198,49, + 109,207,128,145,254,145,48,226,240,25,48,170,36,225,47,129,17,63,11,198,49,109,207,128,145,208,63,12,198,80,8,250,12,24,235,220,254,141,48,130, + 46,254,44,24,199,180,61,25,70,208,38,30,131,209,140,162,236,217,48,218,251,122,182,210,10,234,139,215,35,120,246,225,30,170,128,233,176,157,142,247, + 87,19,202,81,200,2,2,153,181,165,30,174,38,76,32,78,9,161,65,75,93,140,242,46,70,121,53,0,226,35,193,121,192,58,226,178,217,193,39,29, + 229,37,20,16,235,171,201,58,170,116,186,127,67,154,27,123,138,71,190,248,76,4,148,77,93,129,40,13,168,240,149,75,248,148,8,20,6,12,139,183, + 39,210,63,231,105,5,53,209,182,84,250,163,169,43,254,153,127,46,85,103,133,51,110,123,26,220,36,236,118,126,214,28,103,28,169,141,35,18,202,71, + 60,243,233,215,214,89,183,237,180,73,242,136,103,62,253,218,250,125,162,255,1,183,29,2,126,98,15,18,64,228,62,205,214,143,251,155,75,80,72,24, + 15,8,248,146,152,194,136,4,68,210,254,183,1,3,23,64,230,28,79,125,142,8,38,132,116,94,183,39,0,112,128,176,192,33,238,130,226,96,168,4, + 49,233,227,46,20,247,20,136,20,9,202,89,47,40,14,53,213,135,176,18,242,81,55,125,9,190,230,182,122,176,38,224,131,83,81,129,252,193,129,24, + 71,212,31,156,6,88,122,20,115,18,206,144,31,144,144,145,239,20,150,47,58,47,17,15,151,146,244,7,158,247,251,167,125,91,27,159,79,251,80,96, + 210,65,218,135,252,140,37,199,108,144,245,9,67,52,132,44,75,6,89,255,132,117,49,202,106,146,62,70,68,112,33,158,16,131,20,113,41,48,35,54, + 232,124,34,177,111,99,13,174,2,65,2,95,216,1,69,208,87,137,80,78,93,234,35,66,57,166,192,29,160,144,10,246,204,204,127,233,153,142,196,126, + 107,187,33,211,10,37,119,169,218,189,106,114,163,46,110,33,57,54,21,104,35,30,250,197,12,104,117,57,53,233,26,28,211,160,53,195,77,180,84,54, + 153,2,95,157,77,155,137,121,161,19,165,143,83,194,126,6,83,77,190,53,157,32,245,185,196,68,30,231,91,79,48,194,123,108,120,108,190,92,69,73, + 177,3,255,188,63,249,181,40,0,112,10,128,133,156,6,228,254,180,113,3,22,192,221,141,89,235,215,221,36,232,115,193,242,224,221,66,158,72,142,183, + 90,3,228,110,22,29,20,28,206,254,57,202,47,87,197,110,169,13,72,139,40,107,81,106,151,154,41,119,62,47,64,121,165,183,39,211,208,163,110,205, + 171,11,180,167,214,156,77,167,221,227,48,242,251,199,30,213,178,75,161,187,221,185,77,7,31,74,114,134,225,216,210,75,70,207,112,152,178,71,242,51, + 147,0,82,32,142,181,242,229,90,85,81,18,85,81,231,38,71,10,63,246,194,58,89,204,126,187,249,165,189,202,227,120,246,175,66,223,118,87,180,97, + 136,230,208,102,95,77,218,242,194,180,215,241,204,132,79,84,93,167,107,56,187,121,220,249,105,191,206,192,175,219,137,1,115,117,216,168,78,104,45,246, + 248,80,53,250,216,149,196,235,212,44,242,62,86,224,242,191,26,37,189,146,163,22,26,155,167,182,66,95,247,4,155,3,188,91,182,133,193,96,11,105, + 149,169,235,191,69,183,219,185,243,177,82,144,173,180,221,110,77,239,203,240,78,133,88,206,19,125,70,108,125,134,235,230,8,245,251,13,90,111,203,52, + 94,69,89,134,226,175,118,105,195,245,170,191,207,44,141,85,94,62,14,139,85,155,222,65,80,175,215,69,94,90,132,154,181,165,55,63,184,101,228,81, + 132,189,19,120,234,131,253,37,73,43,231,51,120,199,216,97,237,1,182,243,47,144,220,7,8,152,125,252,57,90,222,3,209,80,179,244,218,188,214,92, + 122,205,96,148,99,107,213,61,196,161,213,157,210,163,82,106,218,64,121,141,224,112,155,214,72,198,85,251,174,251,225,62,162,61,239,125,38,152,67,83, + 109,148,6,119,44,31,53,213,216,251,235,111,106,163,139,100,107,31,192,134,54,122,161,224,155,20,238,136,116,190,29,21,172,213,127,182,41,172,248,38, + 201,255,40,42,128,228,251,202,124,87,157,223,236,139,80,80,58,189,179,38,53,222,80,126,223,77,127,92,69,90,189,203,210,219,62,24,214,245,26,87, + 59,118,37,189,60,122,233,29,179,172,29,45,187,236,59,184,150,218,212,157,69,115,5,119,250,7,51,233,144,211,235,169,216,110,214,69,162,154,229,199, + 196,189,137,170,213,241,72,213,88,71,193,67,25,48,49,210,194,186,166,189,37,212,167,83,129,145,192,28,152,2,31,49,232,162,113,87,196,192,110,255, + 238,112,12,82,72,40,152,211,182,212,206,59,167,237,164,157,16,90,10,40,135,152,239,96,135,192,143,35,17,116,43,44,12,253,233,19,23,140,105,248, + 218,110,162,45,141,52,220,107,237,218,145,233,253,88,127,223,78,143,191,31,116,211,163,15,9,198,94,6,227,80,136,174,63,110,250,213,182,47,69,132, + 19,211,9,6,23,195,247,25,83,165,205,224,50,123,243,250,244,177,227,173,157,237,117,210,118,168,183,153,154,65,78,204,139,36,185,168,75,191,89,94, + 228,170,249,94,23,14,192,220,12,77,173,13,238,49,131,120,170,250,180,47,69,154,207,32,148,148,190,88,71,250,86,233,90,72,253,221,45,171,72,87, + 3,202,58,77,6,99,149,39,3,181,86,84,150,194,159,25,193,71,98,18,65,169,163,117,116,24,176,26,106,221,227,207,90,206,238,144,119,105,153,206, + 211,204,12,236,215,76,93,36,105,185,1,151,158,165,185,217,249,69,1,23,194,34,43,118,199,249,83,67,153,114,0,90,16,29,119,125,75,63,10,238, + 25,135,156,181,201,105,167,121,223,38,8,247,172,2,135,252,10,181,241,209,42,163,34,40,125,123,207,82,77,180,17,250,3,77,198,127,39,139,205,179, + 34,190,61,111,48,155,59,36,242,67,202,57,153,114,232,214,24,36,25,233,188,119,184,132,132,3,100,105,222,48,152,239,251,88,58,220,54,110,28,251, + 83,66,17,133,248,246,29,10,205,152,160,16,90,134,196,101,32,124,231,67,143,200,160,247,162,20,178,1,80,125,243,48,34,169,12,167,208,136,5,56, + 12,137,28,242,50,48,132,96,220,104,31,163,118,52,202,16,99,129,20,227,180,247,38,65,249,212,247,41,80,41,10,124,243,111,74,147,190,4,147,146, + 193,121,56,10,2,12,77,211,216,193,191,58,39,105,133,240,94,255,219,181,128,144,231,141,151,67,159,17,215,159,51,174,254,192,130,251,154,40,9,130, + 161,105,24,56,39,120,108,8,56,72,200,251,62,156,197,216,198,156,202,103,161,1,135,50,63,148,212,129,105,74,49,14,216,20,186,107,28,6,112,165, + 56,20,110,22,30,6,152,24,26,156,87,250,22,240,150,234,35,238,227,80,4,161,1,124,132,10,253,29,198,82,208,218,96,132,131,162,81,90,95,38, + 3,152,253,16,250,240,129,204,142,218,209,192,52,44,196,50,144,163,52,107,68,10,215,147,111,169,0,66,0,14,200,124,227,148,194,184,5,180,151,44, + 244,129,115,12,162,158,21,79,238,1,33,67,184,196,196,104,206,177,33,119,54,231,63,158,93,204,5,115,47,187,96,36,237,39,248,127,188,15,206,100, + 151,167,228,124,140,124,66,24,24,130,63,241,66,54,207,80,15,38,255,255,233,43,153,255,160,27,217,102,17,129,4,149,80,49,17,19,180,34,164,129, + 12,32,104,77,14,15,125,72,199,144,58,113,0,17,40,32,234,72,136,124,1,65,196,76,212,65,89,106,162,14,234,181,128,153,162,211,252,239,36,32, + 24,114,171,67,5,146,126,200,185,48,185,69,16,33,25,171,147,57,134,248,148,210,220,6,82,134,148,240,58,59,72,106,222,235,56,164,104,16,46,40, + 16,199,246,52,146,124,225,190,230,79,72,190,237,91,29,180,162,151,230,133,227,250,213,127,1,80,75,3,4,20,0,2,0,8,0,143,128,249,52,187, + 167,102,138,170,9,0,0,119,36,0,0,13,0,0,0,101,100,105,116,45,114,101,100,111,46,115,118,103,221,89,235,147,219,182,17,255,238,191,130,149, + 191,196,19,17,196,139,0,161,123,100,220,184,233,164,147,182,51,113,50,253,216,161,72,72,98,142,34,85,146,58,73,254,235,187,0,223,39,202,167,179, + 29,183,19,122,60,34,119,23,187,192,62,126,192,226,110,191,59,110,83,231,81,23,101,146,103,119,51,130,240,204,209,89,148,199,73,182,190,155,253,250, + 203,15,110,48,115,202,42,204,226,48,205,51,125,55,203,242,217,119,247,175,110,255,228,186,206,247,133,14,43,29,59,135,164,218,56,63,102,15,101,20, + 238,180,243,205,166,170,118,11,207,59,28,14,40,105,136,40,47,214,222,27,199,117,97,100,249,184,126,229,56,14,152,205,202,69,28,221,205,26,249,221, + 190,72,173,92,28,121,58,213,91,157,85,165,71,16,241,102,189,120,212,139,31,244,18,21,186,204,247,69,84,171,143,162,161,100,17,175,122,81,152,201, + 129,89,33,162,148,242,48,245,40,117,65,194,45,79,89,21,30,221,172,124,61,24,10,19,156,26,74,49,198,30,240,122,201,235,164,22,199,20,220,112, + 113,50,150,59,180,14,174,223,193,255,110,64,231,195,122,173,43,24,169,81,166,43,239,221,47,239,188,86,218,197,40,174,226,129,154,118,212,200,238,40, + 28,89,184,213,229,46,140,116,217,153,176,227,219,143,133,62,238,242,162,114,79,241,14,38,163,48,194,246,153,148,57,94,33,179,74,82,109,108,222,205, + 188,77,190,213,222,111,201,118,27,70,222,59,93,62,84,249,206,59,36,32,129,118,89,237,185,67,18,87,155,187,25,15,118,71,251,189,209,201,122,83, + 13,8,73,124,55,3,55,19,194,26,115,173,39,22,93,46,99,196,232,120,38,3,22,103,223,198,250,81,167,227,177,113,30,45,195,178,155,98,149,172, + 117,81,121,209,99,233,173,10,173,227,122,170,214,123,80,17,235,220,77,162,60,115,171,13,36,171,7,22,210,112,153,106,47,140,42,176,81,158,41,174, + 215,174,227,164,114,11,29,231,168,77,146,110,118,249,190,218,237,171,127,235,99,165,179,122,154,96,104,16,51,203,54,195,58,218,236,30,20,220,198,122, + 85,26,69,181,83,204,23,179,12,96,65,110,233,176,248,107,17,198,9,148,83,45,52,176,24,229,105,170,35,112,107,152,30,194,83,61,229,86,207,120, + 40,165,28,55,74,65,109,9,94,104,101,97,145,213,41,133,149,25,162,11,26,243,98,241,90,169,37,198,203,27,75,202,33,199,146,234,180,32,55,179, + 126,76,190,90,149,26,12,227,1,205,134,20,70,128,45,58,115,188,207,179,134,167,172,145,105,107,188,179,118,235,141,151,253,229,221,8,41,121,253,194, + 100,16,8,140,63,217,141,140,191,200,141,83,214,94,224,70,38,190,154,27,185,82,228,5,110,92,217,231,19,221,8,182,216,139,220,56,101,237,106,55, + 130,53,255,171,185,49,16,226,37,217,88,99,251,39,186,17,108,189,44,27,167,172,93,237,70,176,246,108,54,154,175,48,125,177,27,237,126,189,216,20, + 26,206,23,175,39,252,57,116,247,216,4,176,131,142,29,29,239,102,148,163,128,73,66,69,79,61,221,205,152,64,156,18,66,101,71,93,77,202,174,38, + 101,11,112,136,143,4,231,146,245,196,117,51,131,95,138,48,43,225,0,177,189,155,109,195,170,72,142,223,144,102,199,158,227,137,23,159,9,73,217,220, + 245,81,64,125,70,149,118,9,159,19,129,2,201,176,120,115,166,253,215,44,169,224,76,180,47,117,241,222,156,43,254,153,253,90,234,62,10,23,210,246, + 28,35,73,208,207,252,98,56,46,36,82,7,71,36,80,207,100,230,245,64,113,49,109,123,107,138,60,147,153,215,3,197,239,83,253,31,73,219,177,195, + 207,226,65,36,84,238,117,177,190,38,223,2,194,184,36,144,74,98,238,194,233,94,18,69,197,124,240,50,224,19,36,3,26,96,50,247,57,34,152,16, + 210,231,220,145,128,123,37,194,2,7,184,47,137,147,161,18,196,148,143,251,66,60,82,32,82,36,40,103,131,146,56,213,84,31,138,74,168,222,231,95, + 30,20,236,94,117,25,20,128,45,71,160,0,245,229,11,22,12,166,106,64,1,86,69,152,221,99,135,160,112,46,187,154,148,53,160,160,192,89,212,191, + 34,68,16,21,170,48,96,138,118,41,132,64,4,62,81,210,196,2,142,218,129,161,48,66,184,244,13,23,68,49,39,176,4,120,195,136,16,95,146,47, + 5,11,159,147,207,148,209,143,159,193,130,81,30,49,54,74,32,230,35,233,143,178,135,17,228,143,18,135,83,228,255,63,172,147,227,143,31,217,197,215, + 94,231,173,103,218,15,251,214,181,62,166,239,137,31,19,125,120,213,0,97,145,63,0,18,54,199,205,70,61,52,135,41,208,234,147,252,172,239,102,76, + 55,214,124,238,194,181,182,200,9,114,53,116,54,140,101,94,196,186,104,89,194,62,35,86,3,174,166,237,163,62,135,220,86,45,191,115,191,81,62,16, + 195,83,252,114,19,198,249,1,182,226,167,204,15,121,14,229,195,159,146,77,53,251,204,108,167,92,202,51,166,217,189,13,51,192,231,179,137,246,69,1, + 158,118,211,240,164,97,77,246,167,5,145,114,147,31,214,133,241,205,42,76,59,231,116,67,13,203,93,46,115,176,93,21,251,51,54,244,161,123,115,179, + 226,238,235,40,54,221,244,64,194,232,31,174,118,210,202,33,201,128,233,54,93,122,160,232,5,129,182,109,15,24,185,32,113,52,135,152,224,2,19,124, + 228,203,54,181,182,186,10,227,176,10,251,228,104,41,188,109,119,139,120,181,248,249,221,15,221,110,29,69,139,127,229,197,67,191,11,27,129,112,9,157, + 244,221,172,59,65,152,14,58,90,24,8,12,171,251,100,11,75,55,247,55,223,30,183,41,100,115,199,24,9,87,167,157,238,149,214,106,219,187,168,201, + 251,172,56,218,38,102,144,247,190,130,68,255,209,24,25,156,42,106,165,145,185,77,203,139,251,129,98,179,128,183,235,110,239,31,77,33,169,82,125,255, + 183,240,97,191,116,222,87,26,42,191,176,211,173,233,67,29,222,185,18,43,121,102,207,168,173,215,112,223,44,161,190,162,65,219,125,153,68,155,48,77, + 81,244,193,14,109,164,94,13,231,153,38,145,206,202,231,221,98,205,38,143,80,202,219,109,158,149,214,67,205,216,210,91,158,220,50,244,40,194,222,153, + 123,234,133,253,37,78,42,231,103,29,231,83,139,181,11,216,47,127,3,28,29,121,192,204,227,207,225,250,137,19,13,53,77,238,205,133,204,173,215,124, + 76,74,20,214,220,199,36,194,117,152,100,207,41,9,119,187,244,52,37,84,211,70,19,172,189,60,94,138,13,164,73,231,97,122,255,244,212,235,131,12, + 127,161,195,199,225,220,233,2,82,182,124,54,156,83,215,176,63,235,93,145,199,123,123,15,54,142,227,103,42,126,151,192,238,145,44,247,147,138,11,253, + 159,125,2,35,62,73,243,63,242,10,92,242,101,117,190,173,46,79,246,179,188,160,139,228,209,134,212,100,67,249,101,39,253,126,19,22,250,109,154,60, + 12,157,97,83,175,73,181,182,57,25,96,237,173,215,34,177,253,90,247,8,61,218,185,58,116,79,195,165,134,221,254,39,195,116,200,249,14,150,239,119, + 219,60,214,205,240,22,220,119,97,181,105,151,84,77,52,22,60,80,146,137,137,70,214,156,82,225,60,235,155,243,42,244,1,208,93,136,185,244,225,24, + 75,5,238,143,171,48,219,191,59,28,131,26,18,8,230,116,157,181,243,214,233,26,106,39,128,222,66,4,138,249,14,118,8,252,115,20,130,182,133,5, + 129,63,191,114,192,148,133,15,221,36,186,67,83,1,91,95,55,118,130,125,156,106,243,59,246,244,53,66,207,158,188,79,48,241,50,62,14,132,232,143, + 149,77,219,218,181,167,136,112,98,26,66,121,51,190,166,49,231,183,5,108,120,223,188,62,191,243,120,99,185,131,134,218,126,22,251,84,47,244,163,206, + 242,56,190,169,15,133,139,44,207,116,243,94,159,45,64,184,249,52,103,91,72,143,5,212,83,53,164,253,150,39,217,2,74,73,23,55,219,176,120,208, + 69,173,164,126,119,203,42,44,170,17,101,155,196,163,111,157,197,35,179,86,85,154,192,207,130,224,150,24,135,112,26,42,138,240,52,18,53,212,186,213, + 95,116,146,253,34,31,147,50,89,38,169,249,176,175,169,190,137,147,114,7,41,189,72,50,51,243,155,252,81,23,171,52,63,180,252,243,64,153,35,3, + 116,4,69,212,183,17,195,42,120,18,28,114,49,38,231,141,193,211,152,32,60,136,10,44,242,3,156,154,219,168,76,170,96,16,214,113,164,154,114,35, + 244,127,24,50,254,59,69,108,153,230,209,195,229,128,89,236,96,80,175,146,75,49,231,62,194,140,51,161,156,239,29,192,30,225,19,204,3,32,11,196, + 124,223,199,202,225,72,128,160,242,249,28,240,136,66,129,251,14,245,17,87,64,51,20,174,164,240,157,159,122,26,67,132,130,199,149,0,34,180,100,132, + 51,42,201,156,72,36,113,16,16,53,18,53,45,133,96,220,216,158,32,118,36,202,16,99,82,137,73,210,247,14,1,56,101,68,4,115,74,161,73,52, + 127,167,116,36,0,166,164,130,240,57,231,72,74,12,141,212,212,146,63,56,103,128,98,230,123,158,219,80,247,218,228,55,52,33,81,253,92,72,242,143, + 12,120,106,137,18,41,199,65,33,2,41,202,21,157,51,5,243,247,97,41,176,58,31,81,76,2,138,185,241,12,101,62,244,47,0,212,210,192,161,132, + 152,128,183,2,9,187,137,67,5,242,49,64,59,80,124,115,49,111,61,221,208,192,107,240,43,100,96,28,125,70,3,148,247,125,1,69,98,163,68,56, + 152,152,164,245,250,24,134,68,9,4,145,3,125,61,173,165,64,56,24,52,140,82,77,80,108,212,0,110,133,37,98,200,17,72,53,72,39,198,3,31, + 114,192,71,132,5,62,200,77,184,100,16,180,51,192,23,10,250,116,38,38,193,197,214,214,69,112,127,30,70,204,78,242,4,70,48,82,246,145,127,68, + 224,191,0,35,215,128,59,54,85,202,72,64,174,221,121,205,197,226,155,171,131,115,190,243,254,161,3,241,220,14,108,177,3,74,12,3,164,5,106,206, + 145,15,117,133,149,65,101,56,87,73,202,36,149,115,2,56,168,2,202,137,41,89,133,100,32,232,128,234,48,218,14,7,100,149,204,231,64,3,176,85, + 132,88,154,64,2,246,5,160,89,244,86,146,115,67,165,8,162,12,150,76,53,99,163,82,213,84,192,121,98,202,217,84,184,29,15,208,203,107,73,3, + 209,212,142,134,189,65,168,102,52,67,80,180,140,3,92,51,137,96,176,8,136,35,16,5,133,10,91,140,99,181,198,126,70,164,182,66,106,80,58,91, + 249,4,176,115,53,248,35,203,243,192,126,235,65,135,123,107,46,87,238,95,253,23,80,75,3,4,20,0,2,0,8,0,171,128,249,52,75,77,50,197, + 89,10,0,0,186,54,0,0,23,0,0,0,109,101,100,105,97,45,115,101,101,107,45,98,97,99,107,119,97,114,100,46,115,118,103,237,90,109,143,219, + 54,18,254,158,95,225,115,190,36,232,74,226,155,40,201,251,82,244,26,244,16,32,185,3,154,4,247,241,64,75,180,173,174,44,185,146,188,182,243,235, + 111,72,189,91,114,214,222,85,18,92,174,110,131,181,56,195,25,242,225,195,209,12,233,155,159,247,235,104,242,32,211,44,76,226,219,41,54,209,116,34, + 99,63,9,194,120,121,59,253,244,241,55,195,157,78,178,92,196,129,136,146,88,222,78,227,100,250,243,221,139,155,191,25,198,228,215,84,138,92,6,147, + 93,152,175,38,111,227,251,204,23,27,57,121,181,202,243,205,204,178,118,187,157,25,150,141,102,146,46,173,215,19,195,128,158,217,195,242,197,100,50,1, + 183,113,54,11,252,219,105,169,191,217,166,145,214,11,124,75,70,114,45,227,60,179,176,137,173,105,163,238,55,234,59,57,55,83,153,37,219,212,47,204, + 251,126,91,51,13,22,141,42,140,100,71,181,18,246,60,207,66,196,34,196,0,13,35,59,196,185,216,27,113,246,178,213,21,6,56,212,149,32,132,44, + 144,53,154,231,105,205,246,17,192,112,114,48,90,218,246,14,208,111,224,95,221,161,198,176,152,235,2,122,74,51,150,185,245,230,227,27,171,210,54,144, + 25,228,65,203,76,213,171,227,183,179,28,177,88,203,108,35,124,153,213,46,116,255,93,24,228,171,219,41,115,55,123,253,188,146,225,114,149,183,26,194, + 224,118,10,51,196,20,57,250,185,26,195,172,102,17,50,41,41,84,75,195,109,17,163,63,5,242,65,70,221,190,65,226,207,69,6,195,181,86,201,90, + 90,127,132,235,181,240,173,44,245,45,255,33,179,128,127,203,196,8,253,36,54,242,21,80,195,2,171,145,152,71,210,18,126,14,118,179,158,49,53,187, + 219,233,90,6,161,48,50,41,239,141,185,240,239,119,34,13,204,106,113,234,177,201,253,38,73,115,99,17,70,178,232,85,12,33,18,155,196,122,35,179, + 251,60,217,88,255,72,197,34,244,133,245,22,134,32,173,194,108,233,218,72,182,57,172,161,204,204,77,60,108,121,31,108,96,57,61,52,40,60,84,194, + 59,144,222,4,114,145,41,173,2,101,245,4,48,123,90,6,82,229,70,164,48,150,32,132,221,81,232,21,154,93,9,161,152,151,125,160,87,6,19,168, + 116,1,164,252,16,193,28,85,163,225,39,81,146,206,94,34,253,185,214,77,9,48,34,204,15,51,124,61,109,250,36,139,69,38,129,2,168,213,166,89, + 0,61,192,23,68,8,235,124,111,11,253,233,122,67,38,183,61,199,163,142,55,228,22,15,186,37,168,118,123,99,117,231,127,41,92,182,203,190,25,92, + 182,203,159,15,215,217,40,217,174,59,22,74,54,114,236,11,80,18,193,28,9,247,137,40,129,47,231,34,148,24,103,14,99,71,222,206,4,9,156,121, + 163,81,137,131,173,90,92,109,117,24,100,36,125,112,47,162,157,56,100,167,80,172,87,141,187,248,17,160,206,36,10,62,13,98,203,25,125,4,168,1, + 103,1,13,28,127,49,222,6,244,240,163,160,216,30,29,9,148,235,51,80,177,61,251,114,84,164,250,248,71,123,245,137,32,157,226,206,105,20,93,206, + 201,183,10,99,224,139,93,180,65,135,188,157,29,198,192,27,127,12,70,245,36,162,139,97,212,233,215,108,149,74,72,23,95,14,224,217,134,187,235,2, + 123,180,17,47,203,198,79,113,152,67,94,184,205,100,250,65,229,86,255,138,63,101,178,167,245,49,21,113,6,137,220,26,50,20,145,167,225,254,21,190, + 66,234,63,211,166,220,33,244,138,153,200,179,49,162,210,192,244,10,115,211,117,40,226,175,107,59,254,254,118,74,152,233,82,7,19,222,180,30,110,167, + 148,155,140,96,76,156,186,117,49,168,187,24,212,77,1,126,219,228,140,57,180,9,191,79,37,232,23,144,213,175,146,211,68,198,12,225,231,35,155,171, + 175,17,20,40,175,12,230,152,144,106,243,43,3,19,220,160,184,199,183,83,155,153,158,235,218,152,213,173,7,172,64,104,144,218,19,173,229,122,220,115, + 154,214,3,180,98,70,76,236,58,158,247,53,161,210,185,201,151,160,106,45,234,40,80,1,32,30,178,241,149,225,57,38,225,4,211,46,96,204,131,4, + 30,181,23,72,3,134,137,233,49,143,211,14,108,160,203,185,67,9,235,194,6,20,195,192,70,218,192,54,254,222,237,190,135,251,123,151,81,62,218,222, + 69,38,33,4,242,215,43,40,194,128,101,196,161,87,64,12,2,140,35,176,163,153,195,17,3,56,137,7,82,198,175,8,50,129,111,78,119,51,115,6, + 54,28,228,176,206,102,198,154,183,212,38,157,205,220,215,93,12,234,194,102,118,77,216,103,223,21,101,239,27,163,76,145,251,157,81,254,10,33,64,85, + 115,95,42,246,8,233,108,81,136,246,0,7,230,188,187,69,41,212,88,174,205,89,103,139,18,10,131,239,110,103,162,222,12,103,46,91,49,235,27,75, + 21,170,250,91,93,130,171,74,58,120,8,229,174,169,102,85,125,95,218,221,136,165,212,137,1,76,182,72,209,74,193,60,73,3,153,86,34,174,63,29, + 81,153,59,168,131,4,108,19,143,97,168,62,95,116,33,86,198,91,106,104,72,158,173,68,144,236,96,254,199,194,207,73,2,156,235,217,212,244,129,184, + 229,129,199,190,80,49,195,1,120,109,226,244,12,250,219,52,5,252,140,72,28,36,204,73,255,169,208,206,86,201,110,153,42,108,22,34,170,193,169,187, + 42,145,49,159,39,123,21,161,183,61,113,144,248,91,117,74,102,108,139,181,41,143,103,212,154,133,129,58,217,9,227,229,94,33,96,15,73,14,125,137, + 92,111,74,225,0,48,122,48,155,36,140,149,171,214,112,22,97,20,169,85,244,197,130,202,246,188,182,96,48,59,53,51,37,236,79,77,55,231,73,36, + 97,247,251,144,64,226,122,120,89,158,38,247,208,242,210,33,222,194,95,28,219,219,133,49,44,167,81,30,93,97,204,216,9,141,234,48,203,69,238,9, + 13,24,17,115,240,9,161,202,154,88,107,146,5,39,135,151,71,201,219,84,107,3,81,244,43,41,1,9,110,117,192,83,111,31,141,68,181,7,147,84, + 237,64,145,235,3,180,21,60,125,78,224,49,170,247,232,38,201,194,66,72,93,21,27,161,22,238,196,11,109,140,96,175,201,216,159,237,200,51,17,100, + 105,46,179,7,29,241,139,28,61,200,52,15,253,39,184,113,199,114,163,96,115,108,124,148,105,21,110,8,66,227,193,70,136,74,55,73,171,188,111,59, + 34,99,205,7,162,186,135,92,199,229,131,110,216,88,110,176,173,222,134,12,15,176,141,81,74,198,131,205,128,82,5,113,194,24,31,244,52,34,175,13, + 219,53,17,225,158,61,232,104,52,94,99,23,222,75,136,184,195,200,141,198,107,140,96,129,8,25,92,32,181,108,99,185,33,158,233,65,230,53,236,198, + 27,111,117,176,167,194,155,235,12,172,14,84,203,124,60,71,156,154,136,122,220,97,67,142,198,156,17,148,72,136,115,138,6,103,68,240,136,196,118,29, + 19,1,183,28,50,224,73,221,228,140,231,9,35,2,232,145,161,232,99,171,203,140,49,61,193,54,98,200,118,251,158,40,198,99,162,231,17,211,102,80, + 138,15,4,110,117,4,80,39,194,253,252,87,183,175,101,46,2,145,139,38,25,174,90,48,197,213,161,221,77,26,44,102,191,191,249,173,62,84,243,253, + 217,191,147,244,190,57,15,83,10,98,158,108,33,129,169,15,250,212,165,145,63,83,165,146,200,239,194,53,36,28,234,250,241,167,253,58,130,180,188,22, + 116,148,243,195,70,54,70,11,179,213,85,234,224,117,108,224,175,67,213,201,250,144,67,182,247,86,57,105,29,254,149,70,195,60,146,119,239,213,205,216, + 228,131,148,247,147,191,151,23,110,122,24,133,180,211,193,87,183,199,73,122,215,26,137,154,241,47,203,250,76,175,111,254,157,216,36,147,95,69,36,214, + 34,14,82,25,14,217,86,203,208,183,163,53,123,46,149,195,40,244,101,156,61,14,136,238,28,62,64,221,178,94,39,113,166,177,41,251,102,214,252,96, + 100,194,2,222,91,237,83,81,171,92,193,246,138,190,59,118,215,90,212,11,61,117,231,177,145,41,172,82,246,232,60,134,46,206,127,151,155,52,9,182, + 250,66,179,187,178,207,52,252,38,132,204,61,156,111,7,13,167,242,207,109,8,61,158,100,249,159,9,188,142,228,184,54,127,201,79,15,246,89,40,200, + 52,124,208,75,170,216,144,141,59,232,15,43,145,202,95,162,240,94,30,83,175,164,90,117,108,222,10,47,55,86,21,127,244,211,178,137,75,157,250,180, + 174,101,34,49,151,80,229,189,83,194,9,238,151,134,201,118,179,78,2,89,118,175,107,54,125,11,16,132,217,6,154,103,97,172,206,45,170,88,183,17, + 249,170,119,56,146,254,71,149,210,173,98,170,43,219,31,201,154,96,11,190,85,124,130,114,211,47,63,157,56,173,156,65,77,216,4,111,104,123,63,129, + 44,217,70,136,93,97,248,59,121,55,129,20,83,61,17,6,223,43,17,101,90,212,209,252,60,121,63,97,184,211,149,176,86,223,74,86,246,237,168,126, + 158,52,131,47,208,233,94,143,168,98,26,102,19,75,253,173,117,45,163,31,211,109,36,103,242,65,194,116,131,235,162,34,158,65,148,126,245,178,127,32, + 244,186,148,23,37,241,140,86,143,74,19,224,156,101,127,110,129,53,237,214,63,160,180,159,193,66,198,193,245,90,164,247,50,45,198,81,124,55,178,92, + 164,121,167,101,29,6,157,103,25,151,207,165,77,216,44,80,225,134,240,103,198,170,182,64,64,49,156,166,64,134,182,166,106,45,110,127,102,168,106,107, + 102,254,16,102,225,60,140,212,131,254,26,201,235,46,163,174,19,72,77,23,81,178,171,229,205,175,10,112,235,96,110,12,198,157,252,241,198,41,133,253, + 99,10,79,253,213,73,253,99,147,47,109,132,222,38,176,109,108,143,180,9,206,32,178,230,102,255,72,248,245,217,228,110,179,164,32,50,54,11,7,252, + 76,66,107,22,254,175,19,122,92,14,95,186,94,252,175,245,186,116,189,58,59,108,132,119,133,218,190,219,76,194,238,117,46,216,243,95,35,210,92,28, + 223,234,8,57,46,135,191,240,230,247,143,153,222,188,14,144,131,8,252,111,95,159,34,127,255,114,245,89,228,63,38,125,241,122,253,33,95,186,95,228, + 60,67,38,148,185,222,21,102,38,129,114,185,67,117,245,83,7,234,12,176,191,243,110,114,202,55,16,162,152,219,186,193,197,68,181,97,117,128,162,76, + 115,120,217,115,210,121,81,217,117,183,150,153,163,109,165,216,72,188,83,121,194,215,75,210,212,111,28,94,63,47,86,254,128,188,249,190,41,121,147,37, + 17,124,97,145,113,78,206,216,138,113,23,146,173,250,25,219,211,67,17,253,255,125,255,170,168,81,70,154,34,206,112,211,227,176,227,107,90,105,41,165, + 102,29,61,218,234,37,181,186,22,128,92,45,19,149,184,54,113,164,175,67,25,41,155,90,97,170,108,162,216,116,89,97,215,53,61,196,121,53,178,227, + 46,122,40,168,103,167,106,106,217,33,188,109,168,215,103,152,242,246,121,111,215,175,73,253,230,77,109,115,172,63,215,223,117,55,252,128,17,86,221,212, + 56,64,12,90,81,25,23,13,138,28,110,167,69,221,85,22,58,221,62,3,236,161,216,115,198,37,196,147,11,244,114,68,12,181,46,58,138,48,224,169, + 28,68,79,171,216,53,173,41,195,67,57,107,53,255,182,98,191,206,61,230,40,242,254,226,232,120,28,61,89,213,84,23,44,203,187,23,55,234,130,227, + 238,197,127,1,80,75,3,4,20,0,2,0,8,0,174,128,249,52,207,153,178,73,172,10,0,0,72,56,0,0,22,0,0,0,109,101,100,105,97,45, + 115,101,101,107,45,102,111,114,119,97,114,100,46,115,118,103,237,90,109,147,155,56,18,254,158,95,225,115,190,36,181,6,244,134,16,158,151,173,173,77, + 229,42,87,201,93,213,38,169,251,120,37,131,108,179,131,193,11,120,236,201,175,191,22,239,24,60,51,158,33,201,85,46,36,169,24,117,171,91,122,244, + 168,213,146,184,252,245,176,9,39,183,42,73,131,56,186,154,98,19,77,39,42,242,98,63,136,86,87,211,207,159,222,26,98,58,73,51,25,249,50,140, + 35,117,53,141,226,233,175,215,47,46,255,102,24,147,223,19,37,51,229,79,246,65,182,158,188,139,110,82,79,110,213,228,213,58,203,182,115,203,218,239, + 247,102,80,22,154,113,178,178,94,79,12,3,106,166,183,171,23,147,201,4,220,70,233,220,247,174,166,165,254,118,151,132,185,158,239,89,42,84,27,21, + 101,169,133,77,108,77,27,117,175,81,223,171,133,153,168,52,222,37,94,97,222,243,218,154,137,191,108,84,161,37,123,154,43,97,215,117,45,68,44,66, + 12,208,48,210,187,40,147,7,35,74,95,182,170,66,3,135,170,18,132,144,5,178,70,243,113,90,243,67,8,48,156,108,76,46,109,123,7,232,183,240, + 175,174,80,99,88,244,117,9,53,149,25,169,204,122,243,233,141,85,105,27,200,244,51,191,101,166,170,213,241,219,25,142,72,110,84,186,149,158,74,107, + 23,121,253,125,224,103,235,171,41,19,219,67,254,190,86,193,106,157,181,10,2,255,106,10,61,196,20,57,249,123,213,134,121,205,34,100,82,82,168,150, + 134,219,34,70,127,241,213,173,10,187,117,253,216,91,200,20,154,107,173,227,141,178,254,12,54,27,233,89,105,226,89,222,109,106,1,255,86,177,17,120, + 113,100,100,107,160,134,5,86,67,185,8,149,37,189,12,236,166,61,99,186,119,87,211,141,242,3,105,164,74,221,24,128,219,94,38,190,89,141,77,221, + 52,117,216,198,73,102,44,131,80,21,149,138,22,132,114,27,91,111,84,122,147,197,91,235,239,137,92,6,158,180,222,65,11,148,85,88,45,61,27,241, + 46,131,33,84,169,185,141,134,45,31,252,45,140,166,139,6,133,119,149,240,26,164,151,190,90,166,90,171,0,89,191,1,202,110,46,3,169,118,35,19, + 104,139,31,192,228,40,244,10,205,174,132,80,204,203,58,80,43,133,14,84,186,128,81,118,23,66,31,117,161,225,197,97,156,204,95,162,252,185,200,139, + 98,32,68,144,221,205,241,197,180,169,19,47,151,169,2,6,160,86,89,78,2,168,1,190,32,64,88,143,247,182,204,159,174,55,100,114,219,117,92,234, + 184,67,110,241,160,91,130,106,183,151,86,183,255,231,194,101,11,246,205,224,178,5,127,62,92,143,70,201,22,98,44,148,108,228,216,103,160,36,253,5, + 146,226,137,40,129,47,231,44,148,24,103,14,99,71,222,30,9,18,56,115,71,163,18,7,91,181,184,154,234,208,200,80,121,224,94,134,123,121,151,158, + 66,177,30,53,46,240,3,64,61,146,40,248,52,136,45,103,244,1,160,6,156,249,212,119,188,229,120,19,208,197,15,130,98,187,116,36,80,46,30,129, + 138,237,218,231,163,162,244,227,29,205,213,39,130,116,138,59,167,81,20,156,147,111,21,198,192,23,59,107,130,14,121,123,116,24,3,111,252,33,24,245, + 155,12,207,134,49,207,190,230,235,68,65,182,248,114,0,207,54,220,93,23,216,165,141,120,85,22,126,142,130,12,210,194,93,170,146,143,58,181,250,87, + 244,57,85,61,173,79,137,140,82,200,71,54,144,160,200,44,9,14,175,240,12,233,63,166,77,185,67,232,140,153,200,101,88,8,101,96,58,195,220,20, + 14,69,252,117,109,199,59,92,77,9,51,5,117,48,225,77,233,221,213,148,114,147,17,140,137,83,151,46,7,117,151,131,186,9,192,111,155,156,49,135, + 54,225,247,169,4,189,7,217,124,41,57,77,100,204,16,30,13,89,163,128,22,207,92,219,132,116,219,101,51,3,19,220,96,121,192,87,83,155,154,76, + 203,26,124,238,176,134,66,152,12,51,42,26,93,50,168,11,165,152,17,19,217,176,220,126,77,216,242,60,229,62,216,90,3,60,30,108,4,96,67,194, + 158,25,174,99,18,78,48,237,98,199,92,72,232,81,123,196,114,236,48,84,99,46,167,29,236,64,151,115,135,18,214,197,14,56,135,129,158,180,193,110, + 252,201,220,93,152,251,147,153,209,17,177,67,38,33,4,50,218,25,252,2,166,16,135,206,12,98,98,2,180,33,48,201,153,195,17,195,51,74,5,96, + 196,233,140,32,83,216,216,233,206,111,206,192,136,131,28,214,153,223,152,57,96,145,218,164,51,191,251,186,203,65,93,152,223,194,132,169,247,93,113,118, + 191,57,206,54,255,222,56,127,133,88,160,183,120,247,237,0,9,233,76,83,88,2,0,14,204,143,66,28,133,141,151,176,57,235,76,83,66,161,241,221, + 41,77,244,114,49,126,112,97,194,132,172,128,178,25,122,93,130,117,105,233,77,111,254,171,222,205,235,93,185,127,27,168,125,179,51,214,71,5,165,163, + 173,92,169,60,201,0,140,138,116,175,20,44,226,196,87,73,37,226,249,211,17,149,121,136,62,147,192,54,129,5,23,87,161,190,30,25,109,188,165,134, + 134,228,233,90,250,241,30,96,59,22,126,137,99,232,51,44,168,54,23,54,235,137,53,251,28,219,36,176,110,56,61,153,94,159,77,88,178,93,82,179, + 173,17,238,146,4,112,53,66,121,167,160,107,249,127,213,88,165,235,120,191,74,52,68,75,25,214,24,213,85,181,200,88,44,98,112,157,37,187,158,216, + 143,189,157,62,119,51,118,197,200,150,7,62,122,44,3,95,159,21,5,209,234,160,129,176,135,36,119,125,137,218,108,75,225,0,62,121,99,182,113,16, + 105,87,173,230,44,131,48,212,131,233,201,37,85,237,126,237,192,96,122,170,103,90,216,239,90,94,156,197,161,2,18,122,144,147,226,186,121,105,150,196, + 55,80,242,210,33,238,210,91,30,219,219,7,17,140,170,81,30,134,97,204,216,9,141,234,120,76,32,113,66,227,160,87,62,247,132,16,64,171,211,76, + 221,201,130,154,195,195,163,229,109,198,181,129,40,234,149,148,128,156,185,58,51,170,103,81,142,68,53,55,227,68,207,76,153,229,71,114,107,120,251,18, + 195,107,88,207,221,109,156,6,133,80,47,82,46,100,251,78,39,218,228,198,8,118,155,77,192,179,29,185,38,130,196,79,48,123,208,17,63,203,209,173, + 74,178,192,123,130,27,49,150,27,13,155,99,227,163,132,173,112,67,16,26,15,54,2,137,150,16,164,117,98,208,118,68,198,234,15,172,9,144,5,58, + 130,15,186,97,99,185,193,182,94,75,25,30,96,27,163,148,140,7,155,1,187,31,196,9,99,124,208,211,136,188,54,96,27,129,8,119,237,65,71,163, + 241,26,11,88,158,16,17,195,200,141,198,107,140,96,128,8,25,28,32,61,108,99,185,33,174,233,82,36,134,221,184,227,141,14,118,117,120,19,206,192, + 232,216,24,241,241,28,113,106,34,234,114,135,13,57,26,179,71,176,201,66,156,83,52,216,35,130,71,36,182,112,76,4,220,114,200,128,39,125,55,52, + 158,39,140,96,123,77,201,80,244,177,245,253,200,152,158,96,26,49,100,139,190,39,138,241,152,232,193,198,218,102,176,163,31,8,220,88,212,39,210,151, + 86,63,13,206,203,55,42,147,190,204,100,147,19,87,37,152,226,234,28,240,50,241,151,243,63,222,188,173,207,233,60,111,254,239,56,185,105,142,216,180, + 130,92,196,59,72,96,234,179,67,125,15,229,205,117,198,46,179,235,96,3,9,135,190,208,252,229,176,9,33,59,175,5,29,229,236,110,171,26,163,133, + 217,234,114,118,240,130,215,247,54,129,174,100,125,204,32,219,123,167,157,180,206,19,75,163,65,22,170,235,15,250,178,109,242,81,169,155,201,219,226,10, + 47,111,69,33,236,232,123,250,58,58,78,174,91,13,209,29,254,109,85,159,18,246,173,191,151,219,120,242,187,12,229,70,70,126,162,130,33,219,122,20, + 250,118,114,205,158,75,237,48,12,60,21,165,15,227,145,87,14,110,97,247,178,217,196,81,154,67,83,214,77,173,197,157,145,74,11,104,111,245,112,241, + 128,83,73,176,216,157,219,215,127,200,155,221,98,242,49,83,176,85,76,206,237,104,223,103,174,171,217,212,102,215,251,227,190,183,8,118,102,183,187,160, + 110,85,2,140,73,31,4,117,232,179,128,63,212,54,137,253,93,126,95,219,69,243,153,134,223,4,105,129,202,144,225,68,253,181,11,160,198,147,44,255, + 51,134,165,81,141,107,243,183,236,116,99,159,133,130,74,130,219,124,72,53,27,210,113,27,253,113,45,19,245,91,24,220,180,193,200,169,87,82,173,186, + 21,104,133,186,75,171,138,133,249,219,170,137,145,157,189,114,189,175,10,229,66,193,142,243,189,22,78,112,127,155,26,239,182,155,216,87,101,245,122,255, + 152,95,114,248,65,186,133,226,121,16,233,19,152,42,238,110,101,182,238,29,243,36,255,209,219,250,214,198,174,43,59,28,201,154,192,15,190,117,172,132, + 173,175,87,62,157,53,67,59,131,253,105,179,144,64,217,135,137,62,241,209,231,221,116,134,169,105,79,222,79,24,46,14,192,233,140,48,120,109,228,148, + 229,242,163,10,95,38,31,38,188,40,33,78,101,67,111,3,90,54,26,121,105,227,168,194,151,73,211,155,2,174,230,198,31,219,23,221,187,33,189,237, + 135,190,70,42,255,213,186,147,202,95,147,93,168,230,234,86,1,24,254,69,177,119,159,195,122,242,234,101,255,224,235,117,41,47,54,239,115,90,189,106, + 77,0,123,158,254,181,3,78,181,75,255,140,131,104,14,195,28,249,23,27,153,220,168,164,104,71,241,219,72,51,153,100,157,146,77,224,119,222,85,84, + 190,151,54,97,42,193,94,60,128,255,230,172,42,243,37,108,219,147,4,168,210,214,212,165,197,213,215,28,85,101,77,207,111,131,52,88,4,161,126,201, + 127,134,234,162,203,183,139,24,146,232,101,24,239,43,121,147,160,140,65,193,147,31,171,156,82,56,60,164,240,212,175,108,234,143,107,238,155,25,189,89, + 97,219,216,30,123,86,28,51,122,128,196,57,47,251,7,223,175,31,77,236,54,67,10,18,99,179,112,192,31,73,230,156,129,63,201,220,137,167,103,142, + 23,255,57,94,231,142,87,103,170,141,184,120,232,249,188,75,21,76,103,231,140,32,240,53,66,207,217,1,175,14,153,227,114,249,158,220,192,59,189,230, + 34,7,17,248,59,184,242,14,44,166,250,70,249,89,147,224,152,252,197,18,251,99,46,188,247,115,223,49,185,112,88,94,192,76,2,27,252,35,194,235, + 47,62,168,51,56,11,142,22,45,167,92,149,92,46,184,91,148,8,76,242,66,97,130,13,198,242,79,70,176,205,201,209,250,101,215,117,59,214,142,230, + 153,166,39,113,177,61,76,216,211,65,244,185,153,155,254,234,227,245,243,130,232,15,72,164,255,177,44,190,73,172,8,62,115,163,242,152,52,179,21,5, + 207,100,95,245,165,223,211,131,21,253,255,93,169,117,52,41,57,195,204,34,10,1,205,16,197,216,109,104,86,106,80,106,214,129,165,91,169,160,154,219, + 68,180,194,18,161,29,75,141,70,109,169,87,41,143,121,118,109,190,21,204,234,66,138,77,193,10,7,212,213,177,147,215,77,237,87,212,246,156,198,73, + 99,175,41,108,217,35,184,99,111,160,226,240,132,176,31,183,58,127,205,137,209,172,244,54,199,240,32,247,226,187,206,149,31,48,32,83,219,180,133,227, + 114,119,6,60,113,4,44,90,154,50,249,101,162,40,57,87,44,238,77,25,33,38,161,136,186,84,147,181,95,125,128,77,20,187,206,147,9,242,96,130, + 60,238,17,65,217,100,134,90,247,64,69,84,65,38,113,132,160,0,0,53,9,114,48,114,0,128,242,139,159,114,58,21,80,53,101,16,84,144,45,4, + 209,248,13,84,191,239,60,233,39,227,199,103,252,3,20,186,180,86,215,47,46,245,229,208,245,139,255,2,80,75,3,4,20,0,2,0,8,0,168,128, + 249,52,105,10,147,139,124,11,0,0,198,82,0,0,23,0,0,0,109,101,100,105,97,45,112,108,97,121,98,97,99,107,45,115,116,111,112,46,115,118, + 103,237,92,109,115,219,54,18,254,158,95,161,83,190,36,83,145,196,27,241,34,191,116,122,205,180,211,155,244,174,211,52,115,31,111,40,18,178,88,83, + 164,74,82,150,149,95,127,11,146,162,72,137,178,229,152,86,166,182,149,201,88,0,22,88,224,193,179,139,133,164,229,249,247,183,243,104,112,163,211,44, + 76,226,139,33,182,209,112,160,99,63,9,194,248,234,98,248,249,143,159,44,57,28,100,185,23,7,94,148,196,250,98,24,39,195,239,47,223,156,255,195, + 178,6,63,166,218,203,117,48,88,133,249,108,240,75,124,157,249,222,66,15,222,205,242,124,49,118,156,213,106,101,135,85,165,157,164,87,206,251,129,101, + 65,207,236,230,234,205,96,48,0,181,113,54,14,252,139,97,37,191,88,166,81,33,23,248,142,142,244,92,199,121,230,96,27,59,195,173,184,191,21,95, + 233,137,157,234,44,89,166,126,57,188,239,55,37,211,96,186,21,133,153,172,104,33,132,149,82,14,34,14,33,22,72,88,217,58,206,189,91,43,206,222, + 54,186,194,4,187,186,18,132,144,3,109,91,201,227,164,198,183,17,192,112,112,50,69,107,83,59,64,191,128,255,117,135,26,195,114,173,83,232,169,237, + 88,231,206,135,63,62,56,27,105,11,217,65,30,52,134,217,244,106,233,109,109,71,236,205,117,182,240,124,157,213,42,138,254,171,48,200,103,23,67,38, + 139,210,76,135,87,179,188,46,134,193,197,16,86,135,41,18,69,121,163,127,92,51,8,217,148,148,162,213,160,205,38,70,191,11,244,141,142,218,125,131, + 196,159,120,25,76,213,153,37,115,237,252,25,206,231,158,239,100,169,239,248,55,153,3,220,187,74,172,208,79,98,43,159,1,45,28,24,53,242,38,145, + 118,60,63,135,113,179,189,193,204,202,46,134,115,29,132,158,181,136,188,245,196,243,175,173,44,79,22,246,102,99,234,185,233,219,69,146,230,214,52,140, + 116,217,171,156,66,228,45,18,231,131,206,174,161,147,243,115,234,77,67,223,115,126,129,41,104,167,28,182,82,109,37,203,28,246,79,103,246,34,238,30, + 249,54,88,192,86,42,212,217,184,110,54,182,108,176,37,157,254,207,191,189,24,230,233,82,239,213,175,171,250,75,104,56,15,244,52,51,2,229,54,153, + 18,236,147,42,218,160,213,204,211,75,97,49,65,8,166,85,202,149,146,237,22,34,177,168,250,64,47,3,219,70,22,80,206,215,17,128,100,42,45,63, + 137,146,116,252,22,21,175,179,162,42,1,58,133,249,122,140,207,134,219,62,201,116,154,105,96,16,106,212,21,52,130,30,160,75,13,7,206,241,218,166, + 197,171,173,13,104,37,153,75,57,146,93,106,113,167,90,130,107,181,231,78,123,253,15,133,203,149,236,100,112,185,146,63,30,174,163,81,114,165,236,13, + 37,174,14,146,170,214,199,149,186,7,136,142,37,78,188,73,48,185,3,149,122,116,129,240,61,11,239,24,221,117,93,225,210,254,80,16,219,21,214,102, + 12,170,34,237,195,92,188,104,229,173,179,251,97,146,248,225,48,77,133,249,183,195,187,35,80,227,146,62,28,53,223,15,144,127,80,217,195,64,60,132, + 210,97,148,41,2,128,30,103,35,71,91,36,232,162,167,179,72,208,230,158,12,70,201,57,57,149,99,3,93,236,65,48,118,105,59,26,70,208,198,239, + 131,209,148,188,232,193,48,22,209,220,120,150,106,136,62,223,222,101,252,48,149,182,10,130,49,169,155,175,170,202,207,113,152,67,152,185,204,116,250,201, + 132,106,255,137,63,103,122,79,234,143,212,139,51,136,11,231,16,244,120,121,26,222,190,163,182,203,9,156,253,218,226,35,11,226,9,65,144,59,194,182, + 82,4,35,102,106,136,139,184,43,139,102,70,108,142,49,119,71,68,82,91,72,133,223,215,10,76,216,129,185,178,133,192,98,11,164,9,58,48,66,54, + 65,184,138,2,205,107,218,41,59,237,148,77,161,178,225,15,190,146,178,119,98,173,196,29,212,38,152,244,128,117,110,222,70,112,3,122,103,97,50,66, + 91,216,110,113,1,69,93,94,155,50,134,192,152,74,228,110,165,200,142,20,148,21,5,164,32,154,81,79,9,78,225,31,239,4,135,245,9,14,166,116, + 36,16,112,15,94,59,24,185,54,146,202,37,184,141,148,107,19,5,87,35,214,70,138,181,128,114,137,237,98,228,138,173,215,120,2,139,45,60,224,93, + 22,75,69,111,22,139,71,200,252,179,33,142,21,132,142,152,205,4,21,148,106,11,211,17,230,182,20,20,241,182,97,18,102,75,42,48,225,45,195,164, + 220,102,198,149,180,13,115,95,118,218,41,155,22,240,115,102,148,127,91,100,213,83,33,11,206,143,97,206,92,174,141,213,190,60,104,5,113,159,142,180, + 46,225,140,171,23,74,90,65,196,83,146,150,18,42,229,51,37,237,125,177,145,32,234,53,54,58,81,108,36,40,126,141,141,14,131,67,95,99,163,163, + 156,33,123,202,99,70,40,48,218,151,122,204,176,39,61,102,152,164,228,165,158,50,236,245,148,57,217,41,227,190,158,50,119,128,243,122,202,28,103,177, + 10,191,90,236,169,44,86,209,151,107,177,247,131,227,190,186,179,195,224,136,191,163,59,59,61,80,18,161,94,89,196,180,5,158,75,65,188,197,181,69, + 254,94,88,221,103,113,18,209,158,195,96,240,249,136,81,105,124,61,3,112,144,241,250,2,34,98,78,220,103,227,167,36,226,253,250,169,26,41,37,108, + 164,24,125,34,164,78,31,90,72,244,109,46,3,88,192,85,8,19,60,34,24,130,12,197,212,115,8,45,204,79,138,238,98,37,233,209,150,109,140,40, + 225,100,99,210,46,83,88,0,172,156,218,152,16,9,38,205,109,138,49,149,59,76,21,230,178,74,57,109,241,85,50,155,112,202,164,106,243,21,100,5, + 115,73,219,43,130,71,180,153,106,254,30,224,91,156,32,196,125,130,19,132,112,99,219,132,63,175,203,131,164,248,219,90,56,150,252,197,88,184,43,159, + 165,133,127,3,214,114,244,122,46,157,42,90,226,228,53,198,124,248,25,196,217,235,45,230,56,172,40,35,125,158,65,192,39,172,100,73,180,145,197,33, + 34,71,252,153,222,255,0,57,214,27,114,4,220,186,148,96,149,109,19,101,152,217,136,99,249,212,38,122,242,67,4,192,235,239,59,36,105,43,224,130, + 32,173,67,132,217,74,34,194,119,63,54,85,8,28,191,34,47,232,110,67,25,69,61,242,148,19,136,74,220,157,200,135,81,14,33,17,86,167,139,124, + 206,29,147,93,82,188,171,19,111,76,254,76,112,19,234,213,54,5,197,100,245,84,227,44,188,43,93,252,118,23,0,44,127,3,93,53,76,146,52,208, + 233,166,137,23,175,86,83,245,243,94,147,62,132,21,71,66,178,205,58,234,109,51,131,55,196,80,87,123,54,243,130,100,117,49,36,187,141,95,146,4, + 16,102,187,213,134,144,12,12,154,113,37,247,250,24,94,18,215,22,48,161,250,55,128,219,198,101,154,194,246,89,145,183,214,176,166,226,207,134,166,217, + 44,89,93,165,6,155,169,23,213,224,212,93,77,147,53,153,36,205,116,159,70,115,144,248,75,147,23,103,45,75,2,45,110,43,9,211,207,228,114,133, + 241,213,173,65,192,237,106,89,239,183,232,249,162,106,236,0,166,152,204,34,9,99,163,170,49,157,105,24,69,102,23,125,111,74,117,115,93,75,24,48, + 59,180,50,211,184,191,180,162,58,79,34,13,92,247,53,16,173,158,94,150,167,201,53,212,188,21,68,77,253,233,238,120,171,48,134,237,180,170,100,53, + 41,200,1,129,77,254,154,201,101,233,150,128,9,169,250,20,220,109,92,111,127,175,110,150,88,50,178,123,115,76,123,147,104,37,12,149,223,169,173,164, + 88,240,198,180,146,212,216,185,151,23,105,95,51,40,125,73,160,24,213,166,183,72,178,176,108,164,224,101,21,231,172,237,106,138,193,8,86,141,131,248, + 177,138,148,141,48,67,178,241,235,141,166,34,254,32,69,55,58,205,67,255,43,212,200,190,212,24,216,132,139,37,235,80,67,16,234,15,54,66,224,192, + 147,100,39,216,219,40,34,125,173,135,80,56,108,165,144,188,83,13,235,75,13,118,5,208,141,225,14,182,49,74,73,127,176,89,112,114,33,56,211,24, + 239,212,212,35,175,45,87,218,16,144,40,183,83,81,111,188,198,18,142,31,68,100,55,114,189,241,26,34,28,91,17,210,185,65,102,219,250,82,67,148, + 173,224,10,211,173,70,245,183,59,88,25,247,38,69,199,238,192,77,131,247,167,136,195,37,137,42,46,88,151,162,62,87,196,192,195,113,78,81,231,138, + 154,217,167,143,38,182,4,19,66,2,115,217,161,201,164,105,247,167,9,35,176,33,133,144,234,212,164,122,213,4,193,158,203,72,135,38,136,111,113,29, + 133,238,7,159,69,253,92,231,94,224,229,222,54,18,221,212,96,138,55,73,109,231,105,48,29,255,254,225,167,58,233,204,247,199,255,77,210,235,109,190, + 152,17,240,38,201,18,194,135,58,17,206,164,89,251,99,19,149,123,249,101,56,135,243,222,100,251,127,119,59,143,32,38,174,27,90,194,249,122,161,183, + 131,150,195,110,158,92,208,249,244,131,192,159,135,166,147,243,41,135,80,235,23,163,164,145,28,87,13,26,230,145,190,252,213,36,163,15,126,171,114,220, + 7,191,121,112,165,40,230,81,54,183,122,248,230,105,13,73,122,217,152,138,89,242,15,87,117,210,219,254,248,31,189,69,50,248,209,139,188,185,23,7, + 169,14,187,198,54,251,176,63,78,33,185,167,210,40,140,66,95,199,217,253,136,20,157,195,27,184,53,204,231,73,156,21,224,84,125,51,103,178,182,50, + 207,33,54,114,246,144,201,150,147,63,225,14,215,154,160,81,240,79,239,106,103,153,166,54,10,47,139,140,254,115,167,42,117,138,152,172,193,187,37,54, + 207,25,184,91,234,6,8,156,220,45,50,95,102,161,223,37,82,214,181,86,81,128,188,183,222,98,179,193,180,210,112,178,124,232,134,255,203,187,94,78, + 6,159,114,13,151,216,244,161,187,189,175,179,144,53,70,213,52,178,143,187,4,104,216,217,3,247,190,205,172,133,78,193,112,178,123,153,213,245,232,144, + 223,245,34,77,130,101,241,88,135,54,165,30,57,240,135,48,43,81,233,26,56,213,127,45,67,232,241,85,35,255,59,129,115,91,247,59,230,15,249,225, + 201,62,10,5,157,134,55,197,150,26,54,100,253,78,250,211,204,75,245,15,81,120,221,4,163,160,94,69,181,77,166,111,195,227,159,59,155,35,161,40, + 93,109,143,138,214,125,189,190,221,69,222,68,195,173,247,163,105,28,224,253,171,114,178,92,204,147,64,87,221,235,59,108,145,184,28,132,153,113,15,227, + 48,54,159,13,237,246,221,121,186,199,225,231,123,192,52,23,94,62,123,211,206,138,222,62,5,3,187,103,237,236,104,115,81,31,199,73,172,139,119,141, + 172,236,162,152,46,35,61,214,55,58,78,130,224,172,188,109,143,225,16,122,247,118,255,3,172,247,85,123,121,221,30,227,242,183,87,202,37,155,122,211, + 5,166,60,206,254,90,194,86,52,107,255,76,194,120,12,232,196,193,217,220,75,175,117,90,78,168,124,111,101,185,151,230,173,154,121,24,180,202,58,174, + 202,213,152,192,64,157,70,33,252,25,179,77,93,224,193,157,59,77,1,225,166,164,169,45,179,192,199,104,83,183,133,224,38,204,194,73,24,153,66,241, + 54,210,103,237,109,58,75,32,48,158,70,201,106,211,94,135,34,192,145,95,7,230,163,97,68,37,25,97,98,75,162,48,162,131,143,219,74,106,62,255, + 36,212,85,80,73,139,239,121,204,55,61,221,181,157,3,108,43,191,12,90,49,144,97,0,92,51,221,253,199,72,236,241,168,155,73,117,144,214,228,82, + 151,224,49,10,42,14,118,208,174,96,210,254,167,206,239,143,166,98,115,43,43,218,29,201,182,130,34,207,142,109,238,8,83,155,33,87,184,37,79,92, + 67,167,77,153,118,149,119,229,235,114,39,165,136,232,151,26,245,200,162,241,37,234,102,49,12,174,96,84,148,51,18,138,241,114,138,85,173,153,188,249, + 38,171,92,7,147,66,34,217,93,217,221,127,91,219,88,232,97,166,62,222,65,18,182,227,32,209,203,116,144,39,114,45,61,108,24,62,176,97,130,191, + 96,31,99,190,226,81,204,100,126,109,29,201,182,146,110,189,9,188,5,91,116,149,219,93,217,217,189,174,236,62,207,112,55,121,246,98,156,206,16,103, + 243,112,163,131,156,0,16,191,232,52,57,124,180,236,217,105,105,144,167,49,83,140,158,104,219,39,81,226,95,223,183,235,220,108,141,130,163,217,149,102, + 195,248,136,184,118,185,159,35,66,108,129,192,167,150,37,16,147,46,163,162,148,218,118,234,218,80,214,245,156,171,35,3,148,122,239,235,207,118,32,174, + 54,31,135,100,224,13,204,171,254,244,7,110,194,231,230,211,151,203,55,255,7,80,75,3,4,20,0,2,0,8,0,164,128,249,52,67,149,237,100,185, + 11,0,0,111,89,0,0,24,0,0,0,109,101,100,105,97,45,112,108,97,121,98,97,99,107,45,112,97,117,115,101,46,115,118,103,237,92,89,115,227, + 54,18,126,207,175,208,106,94,102,42,34,137,139,56,228,35,149,205,84,82,217,154,236,166,50,73,237,227,22,69,66,54,99,138,84,72,202,199,252,250, + 109,144,20,15,137,146,237,49,101,87,108,105,106,74,98,119,3,13,124,248,26,104,72,128,79,191,187,93,68,163,107,157,102,97,18,159,141,177,141,198, + 35,29,251,73,16,198,23,103,227,63,126,255,209,146,227,81,150,123,113,224,69,73,172,207,198,113,50,254,238,252,155,211,127,88,214,232,135,84,123,185, + 14,70,55,97,126,57,250,57,190,202,124,111,169,71,239,47,243,124,57,117,156,155,155,27,59,172,132,118,146,94,56,31,70,150,5,37,179,235,139,111, + 70,163,17,184,141,179,105,224,159,141,43,251,229,42,141,10,187,192,119,116,164,23,58,206,51,7,219,216,25,55,230,126,99,126,163,103,118,170,179,100, + 149,250,101,245,190,223,182,76,131,121,99,10,45,185,161,133,17,86,74,57,136,56,132,88,96,97,101,119,113,238,221,90,113,246,174,85,20,26,216,87, + 148,32,132,28,208,53,150,15,179,154,222,70,0,195,206,198,20,218,182,119,128,126,9,255,235,2,53,134,101,95,231,80,82,219,177,206,157,143,191,127, + 116,214,214,22,178,131,60,104,85,179,46,213,241,219,25,142,216,91,232,108,233,249,58,171,93,20,229,111,194,32,191,60,27,51,185,188,45,158,47,117, + 120,113,153,183,4,97,112,54,134,30,98,138,68,241,188,110,195,180,102,17,178,41,41,77,171,138,219,42,70,191,13,244,181,142,186,101,131,196,159,121, + 25,52,215,185,76,22,218,249,51,92,44,60,223,201,82,223,241,175,51,7,248,119,145,88,161,159,196,86,126,9,212,112,160,214,200,155,69,218,241,252, + 28,234,205,182,42,51,189,59,27,47,116,16,122,214,50,242,238,102,158,127,101,45,189,85,6,56,86,163,83,55,78,223,46,147,52,183,230,97,164,203, + 98,101,27,34,111,153,56,31,117,118,149,39,75,231,167,212,155,135,190,231,252,12,109,208,78,89,111,229,219,74,86,57,12,162,206,236,101,220,95,243, + 109,176,132,241,84,168,87,121,183,86,158,131,246,52,208,243,204,88,149,48,155,39,192,89,21,58,208,26,55,94,10,109,9,66,8,143,210,174,180,236, + 106,136,196,162,42,3,165,50,232,192,218,22,80,202,239,34,232,163,17,90,126,18,37,233,244,29,42,94,39,133,40,1,74,132,249,221,20,159,140,155, + 50,201,124,158,105,224,0,106,201,10,26,64,9,240,165,198,35,231,225,222,230,197,171,235,13,104,33,153,75,57,146,125,110,113,175,91,130,107,183,167, + 78,183,255,143,133,203,149,236,217,224,114,37,127,58,92,15,70,201,149,114,48,148,184,218,73,170,218,31,87,234,30,32,122,186,56,243,102,193,108,15, + 42,117,237,2,225,123,58,222,83,187,235,186,194,165,195,161,32,154,30,214,177,12,174,34,237,67,91,188,232,198,187,203,238,135,73,226,199,195,52,23, + 230,223,6,239,30,128,26,151,244,241,168,249,126,128,252,157,206,30,7,226,46,148,118,163,76,17,0,244,180,24,121,112,68,130,47,250,124,17,9,222, + 220,103,131,81,114,78,158,107,98,3,95,236,81,48,246,121,123,48,140,224,141,223,7,163,121,242,162,71,195,88,100,100,211,203,84,67,6,249,110,95, + 240,67,83,186,46,8,198,164,86,95,84,194,63,226,48,135,84,17,50,143,244,179,73,183,254,19,255,145,233,45,171,223,83,47,206,32,183,91,64,210, + 226,229,105,120,251,158,218,46,39,176,246,107,139,79,44,200,203,5,65,238,4,219,74,17,140,152,145,16,23,113,87,22,106,70,108,142,49,119,39,68, + 82,91,72,133,63,212,14,252,91,0,144,43,91,8,44,26,32,253,59,144,34,100,19,132,171,44,206,188,230,189,182,243,94,219,20,132,173,249,224,43, + 41,187,23,107,37,246,80,155,96,50,0,214,185,249,24,193,46,230,189,133,137,93,16,114,130,202,119,212,96,120,139,11,92,234,231,59,243,140,33,203, + 165,18,185,141,21,217,176,130,103,69,1,54,72,109,212,33,145,42,38,203,189,72,177,33,145,194,148,22,8,77,4,2,54,194,107,3,40,215,70,82, + 185,4,119,225,114,109,162,96,195,195,186,112,177,14,90,46,177,93,140,92,209,204,35,7,136,225,98,78,220,23,195,84,12,22,195,184,162,82,205,169, + 246,7,72,119,5,161,19,102,51,65,5,165,218,194,116,130,185,45,5,69,188,27,191,132,217,146,10,76,120,39,126,41,183,153,153,113,186,241,187,109, + 59,239,181,77,139,49,225,204,56,127,89,184,213,179,194,13,19,39,195,156,185,28,240,38,111,16,111,65,220,225,240,158,160,73,135,201,46,225,140,171, + 55,202,100,65,196,161,144,53,164,165,132,74,249,74,73,123,95,94,37,136,58,230,85,207,148,87,9,138,7,206,171,38,175,39,149,130,117,122,224,84, + 234,149,102,81,130,29,114,153,17,10,130,246,173,46,51,236,160,203,12,147,148,188,213,85,134,29,87,153,103,91,101,220,227,42,179,7,156,227,42,243, + 176,136,85,248,24,177,207,21,177,138,190,221,136,189,31,28,247,56,157,237,6,71,252,29,167,179,231,7,74,34,52,40,139,152,182,96,230,82,144,111, + 113,109,145,191,23,86,247,69,156,68,116,224,52,216,124,123,200,168,52,115,61,115,205,247,134,240,73,64,70,204,137,251,106,230,41,137,248,176,243,84, + 141,148,18,54,82,140,30,8,169,231,79,45,36,122,153,205,0,22,176,21,194,4,79,8,134,36,67,49,245,26,82,11,115,28,105,31,43,201,128,177, + 108,99,68,9,39,235,144,118,153,194,2,96,229,212,198,132,72,8,105,110,83,140,169,220,96,170,48,155,85,202,105,135,175,146,217,132,83,38,85,151, + 175,96,43,152,75,186,179,34,204,136,54,83,237,179,4,47,177,130,16,247,0,43,8,225,38,182,9,127,93,155,7,73,241,203,70,56,150,252,205,68, + 184,43,95,101,132,191,0,107,57,58,174,75,207,149,45,113,114,204,49,31,191,6,113,246,119,220,197,156,58,230,180,117,241,169,62,72,110,142,131,7, + 215,161,190,105,142,100,155,83,234,85,61,75,239,66,23,103,217,0,162,242,76,96,165,152,37,105,160,211,181,138,23,175,142,170,58,238,102,142,195,99, + 197,145,144,108,61,43,213,3,99,42,111,153,161,62,125,118,233,5,201,205,217,152,108,42,191,36,201,162,57,55,215,12,182,9,62,4,253,134,52,65, + 108,41,77,12,42,91,113,201,169,187,165,92,165,41,12,144,21,121,119,26,250,84,188,173,171,207,46,147,155,139,212,96,51,247,162,26,156,186,168,81, + 89,179,89,114,107,6,117,181,165,14,18,127,101,238,122,88,171,146,34,213,37,3,67,138,48,48,247,19,194,248,226,214,32,224,246,105,238,182,53,122, + 177,172,148,61,192,20,141,89,38,97,108,92,181,154,51,15,163,200,140,162,239,205,169,110,247,107,5,21,102,187,122,102,148,219,93,43,196,121,18,105, + 160,176,175,1,212,186,121,89,158,38,87,32,121,39,136,154,251,243,205,250,110,194,24,134,211,170,46,96,72,65,118,24,172,111,100,152,179,221,253,22, + 208,32,69,240,14,229,93,115,126,211,116,177,100,100,255,224,24,125,155,104,37,12,213,204,82,71,73,209,225,117,104,37,169,137,100,47,47,110,123,92, + 194,211,151,4,30,163,58,244,150,73,22,150,74,42,97,165,225,156,117,167,224,162,50,130,85,43,53,124,170,35,101,35,204,144,108,253,34,217,118,196, + 31,229,232,90,167,121,232,127,133,27,57,148,27,3,155,112,177,100,61,110,8,66,195,193,70,136,173,164,36,27,147,253,218,17,25,170,63,132,218,144, + 83,9,201,123,221,176,161,220,96,87,0,221,24,238,97,27,163,148,12,7,155,69,97,183,196,9,99,188,215,211,128,188,182,92,105,35,200,97,220,94, + 71,131,241,26,75,115,138,142,200,126,228,6,227,53,100,126,182,34,164,119,128,204,176,13,229,134,192,26,7,41,76,191,27,53,220,232,152,181,20,22, + 83,209,51,58,144,119,240,225,28,193,190,7,81,197,5,235,115,52,100,143,24,204,112,156,83,212,219,163,246,109,172,39,19,27,54,198,8,9,204,101, + 143,39,115,237,112,56,79,24,65,12,41,132,84,175,39,53,168,39,72,246,92,70,122,60,193,110,21,215,89,232,118,242,89,200,23,58,247,2,47,247, + 154,76,116,45,193,20,175,47,121,156,166,193,124,250,219,199,31,235,75,24,190,63,253,111,146,94,53,247,39,140,129,55,75,86,144,62,212,23,67,204, + 181,67,127,106,242,110,47,63,15,23,176,222,155,27,172,223,222,46,34,200,137,107,69,199,56,191,91,234,166,210,178,218,245,109,220,222,27,189,129,191, + 8,77,33,231,115,14,169,214,207,198,73,235,178,72,85,105,152,71,250,252,23,115,183,114,244,107,117,103,115,244,171,185,179,89,180,163,84,119,74,248, + 230,6,114,146,158,183,154,98,186,252,253,69,125,9,100,187,254,79,222,50,25,253,224,69,222,194,139,131,84,135,125,117,155,113,216,174,167,176,220,114, + 105,28,70,161,175,227,236,126,68,138,194,225,53,236,26,22,139,36,206,10,112,170,178,153,51,187,179,50,207,33,54,114,182,144,201,86,179,63,97,151, + 214,105,160,113,240,79,239,98,163,155,70,26,133,231,197,5,213,83,167,122,234,53,89,150,192,238,53,169,6,97,191,213,53,48,56,217,111,178,88,101, + 161,223,103,82,202,58,221,40,80,222,234,112,49,218,16,91,105,56,91,61,118,196,255,229,93,173,102,163,207,185,134,125,106,250,216,225,222,246,89,216, + 154,168,106,71,217,167,77,6,180,2,237,145,131,223,165,214,82,167,16,57,217,189,212,234,187,15,255,155,94,166,73,176,42,174,41,119,57,245,196,138, + 63,134,89,137,74,95,197,169,254,107,21,66,137,175,170,249,223,9,44,220,122,216,58,191,207,119,55,246,73,40,232,52,188,46,134,212,176,33,27,182, + 209,159,47,189,84,127,31,133,87,109,48,10,234,85,84,91,95,125,107,77,249,167,206,122,77,40,158,46,154,181,162,179,97,175,183,119,145,55,211,176, + 237,253,100,148,35,188,189,87,78,86,203,69,18,232,170,120,189,137,45,110,242,5,97,102,166,135,105,24,155,175,127,214,235,207,69,103,109,35,146,182, + 110,12,47,189,252,178,117,145,111,237,38,253,159,249,230,161,181,251,220,212,222,110,107,161,114,83,27,236,77,220,150,24,164,191,140,204,111,21,146,187, + 220,157,96,98,75,162,48,162,163,79,45,41,101,176,171,33,212,85,32,53,159,49,225,174,220,33,237,175,161,145,126,25,109,223,161,109,110,180,99,247, + 164,123,211,209,124,201,48,141,147,88,23,159,90,55,44,139,199,116,21,233,169,190,214,113,18,4,39,229,55,5,83,88,64,223,191,219,254,177,236,67, + 165,47,191,42,152,226,242,44,132,114,201,90,110,138,0,124,211,236,175,21,176,168,45,253,51,9,227,41,12,108,28,156,44,188,244,74,167,101,131,202, + 207,86,150,123,105,222,145,44,194,160,243,172,227,234,185,170,19,130,71,167,81,8,111,83,182,150,5,94,6,228,77,129,28,109,75,35,45,111,116,78, + 209,90,214,64,112,29,102,225,44,140,204,67,241,49,210,39,93,134,157,36,144,212,207,163,228,102,173,111,135,197,6,181,106,122,180,14,153,54,244,96, + 144,150,79,48,181,25,114,133,91,142,108,33,130,113,95,139,204,199,29,162,158,130,181,168,143,15,61,20,40,70,117,251,231,230,15,15,166,69,27,214, + 138,2,15,28,249,98,184,94,239,200,239,198,252,233,97,135,182,195,174,116,128,223,86,216,237,11,40,161,24,239,70,148,107,0,234,70,212,166,168,175, + 100,35,235,196,84,29,217,162,245,203,204,189,171,69,207,74,243,128,185,3,227,173,174,138,170,113,205,172,176,22,209,102,86,48,31,119,136,122,10,214, + 162,7,206,29,3,240,24,109,240,184,58,74,167,196,113,14,25,181,255,138,16,32,169,205,150,53,131,129,48,175,241,192,201,11,107,253,208,187,102,152, + 180,17,134,212,162,224,133,98,68,184,210,112,165,150,18,106,83,72,170,164,42,73,133,48,69,76,78,8,177,5,82,92,116,132,80,129,116,25,21,157, + 242,77,173,251,83,151,222,204,101,253,247,71,118,178,15,198,235,139,78,147,221,171,212,214,68,89,206,136,207,51,79,98,116,32,134,205,162,196,191,218, + 77,176,83,231,162,47,57,134,205,55,145,140,109,255,41,153,30,210,236,163,91,190,235,143,25,40,65,136,50,167,136,247,175,149,135,207,87,93,121,204, + 87,251,23,206,151,217,168,52,75,28,147,135,89,68,31,153,250,114,116,76,125,135,200,190,14,186,157,105,88,227,162,3,165,94,131,124,35,224,146,23, + 205,80,15,153,185,113,114,220,129,188,216,246,143,179,99,218,220,51,255,60,219,150,168,21,225,236,160,171,214,49,11,30,50,11,126,236,6,199,28,138, + 20,130,203,238,6,135,217,176,231,65,76,125,245,14,167,197,30,254,36,246,60,100,159,184,145,249,23,111,167,230,39,213,243,111,254,15,80,75,3,4, + 20,0,2,0,8,0,165,128,249,52,158,228,190,4,151,9,0,0,193,42,0,0,24,0,0,0,109,101,100,105,97,45,112,108,97,121,98,97,99,107, + 45,115,116,97,114,116,46,115,118,103,237,89,235,115,219,184,17,255,158,191,130,85,190,196,115,34,137,7,159,178,229,155,52,158,235,164,147,235,221,92, + 146,233,199,14,68,66,18,99,138,224,145,148,37,229,175,239,2,124,75,148,45,219,236,181,211,86,153,140,73,236,11,216,253,45,176,11,222,252,184,223, + 196,218,3,207,242,72,36,243,9,54,208,68,227,73,32,194,40,89,205,39,95,191,252,164,123,19,45,47,88,18,178,88,36,124,62,73,196,228,199,219, + 55,55,127,210,117,237,67,198,89,193,67,109,23,21,107,237,99,114,159,7,44,229,218,187,117,81,164,51,211,220,237,118,70,84,13,26,34,91,153,87, + 154,174,131,100,254,176,122,163,105,26,152,77,242,89,24,204,39,21,127,186,205,98,197,23,6,38,143,249,134,39,69,110,98,3,155,147,150,61,104,217, + 119,124,97,100,60,23,219,44,40,213,7,65,151,51,11,151,45,43,204,100,71,21,19,246,125,223,68,196,36,68,7,14,61,63,36,5,219,235,73,254, + 182,35,10,19,28,18,37,8,33,19,104,45,231,101,92,179,125,12,110,56,59,25,69,237,90,7,215,167,240,191,17,104,124,88,174,117,9,146,220,72, + 120,97,222,125,185,51,107,110,29,25,97,17,118,212,212,82,61,187,189,112,36,108,195,243,148,5,60,111,76,40,249,93,20,22,235,249,196,242,210,189, + 122,95,243,104,181,46,58,3,81,56,159,192,10,49,69,174,122,175,231,48,107,80,132,12,74,74,214,74,113,151,100,209,31,66,254,192,227,190,108,40, + 130,5,203,97,186,230,90,108,184,249,45,218,108,88,96,230,89,96,6,15,185,9,248,91,9,61,10,68,162,23,107,128,134,9,90,99,182,136,185,201, + 130,2,244,230,39,202,228,234,230,147,13,15,35,166,167,49,59,44,88,112,175,3,142,179,194,168,163,211,76,142,239,83,145,21,250,50,138,121,41,86, + 206,33,102,169,48,239,120,126,95,136,212,252,75,198,150,81,192,204,143,48,7,110,150,122,43,219,186,216,22,16,68,158,27,105,50,172,121,31,166,16, + 79,31,13,18,15,53,241,22,168,55,33,95,230,146,171,116,179,124,3,63,251,138,6,84,105,134,101,48,151,48,130,244,40,249,74,206,62,133,56,158, + 85,201,128,84,14,11,168,121,171,240,193,8,240,56,147,118,88,44,151,57,135,48,163,206,88,94,28,98,94,114,235,129,136,69,54,123,187,84,191,107, + 53,36,0,61,81,113,152,225,235,137,102,62,109,205,27,176,134,31,183,134,212,239,172,181,27,179,191,236,231,122,201,62,239,165,203,39,243,184,11,155, + 245,219,224,237,179,94,186,208,209,232,250,9,23,118,172,121,99,121,201,70,174,253,12,47,177,112,129,152,247,66,47,129,45,247,89,94,178,28,203,181, + 172,35,107,23,58,9,140,249,163,65,201,241,91,19,77,134,195,36,99,30,128,121,22,239,216,33,127,58,35,125,58,82,70,94,146,144,190,253,252,132, + 12,105,232,6,203,177,188,70,169,133,38,175,75,137,139,161,5,182,200,235,19,208,112,136,231,57,182,239,92,154,137,96,214,122,161,187,206,161,168,102, + 80,149,195,108,157,113,168,116,222,14,228,236,35,104,165,168,221,250,87,213,224,215,36,42,160,164,217,230,60,251,44,203,130,95,146,175,57,111,141,225, + 249,196,197,6,172,222,183,91,217,3,140,98,98,25,24,59,54,105,121,9,240,34,195,3,136,89,237,232,1,70,59,144,171,205,126,201,88,146,67,81, + 179,153,79,10,249,24,67,73,249,78,183,108,3,246,90,139,76,117,48,138,64,141,125,213,122,81,74,178,120,76,127,245,211,23,252,213,55,65,40,182, + 158,233,175,129,229,109,88,145,69,251,119,54,20,71,22,128,145,235,176,58,240,18,117,8,245,166,196,64,216,183,92,58,69,6,38,158,237,120,83,29, + 219,216,240,177,111,79,49,242,12,228,58,222,85,163,61,216,131,223,145,107,192,54,223,78,44,56,204,39,30,53,124,31,121,157,233,46,135,88,151,131, + 172,153,12,166,97,219,216,233,98,118,124,116,170,234,228,209,189,20,141,230,109,44,221,137,61,60,69,240,175,121,209,109,185,120,136,234,84,7,55,80, + 7,33,255,170,15,117,4,174,167,39,80,71,216,112,45,124,10,117,223,198,199,80,247,60,195,39,212,37,245,17,115,99,202,98,78,61,53,117,170,172, + 54,195,135,136,239,218,138,79,22,193,149,158,148,173,184,218,139,192,129,229,102,84,17,22,34,11,121,86,147,28,245,235,145,170,237,74,86,219,216,119, + 144,235,89,245,185,210,132,77,42,239,176,149,181,13,26,226,202,215,44,20,187,249,132,28,19,191,11,177,105,55,189,22,16,0,56,203,50,108,23,128, + 116,34,35,49,10,24,243,61,68,154,122,176,37,110,179,12,130,168,67,185,206,97,101,234,79,173,62,95,139,221,42,147,30,90,178,184,113,81,35,42, + 73,250,98,33,246,114,23,217,158,144,161,33,216,202,134,82,223,150,48,170,58,25,9,156,40,148,77,16,116,187,123,233,7,123,136,114,56,165,240,77, + 90,17,7,28,163,38,147,138,40,145,166,58,211,129,6,35,134,128,217,54,248,134,118,215,181,5,133,249,185,149,73,226,233,210,212,112,33,98,14,136, + 15,224,228,194,205,244,242,34,19,247,252,216,78,163,111,23,37,16,78,189,234,242,60,151,156,97,168,219,62,187,233,18,142,57,96,66,148,156,35,130, + 207,108,167,27,188,18,153,195,225,145,244,46,212,74,71,84,251,79,147,45,106,201,117,138,137,76,230,59,43,84,83,185,134,183,239,2,94,227,38,5, + 83,145,71,37,145,66,34,250,14,212,137,189,45,71,41,35,144,181,237,70,247,90,67,62,108,225,22,242,44,123,208,144,243,44,67,208,47,23,208,110, + 62,223,140,55,150,25,233,54,215,198,71,59,117,105,134,192,78,49,154,219,136,220,14,60,216,151,7,13,145,177,214,67,96,199,71,158,219,233,121,187, + 102,172,177,204,96,219,5,184,89,120,0,109,22,165,100,60,183,233,212,49,144,67,44,203,25,180,52,34,174,117,27,202,143,94,187,208,53,52,26,174, + 177,39,143,33,226,13,123,110,52,92,203,90,200,39,100,48,64,50,108,99,153,33,190,225,83,228,13,155,241,199,139,14,246,229,246,230,185,3,209,177, + 49,114,198,51,228,80,3,81,223,113,173,33,67,99,174,200,130,29,206,113,40,26,92,17,193,35,2,219,131,20,66,46,118,188,1,75,242,118,115,60, + 75,170,132,247,161,204,28,180,228,143,106,9,138,62,219,34,3,150,40,198,184,169,70,79,139,80,53,190,225,5,11,89,193,218,138,180,30,193,20,202, + 185,186,3,11,151,179,223,238,126,106,154,233,32,152,253,93,100,247,109,251,43,25,216,66,108,161,128,104,26,124,121,187,25,204,100,117,206,138,219,104, + 3,231,189,188,40,255,97,191,137,161,54,110,8,61,230,226,144,242,86,105,169,182,190,244,31,252,112,16,6,155,72,10,153,159,11,40,182,62,74,35, + 157,166,191,82,26,21,49,191,253,89,94,225,106,191,86,87,195,218,103,121,53,172,230,81,146,123,18,129,252,208,33,178,219,206,84,228,146,223,175,154, + 30,254,84,255,39,150,10,237,3,139,217,134,37,97,198,163,33,221,50,14,167,122,20,231,137,73,105,48,142,2,158,228,79,123,68,9,71,15,208,61, + 108,54,34,201,149,115,42,217,220,92,28,244,156,153,208,111,154,39,158,201,183,139,111,208,203,245,38,40,13,252,153,173,142,150,41,71,227,232,86,222, + 172,223,152,213,203,32,135,186,41,127,130,101,155,71,193,227,44,15,128,94,241,56,75,170,218,133,33,158,114,172,183,6,229,226,147,213,170,80,67,98, + 101,209,98,251,220,112,255,149,221,111,23,128,34,14,173,108,246,220,88,159,218,84,188,50,165,186,41,246,233,56,252,157,44,123,102,228,251,184,74,121, + 6,105,147,63,137,171,161,111,110,191,241,52,19,225,86,125,10,233,3,234,149,138,239,162,188,244,202,144,226,140,255,190,141,64,226,69,154,255,38,224, + 212,230,227,234,124,95,156,159,236,171,188,192,179,232,65,133,84,162,33,31,119,210,159,215,44,227,239,227,232,190,235,12,5,189,10,106,245,181,101,103, + 191,191,49,235,3,65,189,173,78,122,95,177,77,55,34,228,85,255,62,105,15,18,245,110,29,247,126,49,91,112,232,138,101,14,136,44,17,77,19,171, + 238,99,195,40,151,121,61,139,18,121,69,84,159,93,171,35,157,248,140,206,79,146,168,225,201,101,83,28,54,89,121,32,101,197,186,118,113,123,114,130, + 14,121,216,64,235,30,192,175,119,224,74,1,226,120,237,157,16,140,253,172,97,50,165,190,97,107,159,228,147,15,127,160,203,66,142,239,123,83,104,79, + 60,236,34,215,47,105,138,235,187,214,72,87,147,235,127,137,146,247,9,48,137,132,171,167,206,149,184,122,205,182,49,159,241,7,14,179,12,175,203,75, + 129,25,156,148,239,78,175,62,209,85,69,47,111,5,102,24,42,74,248,121,148,214,227,82,4,124,55,203,127,223,2,98,186,163,223,68,148,204,192,161, + 73,120,189,97,217,61,207,202,9,149,207,229,7,215,222,200,38,10,123,239,60,169,222,43,157,144,40,60,139,35,248,51,179,234,177,144,229,0,212,12, + 130,210,229,148,163,229,205,251,12,213,99,173,11,30,162,60,90,68,177,124,81,143,49,191,238,71,246,90,64,245,190,140,197,174,161,183,151,252,216,62, + 253,150,147,253,35,232,223,192,244,105,135,138,214,20,114,93,196,12,49,94,98,224,124,212,85,32,79,47,169,175,46,70,66,215,147,117,212,75,3,212, + 249,95,138,250,113,126,26,22,116,239,206,148,186,144,142,216,42,179,177,26,195,213,53,169,76,95,104,190,29,68,92,203,157,170,123,5,219,181,188,46, + 107,35,222,73,225,122,87,160,180,211,171,157,221,75,254,32,28,189,122,247,160,200,185,250,63,142,254,29,56,34,150,235,255,199,224,168,254,90,250,242, + 237,231,210,179,70,133,248,191,14,45,126,141,12,207,181,106,180,148,99,128,16,159,66,137,32,193,98,27,182,79,9,110,176,210,229,107,100,191,107,160, + 145,214,163,196,144,119,132,74,154,26,182,131,125,167,39,93,243,129,106,236,149,86,78,101,7,193,215,185,175,61,7,190,243,0,172,128,212,158,184,246, + 245,75,64,5,33,250,206,51,113,30,84,228,24,84,229,94,243,199,236,64,24,253,139,64,181,136,69,112,255,20,166,32,138,112,208,200,32,218,14,177, + 171,184,202,17,98,25,240,254,65,195,158,65,144,227,200,218,19,70,144,77,176,173,1,52,48,194,142,93,129,196,178,168,163,81,192,27,49,64,178,163, + 163,214,58,132,12,74,253,23,87,79,23,110,103,55,38,244,242,55,242,246,232,246,205,63,1,80,75,3,4,20,0,2,0,8,0,4,134,250,52,115, + 77,182,120,141,10,0,0,123,45,0,0,16,0,0,0,109,101,100,105,97,45,114,101,99,111,114,100,46,115,118,103,229,90,89,143,227,54,18,126,159, + 95,161,245,188,100,16,139,226,45,210,125,4,179,25,36,8,144,236,2,57,176,143,11,181,68,187,149,145,37,71,146,187,237,249,245,91,164,37,89,178, + 228,62,102,156,236,67,186,209,104,139,85,172,34,191,250,84,197,195,215,223,236,214,153,247,96,202,42,45,242,155,25,65,120,230,153,60,46,146,52,95, + 221,204,126,251,245,59,95,205,188,170,142,242,36,202,138,220,220,204,242,98,246,205,237,155,235,127,248,190,247,109,105,162,218,36,222,99,90,223,123,63, + 228,31,171,56,218,24,239,171,251,186,222,44,130,224,241,241,17,165,77,35,42,202,85,240,206,243,125,232,89,61,172,222,120,158,7,110,243,106,145,196, + 55,179,70,127,179,45,51,167,151,196,129,201,204,218,228,117,21,16,68,130,217,81,61,62,170,63,154,59,84,154,170,216,150,241,193,124,28,247,53,203, + 100,121,84,133,145,60,50,167,68,180,214,1,166,1,165,62,104,248,213,62,175,163,157,159,87,111,123,93,97,128,83,93,41,198,56,0,217,81,243,101, + 90,139,93,6,48,156,29,140,147,246,189,3,244,27,248,235,58,116,24,30,230,186,132,158,6,229,166,14,62,252,250,33,104,181,125,140,146,58,233,153, + 105,123,13,252,14,194,145,71,107,83,109,162,216,84,157,11,215,255,49,77,234,251,155,25,87,155,157,123,190,55,233,234,190,238,53,164,201,205,12,102, + 72,24,14,221,115,59,134,69,199,34,140,24,61,168,54,134,251,34,206,190,78,204,131,201,134,125,147,34,190,139,42,24,110,112,95,172,77,240,123,186, + 94,71,113,80,149,113,16,63,84,1,240,111,85,248,105,92,228,126,125,15,212,8,192,106,22,221,101,38,136,226,26,236,86,35,99,118,118,55,179,181, + 73,210,200,47,77,92,148,9,106,163,210,13,202,236,54,69,89,251,203,52,51,7,245,131,239,44,218,20,193,7,83,125,172,139,77,240,125,25,45,211, + 56,10,126,0,223,38,56,216,107,124,250,197,182,134,224,153,10,109,242,105,203,187,100,3,113,212,120,82,184,111,133,183,32,189,78,204,178,178,90,7, + 120,237,19,224,171,157,12,164,214,77,84,194,88,146,20,94,139,131,222,65,115,40,97,138,133,77,31,232,85,193,4,90,93,64,167,222,103,48,71,219, + 232,199,69,86,148,139,183,216,253,92,185,166,2,168,144,214,251,5,185,154,29,251,20,203,101,101,32,246,184,215,230,194,15,61,192,151,158,121,193,203, + 189,45,221,207,208,27,70,161,98,2,11,194,167,220,146,73,183,156,116,110,175,131,225,252,95,9,23,165,226,53,112,153,37,213,84,191,16,30,176,253, + 58,120,226,216,6,227,133,40,80,42,63,23,133,150,134,224,54,51,49,216,143,178,199,104,95,205,158,96,21,227,120,246,101,113,126,57,171,24,167,95, + 206,170,23,147,137,113,254,151,193,168,164,164,127,213,203,9,190,248,171,96,156,242,246,98,24,193,155,124,14,70,251,20,101,175,134,209,149,199,197,125, + 105,160,156,191,157,192,179,15,247,208,5,165,84,117,226,85,211,248,91,158,214,80,183,183,149,41,127,177,181,239,223,249,111,149,25,105,253,90,70,121, + 5,133,118,13,21,36,170,203,116,247,21,153,99,251,139,4,147,33,101,115,159,33,202,137,20,212,248,132,205,137,68,42,100,88,190,235,12,197,187,155, + 25,229,8,178,49,161,242,216,186,191,153,49,137,56,37,132,134,93,235,114,82,119,57,169,91,2,254,2,73,206,67,200,243,29,224,151,135,214,189,241, + 231,161,37,76,94,14,90,134,164,80,138,104,11,42,97,76,41,192,84,206,9,10,137,6,180,221,3,69,88,225,80,209,185,47,41,2,220,249,156,80, + 20,74,138,249,9,228,4,65,130,38,106,8,185,13,22,81,84,51,62,196,124,164,188,156,86,182,160,179,63,19,109,87,134,158,34,178,100,195,105,82, + 36,6,51,164,10,17,34,49,215,195,9,246,213,150,147,106,118,106,28,72,29,170,222,171,116,62,84,20,49,41,132,132,56,112,164,57,165,156,186,240, + 8,196,132,14,101,27,43,138,169,226,2,194,9,197,157,10,18,194,39,142,40,211,186,247,130,60,77,154,14,235,207,204,189,79,49,219,174,144,158,90, + 64,241,35,214,59,226,88,18,98,202,212,17,179,61,180,42,164,9,17,140,28,73,178,163,78,87,1,190,228,136,250,30,90,153,64,130,75,130,213,107, + 39,255,151,19,13,38,47,46,246,90,95,142,43,127,34,229,15,88,95,7,118,189,237,62,117,91,8,187,33,72,30,82,243,120,92,148,219,253,73,99, + 102,19,173,140,43,156,0,241,97,1,210,8,238,96,163,97,202,86,36,221,207,64,212,212,86,187,17,34,132,193,156,187,161,117,129,181,198,123,106,120, + 74,94,221,71,73,241,8,243,59,21,126,42,138,245,177,72,31,201,178,59,148,19,173,41,99,35,161,173,53,128,137,22,29,73,143,178,109,89,66,124, + 253,44,218,27,152,146,251,215,90,175,238,139,199,85,105,161,89,70,89,135,77,215,213,138,252,187,187,2,92,215,229,118,36,134,77,218,214,110,242,253, + 237,129,97,205,238,210,114,42,77,236,198,52,205,87,59,11,128,152,146,236,199,18,179,222,52,194,9,92,220,96,54,69,154,91,87,189,225,192,230,47, + 131,72,13,150,246,110,94,91,48,88,157,155,153,21,142,167,230,154,235,34,51,240,50,196,176,190,34,221,240,170,186,44,62,154,83,63,157,189,199,52, + 135,104,250,205,206,91,133,244,140,66,187,21,151,103,53,96,64,92,243,51,66,23,102,222,155,228,129,146,211,225,177,242,62,211,14,64,52,169,169,123, + 77,220,148,219,87,171,40,109,42,136,106,183,209,191,135,167,79,5,60,102,221,171,183,41,170,244,32,100,144,64,53,44,81,135,217,200,25,163,68,247, + 150,228,95,234,72,35,76,56,238,231,181,190,35,249,42,71,15,166,172,211,248,51,220,168,75,185,177,176,133,130,40,62,225,134,194,222,241,98,176,65, + 30,213,74,81,69,38,29,209,75,205,135,50,164,177,10,123,75,176,190,27,126,41,55,68,132,64,55,78,38,216,198,25,163,151,131,205,135,20,139,37, + 229,92,78,122,186,32,175,125,161,16,166,82,139,73,71,23,227,53,81,80,127,160,68,79,35,119,49,94,19,12,1,162,116,50,64,54,108,151,114,67, + 53,210,12,171,105,55,250,114,209,33,218,166,55,21,78,68,71,16,44,47,231,72,50,132,153,150,33,159,114,116,201,25,113,200,112,82,50,60,57,35, + 74,46,72,108,5,175,16,14,73,111,131,121,244,100,79,156,47,231,9,150,228,8,107,140,245,164,39,125,81,79,176,218,19,156,78,120,98,132,144,110, + 25,58,94,125,186,246,181,169,163,36,170,163,227,82,180,109,33,140,180,71,74,215,101,178,92,252,252,225,187,238,200,39,142,23,255,41,202,143,199,211, + 26,171,16,221,21,91,88,64,116,199,80,246,228,57,94,216,133,123,84,223,166,107,168,247,246,242,226,235,221,58,131,69,113,39,24,40,215,251,141,57, + 26,61,152,109,47,98,38,47,115,146,120,157,218,78,193,47,53,44,182,126,176,78,122,71,83,141,209,180,206,204,237,79,246,120,221,251,217,29,215,59, + 255,135,230,129,102,108,47,157,138,242,182,55,4,59,213,247,171,238,168,105,108,247,199,104,83,120,223,70,89,180,142,242,164,52,233,148,109,139,255,216, + 142,211,28,185,180,14,179,52,54,121,245,60,18,174,115,250,0,115,90,175,139,188,114,160,52,125,171,224,110,239,87,81,64,17,14,70,136,84,219,187, + 223,97,123,55,24,160,117,240,207,104,117,50,77,219,154,165,183,238,110,226,58,104,158,38,85,54,110,249,254,180,78,217,160,255,148,206,122,91,165,241, + 211,42,128,66,254,140,149,7,160,127,49,165,114,104,27,76,212,197,225,4,18,23,47,75,241,62,229,127,60,13,75,143,245,175,140,200,48,222,27,83, + 2,141,171,103,227,61,117,47,249,179,217,148,69,178,117,215,70,195,64,127,161,225,15,41,236,44,210,187,237,164,225,210,252,177,77,161,199,103,89,254, + 87,1,85,212,92,214,230,251,250,252,96,191,8,5,83,166,15,46,164,150,13,213,101,7,253,203,125,84,154,247,89,250,177,15,134,163,94,67,181,246, + 212,187,151,127,175,131,54,65,187,167,213,49,113,15,246,207,221,94,43,139,238,12,236,66,127,180,66,143,140,183,174,197,118,179,46,18,211,116,239,246, + 148,238,16,63,73,43,251,90,47,210,220,158,245,180,197,96,19,213,247,237,116,235,209,217,12,134,213,22,150,58,108,14,181,181,102,66,205,25,146,161, + 230,138,207,9,146,156,80,214,59,129,129,129,255,228,193,218,86,120,148,122,239,61,194,61,194,60,236,17,248,245,20,18,243,113,107,171,252,169,179,209, + 213,182,114,239,206,83,199,237,59,123,50,51,110,119,167,61,116,162,253,244,188,199,226,107,231,205,20,59,54,54,40,29,239,27,137,184,26,94,121,216, + 19,128,5,148,171,175,222,142,79,195,222,57,105,239,250,197,61,150,219,204,44,204,131,201,139,36,185,58,108,237,15,6,198,103,137,239,26,249,97,111, + 191,176,39,220,82,18,216,248,182,237,182,11,68,121,81,253,177,5,158,245,91,127,47,210,124,81,218,52,122,181,142,202,143,166,92,228,69,110,154,207, + 126,85,71,101,61,104,89,167,201,224,217,228,205,115,99,19,94,47,83,102,41,252,91,240,182,45,137,96,123,95,150,64,159,190,166,109,61,92,247,44, + 112,219,118,132,224,33,173,210,187,52,179,15,238,99,102,174,134,28,188,42,96,13,190,204,138,199,86,62,142,157,93,14,220,204,162,50,158,141,142,53, + 203,255,198,195,83,149,161,108,223,200,186,197,89,159,233,103,175,216,207,41,236,158,83,248,220,239,6,116,95,9,120,102,218,35,122,194,114,222,253,188, + 144,164,246,146,235,229,36,237,7,249,64,72,114,202,67,72,207,245,136,133,142,58,23,103,33,193,255,39,26,182,137,2,192,147,103,242,202,232,62,110, + 144,142,198,23,115,195,44,214,93,209,77,38,63,133,96,203,166,116,47,73,185,252,202,49,226,138,40,201,188,206,188,205,170,173,45,175,235,214,230,88, + 141,136,166,76,41,49,127,97,135,41,15,199,4,61,46,19,4,146,37,22,140,181,119,159,82,72,112,230,115,36,66,41,236,173,167,16,84,137,119,211, + 239,226,243,164,127,41,195,37,59,101,56,194,231,57,222,124,143,226,132,230,8,135,34,164,92,254,45,211,110,199,119,65,197,11,234,232,179,149,247,92, + 165,62,169,236,151,88,53,76,173,93,20,172,82,36,109,215,46,82,132,176,116,81,66,132,161,189,80,146,18,51,174,46,201,73,23,162,151,102,216,183, + 203,48,76,194,228,148,125,148,132,76,195,223,223,157,126,225,185,116,123,134,124,252,149,228,227,39,228,83,30,229,13,201,120,75,50,130,231,227,198,131, + 230,51,188,163,132,83,221,240,174,121,224,8,50,32,33,33,124,32,154,112,113,54,27,158,214,121,121,54,225,217,47,87,124,73,73,199,136,138,77,253, + 138,186,62,138,245,201,150,98,0,41,133,119,141,51,2,233,159,32,141,69,200,189,111,61,18,66,109,96,146,40,215,168,160,98,8,143,80,196,153,10, + 105,232,190,29,163,195,80,107,219,134,25,134,210,1,70,176,102,212,245,85,136,192,166,35,100,115,10,133,139,96,76,61,248,160,49,193,225,156,218,157, + 8,197,36,244,152,64,36,164,82,128,91,141,66,66,152,176,125,25,135,122,198,41,119,181,72,75,26,42,225,49,128,150,132,80,244,142,3,180,183,12, + 90,243,254,136,109,19,15,165,102,3,45,72,44,33,110,155,176,10,39,38,251,201,155,162,181,30,211,17,98,100,108,150,169,32,167,196,113,21,119,103, + 124,171,219,55,215,246,140,237,246,205,255,0,80,75,3,4,20,0,2,0,8,0,225,128,249,52,157,141,185,194,180,16,0,0,195,74,0,0,22,0, + 0,0,112,114,101,102,101,114,101,110,99,101,115,45,115,121,115,116,101,109,46,115,118,103,237,91,217,114,219,72,150,125,247,87,112,232,151,170,104,18, + 204,125,161,37,117,212,148,163,39,122,194,179,68,187,42,230,25,4,65,9,101,146,208,0,208,230,175,159,115,19,32,9,144,144,68,173,49,209,46,50, + 202,34,114,207,147,119,57,247,38,234,228,175,183,171,229,224,58,45,202,44,95,159,14,121,196,134,131,116,157,228,243,108,125,126,58,252,253,183,191,141, + 221,112,80,86,241,122,30,47,243,117,122,58,92,231,195,191,158,125,56,249,151,241,120,240,107,145,198,85,58,31,220,100,213,197,224,239,235,111,101,18, + 95,166,131,159,46,170,234,114,58,153,220,220,220,68,89,83,24,229,197,249,228,231,193,120,140,158,229,245,249,135,193,96,128,105,215,229,116,158,156,14, + 155,246,151,87,197,50,180,155,39,147,116,153,174,210,117,85,78,120,196,39,195,93,243,100,215,252,38,157,69,69,90,230,87,69,82,15,159,36,237,150, + 197,124,177,107,138,149,220,200,208,136,123,239,39,76,76,132,24,163,197,184,188,91,87,241,237,120,93,126,108,117,197,2,251,186,10,198,216,4,117,187, + 150,199,181,154,222,46,1,195,189,139,9,181,237,217,1,253,37,254,219,118,216,98,88,239,117,129,158,105,180,78,171,201,231,223,62,79,54,173,199,44, + 154,87,243,214,48,155,94,157,121,59,199,177,142,87,105,121,25,39,105,185,157,34,244,223,60,76,211,219,203,188,168,198,119,243,75,44,198,179,136,133, + 79,111,155,219,35,218,44,178,101,74,115,158,14,39,23,249,42,157,252,145,173,86,113,50,249,156,150,223,170,252,114,114,147,161,69,116,185,174,145,187, + 201,230,213,197,233,80,185,203,219,240,124,145,102,231,23,85,171,32,155,159,14,1,51,231,178,153,110,131,196,116,43,203,44,146,162,187,146,86,149,146, + 127,153,167,215,233,178,219,119,158,39,179,184,220,95,98,89,36,147,228,186,156,64,11,206,243,113,150,228,235,113,117,1,1,157,96,212,101,60,91,166, + 147,4,122,112,158,23,89,90,30,140,87,111,249,178,72,23,105,1,197,74,75,8,93,89,165,171,136,132,228,12,173,79,230,233,162,164,94,245,166,232, + 73,134,10,84,65,54,210,184,248,183,34,158,103,80,135,186,81,107,63,73,190,92,166,9,96,137,151,55,241,93,61,247,102,156,110,87,33,52,107,6, + 197,176,37,0,223,180,197,106,171,187,37,150,72,133,99,140,152,23,211,143,139,240,249,20,138,114,200,72,86,221,77,249,167,225,174,79,190,88,148,41, + 38,102,173,178,112,36,232,129,185,196,112,48,121,217,108,172,111,54,222,63,155,218,206,118,50,233,110,251,245,97,52,250,9,48,214,218,240,108,24,141, + 125,18,140,125,179,61,1,70,227,223,17,70,109,223,81,26,253,123,74,163,225,207,132,241,0,37,201,220,83,80,146,202,232,88,61,19,37,204,245,0, + 74,187,86,94,63,50,96,207,194,252,98,150,164,252,96,97,79,57,19,51,243,58,137,159,45,1,74,60,190,55,180,82,125,3,70,86,63,188,61,57, + 55,113,172,95,180,61,233,76,58,59,230,232,120,239,209,249,87,20,57,251,20,145,243,46,102,177,127,182,200,217,167,41,102,34,231,108,62,127,54,74, + 238,21,81,130,146,191,147,249,194,92,242,197,94,224,9,40,193,191,189,26,74,202,63,1,165,153,161,239,179,81,210,252,24,21,55,162,87,197,31,209, + 240,133,160,239,139,52,124,17,211,247,152,221,69,198,26,46,188,118,253,222,69,29,181,77,215,59,178,83,128,201,10,241,240,110,231,142,190,199,239,182, + 53,173,233,159,214,190,61,190,243,25,125,159,45,245,90,190,27,247,129,90,240,247,162,144,152,75,190,31,133,196,108,143,26,15,122,138,151,79,134,49, + 4,201,211,11,4,81,167,195,143,61,120,182,225,238,78,129,106,187,173,78,110,79,135,66,69,142,139,157,68,38,119,167,67,233,163,118,209,162,167,217, + 226,176,89,1,24,108,100,218,226,125,222,204,250,91,17,175,75,68,234,171,211,225,42,174,138,236,246,39,222,132,198,35,214,243,67,90,165,181,27,217, + 136,123,37,165,76,199,92,143,176,0,101,177,183,159,15,6,255,125,157,85,229,233,240,170,76,139,175,20,191,255,215,250,247,50,221,1,255,76,73,125, + 24,98,255,160,68,235,29,2,183,28,168,248,200,40,39,213,206,208,220,161,84,137,72,104,105,216,238,180,110,5,112,134,193,147,28,228,107,215,22,165, + 38,178,86,59,38,249,145,155,127,28,127,50,67,78,216,126,252,155,42,17,97,125,222,185,145,138,60,172,176,3,246,111,138,170,225,15,162,106,108,7, + 85,205,34,174,133,111,97,66,168,142,37,240,3,117,181,182,11,171,142,132,231,204,153,14,172,99,21,73,198,16,195,202,215,199,117,204,33,198,218,43, + 21,164,183,243,176,109,163,35,41,156,240,30,213,70,51,161,228,27,3,220,2,165,55,188,146,29,128,165,139,132,176,70,171,14,192,28,0,51,161,69, + 23,95,105,33,43,90,218,61,169,53,194,105,231,205,59,75,173,83,86,51,9,116,181,115,150,139,55,6,213,61,12,170,239,130,234,35,90,155,216,179, + 5,18,182,192,73,107,58,152,114,19,121,146,240,46,168,48,186,74,73,193,221,63,177,41,8,249,144,7,179,78,93,80,185,192,130,149,105,35,69,160, + 106,56,35,167,76,215,192,114,70,186,230,152,238,162,42,201,215,120,163,95,13,85,114,112,86,104,53,26,11,88,36,163,133,73,199,98,212,254,189,109, + 193,35,237,165,226,28,14,207,115,88,41,134,218,55,198,183,181,209,62,124,45,239,226,171,34,198,173,222,23,90,200,167,194,250,101,23,95,29,41,174, + 109,75,236,3,190,176,37,198,73,243,202,82,203,96,59,97,104,173,20,210,178,26,211,221,239,109,11,17,113,160,238,44,132,23,78,196,121,255,214,194, + 203,30,206,245,153,174,153,229,17,183,86,177,61,51,235,35,39,184,230,170,3,174,194,158,180,231,182,107,18,64,47,180,113,109,235,123,36,53,122,119, + 246,9,193,99,175,170,97,143,83,72,97,201,197,222,67,33,223,140,0,215,16,159,76,232,246,34,252,218,94,129,208,253,199,252,58,75,111,62,52,65, + 71,145,127,67,212,241,81,48,21,111,93,201,34,91,46,81,86,167,48,135,187,203,16,186,140,105,30,47,227,243,52,68,41,104,87,103,84,154,138,89, + 94,204,211,98,83,101,194,167,83,213,4,50,20,138,66,123,61,227,91,7,189,61,121,26,188,213,140,245,213,151,23,241,60,191,1,48,251,149,223,243, + 28,135,164,246,139,9,107,72,53,44,134,228,246,160,18,243,8,67,167,230,14,235,174,138,2,2,48,94,198,119,41,182,20,254,108,132,172,188,200,111, + 206,11,130,102,17,47,183,216,108,187,82,213,120,54,203,49,117,85,92,29,84,207,243,228,138,238,85,199,87,181,8,54,119,105,173,22,52,126,123,179, + 189,179,220,100,107,84,142,155,59,58,206,164,186,167,197,230,214,142,51,206,238,105,66,146,118,120,30,77,37,64,114,155,0,246,100,149,86,241,60,174, + 226,157,116,108,74,212,230,186,172,152,47,166,255,248,252,183,109,188,155,36,211,255,201,139,111,187,80,149,26,196,179,252,10,107,218,198,224,116,3,151, + 76,73,211,226,234,44,91,97,243,116,127,251,151,219,213,18,226,188,173,232,52,174,238,46,211,221,160,245,176,155,187,232,222,251,236,121,178,202,168,211, + 228,107,5,73,255,59,77,210,138,203,235,65,19,186,77,207,139,179,214,192,180,129,95,206,183,209,115,103,9,89,181,76,207,254,61,254,118,53,27,124, + 173,82,24,165,34,44,183,46,111,143,49,57,28,36,180,60,152,143,134,173,247,112,214,108,161,190,255,140,86,87,101,150,92,196,203,101,148,124,15,93, + 155,86,31,218,235,92,102,73,186,46,31,135,37,76,155,93,67,151,87,171,124,93,6,132,154,190,229,100,118,55,46,227,9,216,205,228,0,158,122,99, + 255,189,187,71,29,124,13,247,168,125,187,14,59,185,154,253,1,99,222,129,130,22,244,175,241,249,30,154,84,186,204,206,90,87,180,39,147,166,172,183, + 97,153,86,85,182,62,127,164,85,146,175,97,234,150,176,91,235,116,249,112,211,234,38,141,191,61,54,105,179,217,195,54,117,89,103,91,245,33,117,1, + 8,114,64,218,208,214,142,47,251,135,214,82,144,39,158,87,87,26,46,211,2,18,95,62,42,13,125,111,113,252,35,189,44,242,249,85,82,101,249,186, + 43,6,47,28,248,115,6,239,147,205,174,122,7,46,210,255,189,202,208,227,89,35,255,103,94,1,146,215,29,243,151,234,254,197,190,8,133,180,200,174, + 195,145,146,52,148,175,187,232,175,23,113,145,254,178,204,190,181,193,8,162,215,136,218,38,59,216,50,213,39,147,141,33,15,79,231,59,3,223,113,125, + 91,231,176,140,103,41,216,194,23,170,28,240,67,23,152,95,93,174,242,121,218,116,223,248,134,203,184,186,216,108,169,234,97,215,86,115,206,93,47,183, + 210,214,89,196,215,224,58,76,33,252,29,193,171,75,35,219,188,10,107,253,143,129,66,208,56,168,41,210,224,151,65,195,140,6,148,20,208,3,54,224, + 248,14,44,85,142,30,110,211,30,230,251,118,134,45,159,42,238,234,68,131,238,169,186,61,204,72,110,43,123,104,222,174,174,135,239,17,254,132,25,248, + 251,46,136,105,82,198,219,212,48,130,72,231,16,107,216,79,221,4,50,241,185,41,252,223,79,31,15,249,240,207,161,182,149,204,14,143,197,213,50,157, + 174,243,245,119,240,181,79,53,73,164,199,180,249,93,147,141,41,223,60,18,11,199,113,79,161,31,85,187,236,143,60,91,79,161,26,105,241,105,21,23, + 223,210,162,30,164,254,61,46,171,184,168,58,37,171,108,222,121,78,215,243,206,180,97,168,101,134,63,83,181,41,155,199,96,71,69,17,223,117,90,82, + 105,157,29,159,178,77,217,110,143,215,89,153,205,178,37,61,132,159,203,244,211,60,43,47,33,161,211,108,77,11,255,148,95,167,197,98,153,223,108,234, + 15,79,137,8,4,98,147,34,217,5,52,109,161,238,105,119,239,177,73,156,244,145,71,70,9,244,63,143,236,105,71,182,209,29,201,164,63,78,219,142, + 82,211,7,245,251,208,46,188,189,81,234,179,163,78,26,102,121,175,29,69,204,174,164,25,141,109,228,181,71,171,17,215,145,229,182,147,92,235,72,116, + 87,108,249,189,18,123,120,31,113,188,196,126,116,206,197,78,119,133,150,69,62,124,236,15,40,188,65,108,32,4,158,25,203,229,72,240,72,112,109,172, + 25,124,25,72,19,57,239,37,19,35,133,211,84,86,13,126,29,72,136,139,177,150,82,165,60,210,2,45,7,168,228,76,64,190,71,116,231,195,148,50, + 124,128,74,43,188,165,164,212,182,171,146,116,29,225,49,9,73,150,146,168,37,65,243,136,138,153,27,97,96,38,148,150,134,250,42,198,72,116,164,142, + 16,48,107,35,177,24,33,35,110,141,148,146,196,200,43,195,180,193,152,2,45,68,40,245,145,241,161,80,80,98,76,40,165,70,42,194,90,148,115,3, + 174,112,192,150,138,52,188,59,167,162,47,3,46,35,43,149,151,35,131,165,42,193,177,198,47,141,54,112,165,71,156,69,74,27,103,116,93,218,192,67, + 157,52,147,142,83,41,70,213,26,173,71,220,80,210,218,187,48,2,86,47,188,178,130,74,33,154,161,208,70,142,25,195,156,25,113,17,25,192,166,8, + 144,190,82,67,153,104,108,58,76,229,25,22,237,122,203,126,29,16,10,218,10,233,136,160,104,84,99,169,152,220,41,236,69,82,50,72,211,154,77,239, + 217,126,31,28,58,126,174,216,161,153,89,131,89,145,131,41,79,135,73,242,61,217,124,202,199,156,210,61,253,146,164,199,104,182,146,225,181,48,186,136, + 115,43,157,166,141,121,197,8,107,72,135,20,76,24,75,178,227,33,128,92,212,194,232,185,198,201,53,82,134,243,39,171,229,24,227,94,145,128,98,24, + 102,45,73,20,131,9,114,188,211,155,164,213,82,106,122,36,29,250,72,96,73,45,61,96,165,50,75,105,85,174,5,201,183,131,87,20,156,228,209,91, + 8,27,137,143,16,112,171,146,59,79,231,44,181,224,78,146,60,74,24,250,80,138,101,212,133,130,4,73,97,27,16,52,169,172,86,26,231,164,119,101, + 138,146,228,58,136,153,142,184,83,194,146,68,42,237,133,32,185,7,26,80,20,238,73,194,189,195,136,190,46,244,216,155,198,228,138,150,233,157,172,251, + 195,5,225,252,137,187,42,35,148,49,181,64,50,195,57,212,137,24,45,83,66,219,90,34,29,102,165,82,202,126,11,27,52,158,174,185,184,231,70,83, + 41,6,114,82,7,57,21,192,147,74,105,47,156,107,167,73,248,153,0,45,70,25,20,83,144,156,29,28,91,75,202,14,40,9,180,22,75,146,190,207, + 200,7,187,119,180,65,223,190,111,213,99,208,249,143,100,209,119,121,239,52,169,238,167,240,150,65,244,180,121,49,240,189,174,216,128,60,246,157,132,21, + 63,40,47,164,179,128,137,219,241,194,38,141,10,173,17,198,137,214,157,232,38,123,42,200,107,40,207,119,183,81,68,32,161,92,78,75,217,186,214,59, + 29,210,213,27,12,134,242,187,166,196,25,97,174,156,116,142,217,221,29,85,113,215,91,220,71,232,140,183,94,82,96,108,185,129,166,143,198,219,95,173, + 186,61,178,247,218,132,206,201,167,16,58,235,22,126,254,39,161,235,248,80,120,39,229,157,133,23,148,140,88,188,116,181,115,146,82,72,178,217,30,118, + 28,84,204,14,224,210,172,19,70,56,114,99,116,245,109,121,111,25,92,48,156,164,54,154,88,8,156,22,254,50,242,57,32,117,168,103,16,15,31,193, + 255,42,80,13,106,11,54,102,132,149,228,223,184,213,2,75,161,82,9,98,167,225,239,71,240,73,144,113,116,235,150,42,122,163,194,104,154,141,94,20, + 178,140,195,151,9,184,42,77,126,154,118,0,137,51,160,123,40,117,240,112,160,44,240,175,116,41,202,36,81,72,136,170,3,151,20,125,219,239,167,60, + 234,17,202,179,97,45,79,96,59,247,19,29,167,15,15,9,76,5,36,25,231,129,90,98,1,225,148,24,177,57,218,34,188,49,179,142,14,132,88,46, + 72,55,92,188,211,26,100,176,183,44,28,146,132,241,32,78,170,35,196,92,70,17,93,160,112,206,32,240,177,196,33,84,195,73,233,140,44,232,147,25, + 129,91,121,163,193,169,169,84,129,194,131,34,56,226,164,28,0,27,91,151,74,148,213,108,193,211,203,60,130,206,136,227,236,57,157,50,150,138,62,82, + 133,245,19,203,148,129,131,130,186,8,237,76,56,35,7,110,238,5,237,20,76,12,114,212,187,251,135,24,131,150,222,90,1,71,242,6,142,139,110,173, + 247,28,215,230,250,85,168,31,145,66,244,152,241,99,141,183,127,138,241,174,175,133,95,110,188,31,129,238,126,144,94,118,98,47,53,211,100,196,160,227, + 156,143,200,142,130,89,35,116,254,117,0,75,234,192,243,17,23,42,29,65,135,173,167,96,85,73,4,227,161,200,66,19,132,33,186,207,160,226,90,83, + 220,237,25,71,0,132,206,148,100,49,214,25,65,241,143,49,8,6,57,133,128,92,43,227,29,69,58,148,195,133,162,146,51,80,28,148,96,36,233,173, + 29,132,63,158,148,23,138,238,16,205,251,145,228,20,80,11,230,66,140,13,53,111,148,23,113,137,226,212,14,33,167,9,58,14,27,161,185,168,67,34, + 78,209,17,52,26,129,18,24,140,241,181,61,64,60,45,17,82,81,22,12,225,150,20,20,43,32,102,65,44,69,45,97,253,17,101,241,240,46,131,224, + 152,37,188,120,195,131,49,161,128,151,195,174,104,90,15,204,184,148,158,64,163,224,1,17,17,108,32,247,22,230,138,146,90,48,111,136,72,168,12,86, + 17,65,30,69,120,145,19,176,159,112,100,18,46,203,1,107,129,176,153,57,43,224,250,66,44,72,215,0,134,114,95,24,155,118,72,152,193,128,106,50, + 144,125,135,211,239,69,196,17,94,164,76,94,156,200,237,37,80,155,248,231,104,149,139,57,125,247,141,29,151,206,64,132,204,15,156,190,197,65,154,254, + 244,45,164,226,254,75,22,27,221,151,187,165,151,98,251,51,183,221,170,58,115,139,128,64,83,70,35,36,101,169,190,249,119,147,146,133,7,28,61,80, + 189,235,254,72,194,246,136,151,33,21,52,145,81,178,140,89,171,140,250,249,229,55,16,6,140,225,62,231,253,84,9,254,243,210,161,67,43,121,235,21, + 251,142,212,114,208,42,38,149,87,253,130,75,156,141,245,118,174,133,23,94,196,182,222,73,223,147,223,189,218,154,207,130,127,91,88,125,184,135,102,236, + 32,171,117,211,221,143,70,98,201,224,131,84,10,59,58,166,117,207,216,15,203,185,182,140,72,116,255,5,111,168,242,228,20,157,114,20,141,8,186,14, + 126,65,24,251,114,2,106,228,30,1,21,145,0,87,103,61,57,172,34,191,90,207,15,196,187,46,253,231,186,150,112,17,189,208,202,66,192,106,132,114, + 44,48,156,158,82,10,40,25,56,144,34,79,15,134,162,4,220,55,215,20,201,200,64,122,12,119,123,47,93,55,202,35,31,241,221,79,8,253,202,141, + 159,63,188,84,183,108,159,248,57,112,55,134,32,9,220,13,68,42,48,37,206,34,161,44,37,185,21,162,48,68,234,180,177,16,29,107,196,236,40,3, + 195,243,220,83,238,21,12,16,91,162,206,224,47,164,12,129,248,129,235,40,227,40,25,46,173,209,206,147,142,81,6,156,72,30,197,236,76,114,69,44, + 13,177,158,85,154,136,31,131,254,169,38,55,160,48,148,86,68,180,192,225,36,69,109,88,133,181,176,33,1,104,68,141,152,27,237,180,10,111,115,83, + 116,167,65,216,92,19,9,42,122,249,148,200,155,195,106,57,175,163,117,7,242,138,117,6,62,200,20,198,164,116,54,115,94,115,106,9,14,199,164,164, + 85,58,33,193,95,41,214,7,11,97,194,213,251,225,142,94,111,165,21,17,201,210,22,204,24,4,208,81,114,159,82,241,0,6,177,190,197,121,91,69, + 87,54,180,71,102,176,135,112,59,98,241,155,251,112,177,196,133,19,134,238,86,32,17,74,136,112,13,96,132,245,90,162,55,248,174,167,219,17,160,230, + 165,20,33,171,209,115,60,135,161,233,155,102,174,213,15,196,196,62,29,188,96,162,142,178,196,80,23,202,247,120,254,70,38,217,242,255,255,38,249,13, + 83,136,208,94,161,64,220,130,254,193,200,8,213,232,244,126,41,108,148,102,220,73,79,186,6,18,169,132,39,131,76,255,67,154,242,193,70,9,206,140, + 239,49,139,202,30,103,125,79,38,231,103,31,78,232,69,221,179,15,255,7,80,75,3,4,20,0,2,0,8,0,183,128,249,52,199,174,1,222,145,13, + 0,0,154,63,0,0,18,0,0,0,115,121,115,116,101,109,45,108,111,103,45,111,117,116,46,115,118,103,237,90,109,111,219,200,17,254,158,95,161,42, + 95,18,156,68,237,251,139,98,187,184,94,112,197,21,105,15,184,220,161,31,11,154,90,219,60,83,162,74,82,182,149,95,223,153,37,197,23,137,178,41, + 199,201,29,208,72,9,44,206,206,190,61,251,204,236,204,46,207,254,250,176,76,70,119,46,203,227,116,117,62,166,1,25,143,220,42,74,23,241,234,250, + 124,252,219,175,63,78,205,120,148,23,225,106,17,38,233,202,157,143,87,233,248,175,23,175,206,254,50,157,142,126,200,92,88,184,197,232,62,46,110,70, + 63,173,110,243,40,92,187,209,155,155,162,88,207,103,179,251,251,251,32,174,132,65,154,93,207,222,142,166,83,168,153,223,93,191,26,141,70,208,237,42, + 159,47,162,243,113,165,191,222,100,137,215,91,68,51,151,184,165,91,21,249,140,6,116,54,110,212,163,70,253,222,93,6,153,203,211,77,22,149,205,71, + 81,91,51,91,92,53,170,48,146,123,238,149,168,181,118,70,216,140,177,41,104,76,243,237,170,8,31,166,171,252,117,171,42,12,176,175,42,35,132,204, + 160,172,209,28,166,53,127,72,0,134,163,131,241,165,237,222,1,250,53,252,175,43,212,24,150,115,189,130,154,46,88,185,98,246,254,215,247,179,157,246, + 148,4,139,98,209,106,102,87,171,211,111,103,57,86,225,210,229,235,48,114,121,221,133,175,191,123,152,187,135,117,154,21,211,237,98,13,131,177,36,32, + 254,211,171,243,48,64,231,42,78,28,246,121,62,158,221,164,75,55,251,61,94,46,195,104,246,222,229,183,69,186,158,221,199,160,17,172,87,37,114,247, + 241,162,184,57,31,11,179,126,240,207,55,46,190,190,41,90,130,120,113,62,6,152,41,229,85,119,59,36,230,53,151,73,192,89,119,36,173,34,193,191, + 91,184,59,151,116,235,46,210,232,50,204,247,135,152,103,209,44,186,203,103,96,5,215,233,52,142,210,213,180,184,1,130,206,160,213,36,188,76,220,44, + 140,10,104,55,63,104,172,156,111,190,205,11,183,156,38,233,245,52,221,20,1,178,227,2,52,207,22,238,42,199,26,229,108,240,137,251,2,40,2,82, + 184,48,251,123,22,46,98,176,131,82,169,84,235,150,88,99,85,85,7,106,229,0,228,78,183,130,8,36,160,99,198,141,56,189,186,202,29,64,73,90, + 178,188,216,38,174,212,158,70,105,146,102,243,215,145,195,239,59,47,74,129,38,113,177,157,211,119,227,209,236,169,222,44,33,61,189,209,138,26,79,244, + 106,29,126,247,122,221,85,109,122,63,155,117,97,56,25,53,211,32,82,179,3,134,144,184,8,198,26,38,247,225,54,31,0,43,57,29,214,43,255,121, + 6,172,198,178,62,88,79,239,237,69,97,36,47,0,163,97,167,195,40,25,126,159,3,163,17,167,195,216,215,219,75,194,168,204,49,148,122,6,35,28, + 126,143,154,72,15,148,61,166,215,224,161,201,113,212,122,122,87,20,191,123,80,60,214,59,125,188,119,246,114,40,74,241,52,215,164,26,8,208,233,192, + 15,224,158,52,207,247,140,225,37,126,191,188,103,20,236,5,76,90,136,211,77,90,51,237,72,248,28,147,22,234,116,147,238,235,237,37,97,228,228,105, + 148,56,123,62,25,37,193,239,231,144,145,139,231,147,145,26,252,190,48,25,143,177,237,56,204,70,41,118,130,231,172,134,183,207,176,199,153,186,3,12, + 250,18,39,121,202,190,222,250,61,100,127,111,234,43,194,40,201,9,48,30,9,97,134,194,40,217,73,48,30,9,97,134,194,40,197,83,48,226,83,152, + 156,12,163,207,219,230,55,153,131,60,243,117,15,158,109,184,187,93,64,113,227,176,162,7,24,185,13,52,161,84,52,51,136,182,231,99,22,64,108,111, + 185,105,164,87,189,186,87,189,186,25,168,234,128,106,208,148,181,240,186,26,193,175,89,184,202,33,145,92,158,143,151,97,145,197,15,111,104,192,36,23, + 130,77,166,44,96,86,81,43,221,148,170,9,13,180,208,66,17,255,64,2,43,57,68,247,147,41,149,129,208,150,152,9,133,122,90,41,254,246,160,139, + 223,86,113,1,9,242,38,119,217,71,76,50,127,94,253,150,187,102,41,250,65,199,65,203,64,9,161,185,238,204,143,171,64,48,74,153,238,96,193,68, + 96,184,166,76,117,112,59,212,141,122,117,31,3,163,180,221,9,233,249,33,185,210,140,3,50,74,115,169,17,38,57,161,42,48,154,19,53,20,134,227, + 220,176,166,53,194,71,41,166,6,236,211,79,192,61,108,144,199,113,98,1,161,218,90,58,17,129,80,148,82,229,105,50,149,1,164,87,76,10,255,196, + 96,57,9,74,169,16,129,20,214,76,166,10,234,113,64,241,109,135,172,10,178,117,42,169,232,172,187,0,188,5,108,116,172,179,238,150,7,218,16,210, + 226,72,212,171,27,245,234,246,129,206,7,129,238,119,245,225,160,247,251,231,71,105,199,164,164,108,66,240,11,184,193,22,13,6,73,2,244,98,22,140, + 17,76,131,19,118,50,203,182,12,232,111,2,48,9,176,235,102,158,32,229,96,210,92,90,214,184,141,45,5,32,1,50,9,228,110,233,210,62,221,222, + 232,209,12,3,82,176,23,3,114,192,228,53,76,200,18,213,157,60,53,64,67,202,246,38,15,254,213,16,65,169,238,76,94,128,129,11,9,164,126,116, + 242,74,12,155,188,20,127,2,211,149,10,230,195,39,50,32,48,51,137,166,107,208,249,11,170,152,194,39,1,46,78,16,206,20,80,144,3,128,16,173, + 242,201,212,6,192,74,78,120,199,118,97,75,98,76,211,86,30,143,182,11,187,15,183,138,104,210,245,217,26,188,3,135,127,29,219,61,212,141,122,117, + 251,108,87,15,180,93,101,190,132,237,22,248,51,9,11,247,102,74,193,196,20,101,205,110,241,44,67,21,129,86,64,53,209,53,84,1,77,106,88,155, + 125,174,82,162,53,219,51,84,26,24,201,172,124,220,80,205,64,212,12,249,138,134,10,158,71,8,107,133,238,26,42,240,75,74,217,114,45,126,242,60, + 128,192,3,64,233,76,222,0,122,132,40,241,248,228,237,64,67,53,230,43,78,30,253,17,236,149,124,207,69,131,51,166,68,201,174,151,98,52,144,176, + 225,26,185,191,242,68,27,43,31,245,82,150,176,97,147,183,106,232,228,207,102,120,118,237,127,213,135,223,120,242,189,184,139,221,253,171,42,176,207,210, + 91,136,236,95,135,162,149,93,94,197,73,2,178,50,23,31,55,71,225,120,6,95,61,174,195,107,231,51,1,208,43,83,129,170,224,50,205,22,46,219, + 21,41,255,233,20,85,201,2,102,212,16,140,88,66,235,9,213,211,193,198,91,106,164,175,60,191,9,23,233,61,64,190,95,248,41,77,151,77,214,209, + 64,132,142,11,186,180,82,104,125,80,184,197,20,219,106,170,77,29,150,55,133,155,44,3,228,167,73,184,117,48,39,255,103,215,124,126,147,222,95,103, + 136,77,145,109,220,126,77,44,153,94,94,166,15,253,197,139,52,218,224,117,218,116,83,146,176,186,66,105,105,96,243,237,201,94,133,73,126,208,204,125, + 188,130,194,105,117,53,67,27,166,238,107,236,46,107,32,33,57,162,241,128,55,57,242,72,33,98,4,241,90,197,173,165,43,194,69,88,132,13,59,118, + 146,221,113,223,89,182,184,154,255,242,254,199,58,167,140,162,249,191,211,236,182,73,7,81,33,188,76,55,48,166,58,207,197,251,151,104,142,78,60,44, + 46,226,37,76,30,175,237,190,123,88,38,64,231,186,160,163,92,108,215,174,105,180,108,118,119,5,217,123,141,185,136,150,49,86,154,125,44,128,233,63, + 97,39,173,220,183,108,52,194,75,212,52,187,104,53,140,19,248,254,186,206,80,59,67,136,139,196,93,252,35,188,221,92,142,62,22,14,76,54,243,195, + 45,229,237,54,102,135,141,120,205,131,254,176,217,114,14,23,213,20,202,107,175,96,185,201,227,232,38,76,146,32,250,228,171,86,90,175,218,227,76,226, + 200,173,242,167,97,241,221,198,119,96,203,203,101,186,202,61,66,85,221,124,118,185,157,230,225,12,210,130,217,1,60,229,196,62,250,27,180,209,135,244, + 122,244,243,166,232,155,177,159,197,230,242,119,240,78,29,24,112,48,127,11,175,247,144,68,105,18,95,36,208,94,138,237,85,207,199,148,158,212,113,15, + 113,175,70,41,235,244,95,34,217,29,169,95,44,164,108,155,194,31,246,145,109,177,248,68,80,187,75,182,118,25,208,50,127,114,201,250,110,216,127,113, + 235,44,93,108,252,117,103,119,173,62,179,225,247,49,108,17,241,229,166,183,225,204,253,119,19,67,141,103,181,252,175,180,0,72,94,182,205,239,139,227, + 131,253,44,20,92,22,223,249,37,69,54,228,47,59,232,143,55,97,230,190,79,226,219,54,24,158,122,21,213,118,199,100,45,127,122,54,219,121,91,255, + 116,221,120,225,206,246,84,187,240,36,188,116,176,165,127,192,194,17,61,220,167,210,205,122,153,46,92,85,189,118,224,96,11,117,62,225,183,98,77,32, + 234,105,69,124,217,67,45,149,172,9,96,252,209,151,84,150,145,214,21,247,131,15,14,37,161,186,165,89,191,64,0,219,175,96,132,53,234,213,126,6, + 193,147,133,208,169,27,59,225,192,172,105,41,87,7,148,205,177,103,247,176,23,3,154,57,108,0,111,94,31,158,48,188,245,165,173,19,83,255,152,109, + 18,55,119,119,110,149,46,22,239,202,40,169,117,116,140,143,229,134,91,31,175,11,179,147,99,192,6,176,206,129,135,69,91,246,123,26,175,230,64,65, + 151,189,91,134,217,173,203,230,171,116,229,170,223,211,188,8,179,162,35,89,198,139,206,179,91,85,207,85,155,190,169,36,134,63,115,90,15,106,17,66, + 172,144,101,225,182,163,138,210,242,60,118,94,107,54,19,190,139,243,248,50,78,240,193,255,76,220,187,69,156,175,129,10,243,120,133,35,127,151,222,185, + 236,42,73,239,119,229,135,17,104,246,159,168,27,229,116,203,182,85,89,147,62,183,168,181,245,171,172,185,146,173,227,7,100,139,56,160,9,101,1,83, + 92,200,67,154,16,160,9,124,76,15,79,4,57,157,39,135,7,40,195,121,210,70,190,34,201,55,110,156,192,141,117,88,220,212,11,86,39,46,224,158, + 48,102,131,56,57,194,79,103,157,177,134,53,173,35,70,144,253,115,68,33,59,231,90,41,54,129,4,214,10,136,108,237,232,195,8,124,144,197,151,27, + 236,132,7,68,10,124,131,0,164,28,53,40,101,18,165,214,104,106,69,37,53,146,83,208,5,49,53,84,75,108,161,167,221,79,163,3,142,237,225,178, + 143,91,15,178,251,232,215,55,119,61,75,213,87,118,184,184,29,30,84,85,14,56,115,132,83,7,172,235,180,188,199,218,71,248,221,245,147,164,99,37, + 135,54,212,53,178,224,49,155,84,226,237,158,253,30,32,119,132,84,93,47,64,2,193,202,79,159,59,216,221,116,29,181,126,152,200,39,72,107,143,91, + 63,223,71,7,182,219,213,226,0,200,82,250,210,230,47,190,144,245,95,38,105,116,123,220,248,75,3,4,243,80,214,16,218,49,64,46,2,74,181,37, + 220,27,149,98,92,121,179,148,129,148,224,218,237,4,67,1,99,165,101,29,41,218,31,225,156,168,202,132,141,52,70,29,72,247,123,107,153,229,206,79, + 80,174,200,179,125,212,147,110,41,122,194,141,161,238,249,56,204,162,241,81,50,50,107,133,146,108,120,12,195,14,98,152,218,214,78,217,163,246,61,202, + 31,178,87,5,67,188,218,99,126,240,16,131,207,217,194,42,206,24,213,226,76,189,150,253,247,151,77,113,239,165,103,93,140,161,243,225,173,106,83,188, + 197,83,83,110,149,177,92,118,205,74,128,195,50,212,40,62,170,155,31,125,63,170,219,26,213,213,70,100,68,225,59,178,1,181,140,27,3,155,219,176, + 10,125,61,124,170,7,81,28,92,91,64,10,160,141,176,253,55,179,85,209,84,7,82,91,131,215,178,129,132,191,220,190,29,228,157,155,133,236,115,206, + 81,212,240,252,4,250,87,231,157,93,11,168,66,72,48,168,63,210,97,255,217,108,160,244,228,16,158,83,92,189,9,133,101,196,55,26,188,207,174,165, + 16,126,115,41,185,194,160,201,6,74,9,240,202,226,152,84,5,84,43,42,52,72,25,13,140,209,90,200,9,3,159,13,177,24,225,94,87,90,202,5, + 19,248,34,131,146,138,18,218,149,226,24,52,81,186,51,134,102,100,61,94,31,130,5,62,192,123,31,245,223,251,78,90,18,67,24,21,67,157,52,190, + 91,242,69,157,244,255,61,67,109,96,25,216,180,1,118,176,64,104,67,68,201,164,90,170,241,190,94,41,100,18,11,136,22,138,74,122,68,10,78,29, + 130,126,33,200,232,135,17,180,198,57,228,8,32,197,131,14,142,78,17,88,105,165,176,150,77,240,10,91,115,200,23,144,201,204,10,102,136,103,178,64, + 174,119,251,175,71,213,207,78,249,249,177,69,31,155,15,123,106,229,206,30,56,22,64,178,3,51,180,19,138,251,0,184,63,233,193,216,73,153,197,119, + 107,8,243,6,15,196,247,200,28,145,226,173,152,229,86,163,20,224,18,68,128,157,150,128,64,22,174,74,93,1,27,145,214,19,188,40,52,66,83,209, + 149,26,168,197,140,55,237,190,145,125,203,179,78,205,179,122,83,39,43,222,14,200,189,218,78,205,143,169,63,219,242,193,2,51,92,12,75,183,134,7, + 182,90,125,59,116,121,214,110,45,2,2,249,15,245,153,80,249,206,144,63,182,56,126,226,209,150,194,222,108,180,63,241,80,134,18,99,170,19,143,253, + 6,123,220,24,164,228,106,124,194,201,205,23,60,32,202,243,222,35,34,189,239,252,32,44,17,156,0,8,232,120,36,190,96,137,32,80,124,13,71,104, + 134,62,223,18,99,53,238,15,16,205,80,2,81,7,56,63,25,104,166,32,145,132,253,161,79,138,113,143,102,140,89,220,31,24,51,154,27,108,147,66, + 7,12,220,161,10,24,101,76,51,172,13,59,9,181,216,63,212,134,206,13,56,73,159,31,27,98,160,119,230,223,44,163,198,47,11,39,128,175,223,133, + 164,96,150,98,109,124,47,3,122,130,221,197,6,92,49,60,158,226,248,102,159,193,190,97,70,10,246,40,12,226,123,100,31,122,231,222,227,94,135,132, + 225,189,62,198,124,75,75,95,56,224,25,110,0,192,254,60,202,251,12,116,239,140,20,8,40,180,174,2,36,46,33,190,38,37,45,15,164,232,15,4, + 225,82,248,221,88,114,34,75,90,130,135,48,22,9,8,252,130,248,187,164,37,56,14,165,9,146,21,2,3,78,37,146,77,40,197,132,193,224,74,161, + 113,169,94,217,15,35,102,2,180,3,234,77,130,25,129,39,177,254,53,73,195,153,66,77,140,247,33,62,0,25,190,41,167,36,202,40,12,82,84,181, + 15,164,64,127,34,240,69,108,28,15,161,154,106,142,51,52,156,40,174,113,228,202,114,197,105,57,111,41,53,129,126,112,62,198,80,45,112,148,16,243, + 89,124,209,19,140,71,74,162,76,175,204,247,13,1,13,32,131,168,89,60,34,54,222,61,112,170,168,198,151,145,185,176,138,200,94,116,191,197,53,95, + 253,252,24,220,238,208,243,227,179,217,245,197,171,51,124,17,229,226,213,255,0,80,75,1,2,20,0,20,0,2,0,8,0,128,122,250,52,23,17,234, + 255,206,13,0,0,219,67,0,0,16,0,0,0,0,0,0,0,1,0,32,0,0,0,0,0,0,0,100,111,99,117,109,101,110,116,45,110,101,119,46, + 115,118,103,80,75,1,2,20,0,20,0,0,0,8,0,96,128,249,52,242,213,5,70,140,20,0,0,25,120,0,0,17,0,0,0,0,0,0,0,1, + 0,32,0,0,0,252,13,0,0,100,111,99,117,109,101,110,116,45,111,112,101,110,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,96,125, + 250,52,34,86,64,46,27,23,0,0,165,116,0,0,17,0,0,0,0,0,0,0,1,0,32,0,0,0,183,34,0,0,100,111,99,117,109,101,110,116, + 45,115,97,118,101,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,118,128,249,52,254,120,218,95,213,23,0,0,110,124,0,0,20,0,0, + 0,0,0,0,0,1,0,32,0,0,0,1,58,0,0,100,111,99,117,109,101,110,116,45,115,97,118,101,45,97,115,46,115,118,103,80,75,1,2,20, + 0,20,0,2,0,8,0,106,128,249,52,126,63,165,149,12,18,0,0,232,90,0,0,18,0,0,0,0,0,0,0,1,0,32,0,0,0,8,82,0, + 0,100,111,99,117,109,101,110,116,45,112,114,105,110,116,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,121,128,249,52,162,251,72,104,220, + 10,0,0,238,60,0,0,13,0,0,0,0,0,0,0,1,0,32,0,0,0,68,100,0,0,101,100,105,116,45,99,111,112,121,46,115,118,103,80,75, + 1,2,20,0,20,0,2,0,8,0,125,128,249,52,153,109,230,156,183,23,0,0,27,89,0,0,12,0,0,0,0,0,0,0,1,0,32,0,0,0, + 75,111,0,0,101,100,105,116,45,99,117,116,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,136,128,249,52,38,221,82,145,115,17,0,0, + 142,92,0,0,14,0,0,0,0,0,0,0,1,0,32,0,0,0,44,135,0,0,101,100,105,116,45,112,97,115,116,101,46,115,118,103,80,75,1,2, + 20,0,20,0,2,0,8,0,130,128,249,52,145,40,234,161,189,30,0,0,76,213,0,0,15,0,0,0,0,0,0,0,1,0,32,0,0,0,203,152, + 0,0,101,100,105,116,45,100,101,108,101,116,101,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,131,128,249,52,23,55,187,63,234,22,0, + 0,20,138,0,0,13,0,0,0,0,0,0,0,1,0,32,0,0,0,181,183,0,0,101,100,105,116,45,102,105,110,100,46,115,118,103,80,75,1,2, + 20,0,20,0,2,0,8,0,141,128,249,52,100,188,189,164,140,9,0,0,25,36,0,0,13,0,0,0,0,0,0,0,1,0,32,0,0,0,202,206, + 0,0,101,100,105,116,45,117,110,100,111,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,143,128,249,52,187,167,102,138,170,9,0,0,119, + 36,0,0,13,0,0,0,0,0,0,0,1,0,32,0,0,0,129,216,0,0,101,100,105,116,45,114,101,100,111,46,115,118,103,80,75,1,2,20,0, + 20,0,2,0,8,0,171,128,249,52,75,77,50,197,89,10,0,0,186,54,0,0,23,0,0,0,0,0,0,0,1,0,32,0,0,0,86,226,0,0, + 109,101,100,105,97,45,115,101,101,107,45,98,97,99,107,119,97,114,100,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,174,128,249,52,207, + 153,178,73,172,10,0,0,72,56,0,0,22,0,0,0,0,0,0,0,1,0,32,0,0,0,228,236,0,0,109,101,100,105,97,45,115,101,101,107,45, + 102,111,114,119,97,114,100,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,168,128,249,52,105,10,147,139,124,11,0,0,198,82,0,0,23, + 0,0,0,0,0,0,0,1,0,32,0,0,0,196,247,0,0,109,101,100,105,97,45,112,108,97,121,98,97,99,107,45,115,116,111,112,46,115,118,103, + 80,75,1,2,20,0,20,0,2,0,8,0,164,128,249,52,67,149,237,100,185,11,0,0,111,89,0,0,24,0,0,0,0,0,0,0,1,0,32,0, + 0,0,117,3,1,0,109,101,100,105,97,45,112,108,97,121,98,97,99,107,45,112,97,117,115,101,46,115,118,103,80,75,1,2,20,0,20,0,2,0, + 8,0,165,128,249,52,158,228,190,4,151,9,0,0,193,42,0,0,24,0,0,0,0,0,0,0,1,0,32,0,0,0,100,15,1,0,109,101,100,105, + 97,45,112,108,97,121,98,97,99,107,45,115,116,97,114,116,46,115,118,103,80,75,1,2,20,0,20,0,2,0,8,0,4,134,250,52,115,77,182,120, + 141,10,0,0,123,45,0,0,16,0,0,0,0,0,0,0,1,0,32,0,0,0,49,25,1,0,109,101,100,105,97,45,114,101,99,111,114,100,46,115, + 118,103,80,75,1,2,20,0,20,0,2,0,8,0,225,128,249,52,157,141,185,194,180,16,0,0,195,74,0,0,22,0,0,0,0,0,0,0,1,0, + 32,0,0,0,236,35,1,0,112,114,101,102,101,114,101,110,99,101,115,45,115,121,115,116,101,109,46,115,118,103,80,75,1,2,20,0,20,0,2,0, + 8,0,183,128,249,52,199,174,1,222,145,13,0,0,154,63,0,0,18,0,0,0,0,0,0,0,1,0,32,0,0,0,212,52,1,0,115,121,115,116, + 101,109,45,108,111,103,45,111,117,116,46,115,118,103,80,75,5,6,0,0,0,0,20,0,20,0,249,4,0,0,149,66,1,0,0,0,0,0}; +const char* BinaryData::icons_zip = (const char*) temp6; + +static const unsigned char temp7[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,99,108,97,115,115,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,109,109,115,68,101,109,111,32,32,58,32,112,117,98,108,105, + 99,32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,112,117,98,108,105,99,32,66,117,116,116,111,110,76,105,115,116,101,110,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,67,111,109,98,111,66,111,120,76,105,115,116,101, + 110,101,114,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,73,110,116,101,114,112,114,111,99,101,115,115,67, + 111,109,109,115,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,114,118,101,114,32,61,32,110,101,119,32, + 68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,83,101,114,118,101,114,32,40,42,116,104,105,115,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40,34,73,110,116,101,114,112,114,111,99,101,115,115,32,67,111, + 109,109,117,110,105,99,97,116,105,111,110,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,99,114,101,97,116,101,32,97,108,108, + 32,111,117,114,32,85,73,32,98,105,116,115,32,97,110,100,32,112,105,101,99,101,115,46,46,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110, + 100,77,97,107,101,86,105,115,105,98,108,101,32,40,109,111,100,101,83,101,108,101,99,116,111,114,32,61,32,110,101,119,32,67,111,109,98,111,66,111, + 120,32,40,84,40,34,109,111,100,101,58,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62, + 115,101,116,66,111,117,110,100,115,32,40,49,48,48,44,32,50,53,44,32,50,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,40, + 110,101,119,32,76,97,98,101,108,32,40,109,111,100,101,83,101,108,101,99,116,111,114,45,62,103,101,116,78,97,109,101,40,41,44,32,109,111,100,101, + 83,101,108,101,99,116,111,114,45,62,103,101,116,78,97,109,101,40,41,41,41,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116, + 32,40,109,111,100,101,83,101,108,101,99,116,111,114,44,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101, + 108,101,99,116,111,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,40,68,105,115,99,111,110,110,101,99,116,101,100,41,34,41,44,32,56,41, + 59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59, + 13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,78,97,109,101, + 100,32,112,105,112,101,32,40,108,105,115,116,101,110,105,110,103,41,34,41,44,32,49,41,59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83, + 101,108,101,99,116,111,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,78,97,109,101,100,32,112,105,112,101,32,40,99,111,110,110,101,99,116, + 32,116,111,32,101,120,105,115,116,105,110,103,32,112,105,112,101,41,34,41,44,32,53,41,59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83, + 101,108,101,99,116,111,114,45,62,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101, + 108,101,99,116,111,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,83,111,99,107,101,116,32,40,108,105,115,116,101,110,105,110,103,41,34,41, + 44,32,50,41,59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62,97,100,100,73,116,101,109,32,40,84,40, + 34,83,111,99,107,101,116,32,40,99,111,110,110,101,99,116,32,116,111,32,101,120,105,115,116,105,110,103,32,115,111,99,107,101,116,41,34,41,44,32, + 54,41,59,13,10,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62,115,101,116,83,101,108,101,99,116,101,100, + 73,100,32,40,56,41,59,13,10,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62,97,100,100,76,105,115,116,101,110, + 101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32, + 40,112,105,112,101,78,97,109,101,32,61,32,110,101,119,32,84,101,120,116,69,100,105,116,111,114,32,40,84,40,34,112,105,112,101,32,110,97,109,101, + 58,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,112,105,112,101,78,97,109,101,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,48, + 44,32,54,48,44,32,49,51,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,112,105,112,101,78,97,109,101,45,62,115,101,116,77,117, + 108,116,105,76,105,110,101,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,112,105,112,101,78,97,109,101,45,62,115,101,116,84, + 101,120,116,32,40,84,40,34,106,117,99,101,32,100,101,109,111,32,112,105,112,101,34,41,41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119, + 32,76,97,98,101,108,32,40,112,105,112,101,78,97,109,101,45,62,103,101,116,78,97,109,101,40,41,44,32,112,105,112,101,78,97,109,101,45,62,103, + 101,116,78,97,109,101,40,41,41,41,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,112,105,112,101,78,97,109,101,44, + 32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,115,111, + 99,107,101,116,78,117,109,98,101,114,32,61,32,110,101,119,32,84,101,120,116,69,100,105,116,111,114,32,40,84,40,34,115,111,99,107,101,116,32,112, + 111,114,116,58,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,115,111,99,107,101,116,78,117,109,98,101,114,45,62,115,101,116,66,111,117,110, + 100,115,32,40,51,53,48,44,32,54,48,44,32,56,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,115,111,99,107,101,116,78,117,109, + 98,101,114,45,62,115,101,116,77,117,108,116,105,76,105,110,101,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,115,111,99,107, + 101,116,78,117,109,98,101,114,45,62,115,101,116,84,101,120,116,32,40,84,40,34,49,50,51,52,53,34,41,41,59,13,10,32,32,32,32,32,32,32, + 32,115,111,99,107,101,116,78,117,109,98,101,114,45,62,115,101,116,73,110,112,117,116,82,101,115,116,114,105,99,116,105,111,110,115,32,40,53,44,32, + 84,40,34,48,49,50,51,52,53,54,55,56,57,34,41,41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40,115, + 111,99,107,101,116,78,117,109,98,101,114,45,62,103,101,116,78,97,109,101,40,41,44,32,115,111,99,107,101,116,78,117,109,98,101,114,45,62,103,101, + 116,78,97,109,101,40,41,41,41,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,115,111,99,107,101,116,78,117,109,98, + 101,114,44,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32, + 40,115,111,99,107,101,116,72,111,115,116,32,61,32,110,101,119,32,84,101,120,116,69,100,105,116,111,114,32,40,84,40,34,115,111,99,107,101,116,32, + 104,111,115,116,58,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,115,111,99,107,101,116,72,111,115,116,45,62,115,101,116,66,111,117,110,100, + 115,32,40,53,51,48,44,32,54,48,44,32,49,51,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,115,111,99,107,101,116,72,111,115, + 116,45,62,115,101,116,77,117,108,116,105,76,105,110,101,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,115,111,99,107,101,116, + 72,111,115,116,45,62,115,101,116,84,101,120,116,32,40,84,40,34,108,111,99,97,108,104,111,115,116,34,41,41,59,13,10,32,32,32,32,32,32,32, + 32,115,111,99,107,101,116,78,117,109,98,101,114,45,62,115,101,116,73,110,112,117,116,82,101,115,116,114,105,99,116,105,111,110,115,32,40,53,49,50, + 41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40,115,111,99,107,101,116,72,111,115,116,45,62,103,101,116,78, + 97,109,101,40,41,44,32,115,111,99,107,101,116,72,111,115,116,45,62,103,101,116,78,97,109,101,40,41,41,41,45,62,97,116,116,97,99,104,84,111, + 67,111,109,112,111,110,101,110,116,32,40,115,111,99,107,101,116,72,111,115,116,44,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,97,100,100,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,115,101,110,100,84,101,120,116,32,61,32,110,101,119,32,84,101,120,116,69, + 100,105,116,111,114,32,40,84,40,34,115,101,110,100,116,101,120,116,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,115,101,110,100,84,101,120, + 116,45,62,115,101,116,66,111,117,110,100,115,32,40,51,48,44,32,49,50,48,44,32,50,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32, + 32,32,115,101,110,100,84,101,120,116,45,62,115,101,116,77,117,108,116,105,76,105,110,101,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32, + 32,32,32,115,101,110,100,84,101,120,116,45,62,115,101,116,82,101,97,100,79,110,108,121,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32, + 32,32,32,115,101,110,100,84,101,120,116,45,62,115,101,116,84,101,120,116,32,40,84,40,34,116,101,115,116,105,110,103,32,49,50,51,52,34,41,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,115,101,110,100,66,117,116,116, + 111,110,32,61,32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,115,101,110,100,34,41,44,32,84,40,34,70,105,114,101,115, + 32,111,102,102,32,116,104,101,32,109,101,115,115,97,103,101,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,115,101,110,100,66,117,116,116,111, + 110,45,62,115,101,116,66,111,117,110,100,115,32,40,50,52,48,44,32,49,50,48,44,32,50,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32, + 32,32,32,115,101,110,100,66,117,116,116,111,110,45,62,99,104,97,110,103,101,87,105,100,116,104,84,111,70,105,116,84,101,120,116,40,41,59,13,10, + 32,32,32,32,32,32,32,32,115,101,110,100,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116, + 104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,105,110,99,111, + 109,105,110,103,77,101,115,115,97,103,101,115,32,61,32,110,101,119,32,84,101,120,116,69,100,105,116,111,114,32,40,84,40,34,109,101,115,115,97,103, + 101,115,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115,45,62,115,101,116,82,101, + 97,100,79,110,108,121,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115, + 45,62,115,101,116,77,117,108,116,105,76,105,110,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,105,110,99,111,109,105,110,103, + 77,101,115,115,97,103,101,115,45,62,115,101,116,66,111,117,110,100,115,32,40,51,48,44,32,49,53,48,44,32,53,48,48,44,32,50,53,48,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,99,97,108,108,32,116,104,105,115,32,116,111,32,115,101,116,32,117,112,32,101,118,101,114,121, + 116,104,105,110,103,39,115,32,115,116,97,116,101,32,99,111,114,114,101,99,116,108,121,46,13,10,32,32,32,32,32,32,32,32,99,111,109,98,111,66, + 111,120,67,104,97,110,103,101,100,32,40,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,73,110,116,101,114,112,114,111,99,101, + 115,115,67,111,109,109,115,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,99,108,111,115,101,40,41,59,13,10, + 32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,115,101,114,118,101,114,59,13,10,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101, + 65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,98,117,116,116,111,110, + 67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32, + 32,105,102,32,40,98,117,116,116,111,110,32,61,61,32,115,101,110,100,66,117,116,116,111,110,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,47,47,32,84,104,101,32,115,101,110,100,32,98,117,116,116,111,110,32,104,97,115,32,98,101,101,110,32,112, + 114,101,115,115,101,100,44,32,115,111,32,119,114,105,116,101,32,111,117,116,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,101,120,116,32,98,111,120,32,116,111,32,116,104,101,32,115,111,99,107,101,116,32, + 111,114,32,112,105,112,101,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,119,104,105,99,104,32,105,115,32,97,99,116,105,118,101,46,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,83,116,114,105,110,103,32,116,101,120,116,32,40,115,101,110,100,84,101,120,116,45, + 62,103,101,116,84,101,120,116,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,77,101,109,111,114,121,66,108,111,99,107,32,109,101, + 115,115,97,103,101,68,97,116,97,32,40,40,99,111,110,115,116,32,99,104,97,114,42,41,32,116,101,120,116,44,32,116,101,120,116,46,108,101,110,103, + 116,104,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,97,99,116,105,118, + 101,67,111,110,110,101,99,116,105,111,110,115,46,115,105,122,101,40,41,59,32,45,45,105,32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,32,97,99,116,105,118,101,67,111,110,110, + 101,99,116,105,111,110,115,91,105,93,45,62,115,101,110,100,77,101,115,115,97,103,101,32,40,109,101,115,115,97,103,101,68,97,116,97,41,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47, + 47,32,116,104,101,32,119,114,105,116,101,32,102,97,105,108,101,100,44,32,115,111,32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,116,104,101, + 32,99,111,110,110,101,99,116,105,111,110,32,104,97,115,32,98,114,111,107,101,110,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,97,112,112,101,110,100,77,101,115,115,97,103,101,32,40,84,40,34,115,101,110,100,32,109,101,115,115,97,103,101,32,102,97,105, + 108,101,100,33,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,99,111,109,98,111,66,111, + 120,67,104,97,110,103,101,100,32,40,67,111,109,98,111,66,111,120,42,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32, + 84,104,105,115,32,105,115,32,99,97,108,108,101,100,32,119,104,101,110,32,116,104,101,32,117,115,101,114,32,112,105,99,107,115,32,97,32,100,105,102, + 102,101,114,101,110,116,32,109,111,100,101,32,102,114,111,109,32,116,104,101,32,100,114,111,112,45,100,111,119,110,32,108,105,115,116,46,46,13,10,32, + 32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,109,111,100,101,73,100,32,61,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62, + 103,101,116,83,101,108,101,99,116,101,100,73,100,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,99,108,111,115,101,40,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,105,102,32,40,109,111,100,101,73,100,32,60,32,56,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,111,112,101,110,32,40,40,109,111,100,101,73,100,32,38,32,50,41,32,33,61,32,48,44,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,40,109,111,100,101,73,100,32,38,32,52,41,32,33,61,32,48,41,59,13,10,32,32,32,32,32,32,32, + 32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,74,117,115,116,32,99,108,111,115,101,115,32,97,110, + 121,32,99,111,110,110,101,99,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,111,112,101,110,46,13,10, + 32,32,32,32,118,111,105,100,32,99,108,111,115,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,114,118,101,114,45, + 62,115,116,111,112,40,41,59,13,10,32,32,32,32,32,32,32,32,97,99,116,105,118,101,67,111,110,110,101,99,116,105,111,110,115,46,99,108,101,97, + 114,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,82,101,115,101,116,32,116,104,101,32,85,73,32,115,116,117,102,102,32,116,111, + 32,97,32,100,105,115,97,98,108,101,100,32,115,116,97,116,101,46,13,10,32,32,32,32,32,32,32,32,115,101,110,100,84,101,120,116,45,62,115,101, + 116,86,105,115,105,98,108,101,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,115,101,110,100,66,117,116,116,111,110,45,62,115, + 101,116,86,105,115,105,98,108,101,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,105,110,99,111,109,105,110,103,77,101,115,115, + 97,103,101,115,45,62,115,101,116,84,101,120,116,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,102,97,108,115,101,41,59,13,10,32, + 32,32,32,32,32,32,32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115,45,62,115,101,116,86,105,115,105,98,108,101,32,40,116,114,117, + 101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,112,112,101,110,100,77,101,115,115,97,103,101,32,40,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,34,84,111,32,100,101,109,111,110,115,116,114,97,116,101,32,110,97,109,101,100,32,112,105,112,101,115,44,32,121,111,117,39,108,108,32, + 110,101,101,100,32,116,111,32,114,117,110,32,116,119,111,32,105,110,115,116,97,110,99,101,115,32,111,102,32,116,104,101,32,74,117,99,101,68,101,109, + 111,32,97,112,112,108,105,99,97,116,105,111,110,32,111,110,32,116,104,105,115,32,109,97,99,104,105,110,101,46,32,79,110,32,34,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,34,111,110,101,32,111,102,32,116,104,101,109,44,32,115,101,108,101,99,116,32,92,34,110,97,109,101,100,32,112,105, + 112,101,32,40,108,105,115,116,101,110,105,110,103,41,92,34,44,32,97,110,100,32,116,104,101,110,32,111,110,32,116,104,101,32,111,116,104,101,114,44, + 32,115,101,108,101,99,116,32,92,34,110,97,109,101,100,32,112,105,112,101,32,40,99,111,110,110,101,99,116,32,116,111,32,101,120,105,115,116,105,110, + 103,32,112,105,112,101,41,92,34,46,32,84,104,101,110,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,121,111,117,32,34,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,34,115,101,110,100,32,102,114,111,109,32,116,104,101,32,39,115,101,110,100,101,114,39,32,97,112,112,32,115,104,111, + 117,108,100,32,97,112,112,101,97,114,32,111,110,32,116,104,101,32,108,105,115,116,101,110,101,114,32,97,112,112,46,32,84,104,101,32,92,34,112,105, + 112,101,32,110,97,109,101,92,34,32,102,105,101,108,100,32,108,101,116,115,32,121,111,117,32,99,104,111,111,115,101,32,97,32,110,97,109,101,32,102, + 111,114,32,116,104,101,32,112,105,112,101,92,110,92,110,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,84,111,32,100,101,109,111,110,115, + 116,114,97,116,101,32,115,111,99,107,101,116,115,44,32,121,111,117,32,99,97,110,32,101,105,116,104,101,114,32,114,117,110,32,116,119,111,32,105,110, + 115,116,97,110,99,101,115,32,111,102,32,116,104,101,32,97,112,112,32,111,110,32,116,104,101,32,115,97,109,101,32,109,97,99,104,105,110,101,44,32, + 111,114,32,111,110,32,100,105,102,102,101,114,101,110,116,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,109,97,99,104,105,110,101,115, + 32,111,110,32,121,111,117,114,32,110,101,116,119,111,114,107,46,32,73,110,32,101,97,99,104,32,111,110,101,32,101,110,116,101,114,32,97,32,115,111, + 99,107,101,116,32,110,117,109,98,101,114,44,32,116,104,101,110,32,111,110,32,111,110,101,32,111,102,32,116,104,101,32,97,112,112,115,44,32,115,101, + 108,101,99,116,32,116,104,101,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,92,34,83,111,99,107,101,116,32,40,108,105,115,116,101, + 110,105,110,103,41,92,34,32,109,111,100,101,46,32,79,110,32,116,104,101,32,111,116,104,101,114,44,32,101,110,116,101,114,32,116,104,101,32,104,111, + 115,116,32,97,100,100,114,101,115,115,32,111,102,32,116,104,101,32,108,105,115,116,101,110,105,110,103,32,97,112,112,44,32,97,110,100,32,115,101,108, + 101,99,116,32,92,34,83,111,99,107,101,116,32,40,99,111,110,110,101,99,116,32,116,111,32,101,120,105,115,116,105,110,103,32,115,111,99,107,101,116, + 41,92,34,46,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,77,101,115,115,97,103,101,115,32,115,104,111,117,108,100,32,116,104,101, + 110,32,98,101,32,98,101,32,115,101,110,116,32,98,101,116,119,101,101,110,32,116,104,101,32,97,112,112,115,32,105,110,32,116,104,101,32,115,97,109, + 101,32,119,97,121,32,97,115,32,116,104,114,111,117,103,104,32,116,104,101,32,110,97,109,101,100,32,112,105,112,101,115,46,34,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,111,112,101,110,32,40,98,111,111,108,32,97,115,83,111,99,107,101,116,44,32,98,111,111, + 108,32,97,115,83,101,110,100,101,114,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,99,108,111,115,101,40,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,47,47,32,77,97,107,101,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,98,105,116,115,32,111,102,32, + 85,73,32,118,105,115,105,98,108,101,46,46,13,10,32,32,32,32,32,32,32,32,115,101,110,100,84,101,120,116,45,62,115,101,116,86,105,115,105,98, + 108,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,115,101,110,100,66,117,116,116,111,110,45,62,115,101,116,86,105,115,105,98, + 108,101,32,40,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115,45,62, + 115,101,116,84,101,120,116,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32, + 32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115,45,62,115,101,116,86,105,115,105,98,108,101,32,40,116,114,117,101,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,47,47,32,97,110,100,32,116,114,121,32,116,111,32,111,112,101,110,32,116,104,101,32,115,111,99,107,101,116,32,111, + 114,32,112,105,112,101,46,46,46,13,10,32,32,32,32,32,32,32,32,98,111,111,108,32,111,112,101,110,101,100,79,107,32,61,32,102,97,108,115,101, + 59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,97,115,83,101,110,100,101,114,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,47,47,32,105,102,32,119,101,39,114,101,32,99,111,110,110,101,99,116,105,110,103,32,116,111,32,97,110,32, + 101,120,105,115,116,105,110,103,32,115,101,114,118,101,114,44,32,119,101,32,99,97,110,32,106,117,115,116,32,99,114,101,97,116,101,32,97,32,99,111, + 110,110,101,99,116,105,111,110,32,111,98,106,101,99,116,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,100,105,114,101,99,116,108,121, + 46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111, + 110,42,32,110,101,119,67,111,110,110,101,99,116,105,111,110,32,61,32,110,101,119,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67, + 111,110,110,101,99,116,105,111,110,32,40,42,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,97,115, + 83,111,99,107,101,116,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 111,112,101,110,101,100,79,107,32,61,32,110,101,119,67,111,110,110,101,99,116,105,111,110,45,62,99,111,110,110,101,99,116,84,111,83,111,99,107,101, + 116,32,40,115,111,99,107,101,116,72,111,115,116,45,62,103,101,116,84,101,120,116,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,115,111,99,107,101,116,78,117,109,98,101,114,45,62,103,101,116,84,101,120,116,40,41,46,103,101,116,73,110,116,86,97,108,117, + 101,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,49,48,48,48,41,59,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,112,101,110,101,100,79,107,32,61,32,110,101,119,67,111,110,110,101,99,116,105,111, + 110,45,62,99,111,110,110,101,99,116,84,111,80,105,112,101,32,40,112,105,112,101,78,97,109,101,45,62,103,101,116,84,101,120,116,40,41,41,59,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,111,112,101,110,101,100, + 79,107,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,99,116,105,118,101,67,111,110,110,101,99,116,105,111,110,115,46,97, + 100,100,32,40,110,101,119,67,111,110,110,101,99,116,105,111,110,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,110,101,119,67,111,110,110,101,99,116,105,111,110,59,13,10,32,32, + 32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,47,47,32,105,102,32,119,101,39,114,101,32,115,116,97,114,116,105,110,103,32,117,112,32,97,32,115,101,114,118,101,114,44,32, + 119,101,32,110,101,101,100,32,116,111,32,116,101,108,108,32,116,104,101,32,115,101,114,118,101,114,32,116,111,32,115,116,97,114,116,32,119,97,105,116, + 105,110,103,32,102,111,114,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,99,108,105,101,110,116,115,32,116,111,32,99,111,110,110,101, + 99,116,46,32,73,116,39,108,108,32,116,104,101,110,32,99,114,101,97,116,101,32,99,111,110,110,101,99,116,105,111,110,32,111,98,106,101,99,116,115, + 32,102,111,114,32,117,115,32,119,104,101,110,32,99,108,105,101,110,116,115,32,97,114,114,105,118,101,46,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,105,102,32,40,97,115,83,111,99,107,101,116,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,111,112,101,110,101,100,79,107,32,61,32,115,101,114,118,101,114,45,62,98,101,103,105,110,87,97,105,116,105,110,103,70, + 111,114,83,111,99,107,101,116,32,40,115,111,99,107,101,116,78,117,109,98,101,114,45,62,103,101,116,84,101,120,116,40,41,46,103,101,116,73,110,116, + 86,97,108,117,101,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,111,112,101,110,101,100,79, + 107,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,112,112,101,110,100,77,101,115,115,97,103,101,32,40,84, + 40,34,87,97,105,116,105,110,103,32,102,111,114,32,97,110,111,116,104,101,114,32,97,112,112,32,116,111,32,99,111,110,110,101,99,116,32,116,111,32, + 116,104,105,115,32,115,111,99,107,101,116,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,42,32,110,101,119,67,111,110,110,101,99, + 116,105,111,110,32,61,32,110,101,119,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,32,40,42, + 116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,112,101,110,101,100,79,107,32,61,32,110,101,119, + 67,111,110,110,101,99,116,105,111,110,45,62,99,114,101,97,116,101,80,105,112,101,32,40,112,105,112,101,78,97,109,101,45,62,103,101,116,84,101,120, + 116,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,111,112,101,110,101,100,79,107,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97, + 112,112,101,110,100,77,101,115,115,97,103,101,32,40,84,40,34,87,97,105,116,105,110,103,32,102,111,114,32,97,110,111,116,104,101,114,32,97,112,112, + 32,116,111,32,99,111,110,110,101,99,116,32,116,111,32,116,104,105,115,32,112,105,112,101,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,97,99,116,105,118,101,67,111,110,110,101,99,116,105,111,110,115,46,97,100,100,32,40,110,101,119,67,111, + 110,110,101,99,116,105,111,110,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,110,101,119,67,111,110,110,101,99,116,105,111,110,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10, + 13,10,32,32,32,32,32,32,32,32,105,102,32,40,33,32,111,112,101,110,101,100,79,107,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,109,111,100,101,83,101,108,101,99,116,111,114,45,62,115,101,116,83,101,108,101,99,116,101,100,73,100,32,40,56, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111,119,77,101,115,115,97, + 103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,87,97,114,110,105,110,103,73,99,111,110,44,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,73,110, + 116,101,114,112,114,111,99,101,115,115,32,67,111,109,109,115,32,68,101,109,111,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,70,97,105,108,101,100,32,116,111,32, + 111,112,101,110,32,116,104,101,32,115,111,99,107,101,116,32,111,114,32,112,105,112,101,46,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32, + 125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,97,112,112,101,110,100,77,101,115,115,97,103,101,32,40,99,111,110,115, + 116,32,83,116,114,105,110,103,38,32,109,101,115,115,97,103,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,110,99,111,109, + 105,110,103,77,101,115,115,97,103,101,115,45,62,115,101,116,67,97,114,101,116,80,111,115,105,116,105,111,110,32,40,73,78,84,95,77,65,88,41,59, + 13,10,32,32,32,32,32,32,32,32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115,45,62,105,110,115,101,114,116,84,101,120,116,65,116, + 67,117,114,115,111,114,32,40,109,101,115,115,97,103,101,32,43,32,84,40,34,92,110,34,41,41,59,13,10,32,32,32,32,32,32,32,32,105,110,99, + 111,109,105,110,103,77,101,115,115,97,103,101,115,45,62,115,101,116,67,97,114,101,116,80,111,115,105,116,105,111,110,32,40,73,78,84,95,77,65,88, + 41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,99,108,97,115,115,32,68,101,109,111,73,110,116,101,114,112,114, + 111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,32,32,58,32,112,117,98,108,105,99,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111, + 110,110,101,99,116,105,111,110,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,109, + 109,115,68,101,109,111,38,32,111,119,110,101,114,59,13,10,32,32,32,32,32,32,32,32,105,110,116,32,111,117,114,78,117,109,98,101,114,59,13,10, + 13,10,32,32,32,32,112,117,98,108,105,99,58,13,10,32,32,32,32,32,32,32,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67, + 111,110,110,101,99,116,105,111,110,32,40,73,110,116,101,114,112,114,111,99,101,115,115,67,111,109,109,115,68,101,109,111,38,32,111,119,110,101,114,95, + 41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,58,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,32, + 40,116,114,117,101,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,119,110,101,114,32,40,111,119,110,101,114,95,41,13,10,32, + 32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,116,97,116,105,99,32,105,110,116,32,116,111,116,97,108,67,111, + 110,110,101,99,116,105,111,110,115,32,61,32,48,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,111,117,114,78,117,109,98,101,114,32,61,32, + 43,43,116,111,116,97,108,67,111,110,110,101,99,116,105,111,110,115,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32, + 32,32,126,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,40,41,13,10,32,32,32,32,32,32,32, + 32,123,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,99,111,110,110,101,99,116,105,111,110, + 77,97,100,101,40,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,111,119,110,101,114,46,97,112,112, + 101,110,100,77,101,115,115,97,103,101,32,40,84,40,34,67,111,110,110,101,99,116,105,111,110,32,35,34,41,32,43,32,83,116,114,105,110,103,32,40, + 111,117,114,78,117,109,98,101,114,41,32,43,32,84,40,34,32,45,32,99,111,110,110,101,99,116,105,111,110,32,115,116,97,114,116,101,100,34,41,41, + 59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,99,111,110,110,101,99,116,105,111,110,76, + 111,115,116,40,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,111,119,110,101,114,46,97,112,112,101, + 110,100,77,101,115,115,97,103,101,32,40,84,40,34,67,111,110,110,101,99,116,105,111,110,32,35,34,41,32,43,32,83,116,114,105,110,103,32,40,111, + 117,114,78,117,109,98,101,114,41,32,43,32,84,40,34,32,45,32,99,111,110,110,101,99,116,105,111,110,32,108,111,115,116,34,41,41,59,13,10,32, + 32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,109,101,115,115,97,103,101,82,101,99,101,105,118,101,100, + 32,40,99,111,110,115,116,32,77,101,109,111,114,121,66,108,111,99,107,38,32,109,101,115,115,97,103,101,41,13,10,32,32,32,32,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,111,119,110,101,114,46,97,112,112,101,110,100,77,101,115,115,97,103,101,32,40,84,40,34,67,111, + 110,110,101,99,116,105,111,110,32,35,34,41,32,43,32,83,116,114,105,110,103,32,40,111,117,114,78,117,109,98,101,114,41,32,43,32,84,40,34,32, + 45,32,109,101,115,115,97,103,101,32,114,101,99,101,105,118,101,100,58,32,34,41,32,43,32,109,101,115,115,97,103,101,46,116,111,83,116,114,105,110, + 103,40,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,59,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,99,108, + 97,115,115,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,83,101,114,118,101,114,32,32,32,58, + 32,112,117,98,108,105,99,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,83,101,114,118,101,114,13,10,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,109,109,115,68,101,109,111,38,32,111,119,110,101, + 114,59,13,10,13,10,32,32,32,32,112,117,98,108,105,99,58,13,10,32,32,32,32,32,32,32,32,68,101,109,111,73,110,116,101,114,112,114,111,99, + 101,115,115,67,111,110,110,101,99,116,105,111,110,83,101,114,118,101,114,32,40,73,110,116,101,114,112,114,111,99,101,115,115,67,111,109,109,115,68,101, + 109,111,38,32,111,119,110,101,114,95,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,58,32,111,119,110,101,114,32,40,111,119,110,101,114,95, + 41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,126,68,101,109,111, + 73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,83,101,114,118,101,114,40,41,13,10,32,32,32,32,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110, + 101,99,116,105,111,110,42,32,99,114,101,97,116,101,67,111,110,110,101,99,116,105,111,110,79,98,106,101,99,116,40,41,13,10,32,32,32,32,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116, + 105,111,110,42,32,110,101,119,67,111,110,110,101,99,116,105,111,110,32,61,32,110,101,119,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115, + 115,67,111,110,110,101,99,116,105,111,110,32,40,111,119,110,101,114,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,111,119,110,101, + 114,46,97,99,116,105,118,101,67,111,110,110,101,99,116,105,111,110,115,46,97,100,100,32,40,110,101,119,67,111,110,110,101,99,116,105,111,110,41,59, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,67,111,110,110,101,99,116,105,111,110,59,13,10,32,32,32, + 32,32,32,32,32,125,13,10,32,32,32,32,125,59,13,10,13,10,32,32,32,32,79,119,110,101,100,65,114,114,97,121,32,60,68,101,109,111,73,110, + 116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,44,32,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,62,32,97, + 99,116,105,118,101,67,111,110,110,101,99,116,105,111,110,115,59,13,10,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,106,117,99,101,95,85,115, + 101,68,101,98,117,103,103,105,110,103,78,101,119,79,112,101,114,97,116,111,114,13,10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,67, + 111,109,98,111,66,111,120,42,32,109,111,100,101,83,101,108,101,99,116,111,114,59,13,10,32,32,32,32,84,101,120,116,69,100,105,116,111,114,42,32, + 115,101,110,100,84,101,120,116,59,13,10,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,115,101,110,100,66,117,116,116,111,110,59,13,10, + 32,32,32,32,84,101,120,116,69,100,105,116,111,114,42,32,105,110,99,111,109,105,110,103,77,101,115,115,97,103,101,115,59,13,10,13,10,32,32,32, + 32,84,101,120,116,69,100,105,116,111,114,42,32,112,105,112,101,78,97,109,101,59,13,10,32,32,32,32,84,101,120,116,69,100,105,116,111,114,42,32, + 115,111,99,107,101,116,78,117,109,98,101,114,59,13,10,32,32,32,32,84,101,120,116,69,100,105,116,111,114,42,32,115,111,99,107,101,116,72,111,115, + 116,59,13,10,13,10,32,32,32,32,68,101,109,111,73,110,116,101,114,112,114,111,99,101,115,115,67,111,110,110,101,99,116,105,111,110,83,101,114,118, + 101,114,42,32,115,101,114,118,101,114,59,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101, + 73,110,116,101,114,112,114,111,99,101,115,115,67,111,109,109,115,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110, + 101,119,32,73,110,116,101,114,112,114,111,99,101,115,115,67,111,109,109,115,68,101,109,111,40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::interprocesscommsdemo_cpp = (const char*) temp7; + +static const unsigned char temp8[] = {137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,140,0,0,0,86,8,6,0,0,0,29,101,126,119,0,0,0,9,112,72,89, + 115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,4,103,65,77,65,0,0,177,142,124,251,81,147,0,0,0,32,99,72,82,77,0,0, + 122,37,0,0,128,131,0,0,249,255,0,0,128,233,0,0,117,48,0,0,234,96,0,0,58,152,0,0,23,111,146,95,197,70,0,0,59,48,73,68, + 65,84,120,218,98,100,160,30,96,68,195,76,72,24,89,140,17,77,223,63,32,254,143,70,255,67,226,195,212,12,58,160,163,163,192,112,252,248,20,6, + 38,38,102,134,55,111,62,50,240,240,112,50,176,178,178,48,252,249,243,7,136,255,49,48,2,125,202,206,206,6,246,198,143,31,191,24,254,3,125,35, + 38,38,204,240,244,233,75,6,102,102,38,134,159,63,127,51,60,124,248,146,129,139,139,157,97,235,214,19,12,143,30,189,98,48,53,85,103,200,204,156, + 128,213,190,89,179,138,24,230,205,219,193,16,23,231,6,182,251,247,239,191,12,2,2,60,12,191,126,253,102,48,48,80,97,248,242,229,59,208,158,159, + 12,188,188,220,96,243,65,118,130,0,19,19,35,3,27,27,43,208,77,127,25,62,124,248,204,32,44,204,15,118,203,185,115,183,24,56,57,217,193,248, + 196,137,171,12,147,39,111,96,40,43,139,96,72,75,235,133,235,69,7,0,1,196,66,165,132,2,75,8,204,72,152,9,137,141,45,65,49,64,19,4, + 58,254,11,197,127,160,9,229,47,84,253,255,193,154,112,70,18,0,8,32,22,10,18,9,3,82,9,194,12,53,11,134,33,137,132,145,145,153,135,139, + 139,131,135,137,129,79,130,157,89,76,137,147,133,239,195,31,166,223,172,204,76,204,223,127,253,248,7,148,254,247,135,145,241,247,163,207,95,223,255,98, + 102,251,244,241,231,207,47,63,126,254,250,5,53,31,148,80,126,67,19,14,114,226,249,135,148,184,70,1,157,1,64,0,177,80,80,162,48,33,37,16, + 54,36,54,147,58,31,187,132,190,176,128,150,40,195,31,25,35,17,110,77,101,182,223,42,66,172,255,20,152,153,126,113,178,75,112,252,102,98,97,96, + 249,245,150,241,223,159,95,255,254,254,253,199,244,251,219,23,158,119,31,24,217,95,221,254,202,117,235,236,135,159,87,175,252,102,60,127,237,237,167,103, + 223,127,255,253,137,84,218,252,134,98,228,210,103,52,209,208,25,0,4,16,11,137,9,133,17,169,186,97,5,98,118,104,98,97,226,224,226,226,209,226, + 100,81,12,22,102,117,52,227,254,229,166,166,240,95,147,75,150,139,157,149,7,168,64,138,143,129,153,135,141,129,137,157,153,129,153,139,133,129,145,153, + 145,225,239,247,191,12,255,254,254,99,248,247,243,47,195,159,15,191,36,255,190,255,161,109,242,138,193,209,255,41,243,159,167,175,254,61,188,41,37,113, + 250,228,95,174,131,203,110,63,62,249,229,231,175,55,64,181,32,123,126,65,49,35,82,105,51,154,112,232,8,0,2,136,133,196,82,133,25,169,68,1, + 37,22,14,102,96,43,207,94,90,66,39,77,150,63,90,155,227,131,163,160,224,55,17,97,123,25,6,118,5,30,6,70,78,86,104,139,4,24,159,255, + 128,248,47,144,243,23,88,56,252,254,207,192,12,52,129,25,212,42,4,38,36,118,9,110,80,203,12,28,239,255,127,252,101,17,123,246,69,89,245,234, + 71,101,187,187,31,195,35,4,101,206,46,121,243,103,225,154,59,207,246,125,248,241,235,27,52,193,124,135,210,191,209,26,206,163,128,198,0,32,128,136, + 73,48,200,13,90,88,66,1,151,44,138,226,226,146,9,50,66,193,190,252,31,35,100,245,222,74,243,26,9,51,176,137,202,48,48,130,34,31,216,90, + 103,120,253,17,90,123,252,7,165,14,160,14,94,6,6,110,49,96,146,99,135,152,252,27,24,255,191,190,48,48,124,254,4,140,114,160,58,22,62,6, + 70,22,38,6,14,121,126,6,14,21,1,6,190,247,223,24,249,206,189,51,41,59,249,85,219,138,85,116,235,212,231,223,231,157,125,241,238,38,212,45, + 63,160,9,231,55,82,21,197,48,154,112,104,11,0,2,136,133,200,146,133,5,90,5,113,2,49,23,63,63,63,119,172,170,180,71,24,251,151,4,5, + 241,215,58,226,126,226,12,108,192,72,102,248,241,15,92,122,48,124,127,3,140,82,160,114,41,29,160,106,41,96,41,34,15,212,41,7,76,48,146,192, + 4,194,198,240,255,205,107,160,90,96,98,145,6,38,30,30,110,6,70,182,175,12,12,183,22,51,48,60,61,4,180,13,152,168,190,255,1,39,7,54, + 96,119,79,196,89,154,65,64,239,59,39,255,158,231,33,58,87,24,172,151,243,139,77,157,245,240,253,134,175,63,126,195,170,198,239,80,119,254,129,86, + 83,116,3,90,90,10,12,255,128,37,39,184,112,28,33,0,32,128,88,8,148,44,76,72,85,16,40,177,112,178,178,177,113,149,104,43,36,68,178,63, + 43,16,117,227,97,225,53,82,97,96,4,69,211,7,104,124,253,1,70,190,146,7,3,131,124,48,195,255,23,192,4,116,15,88,32,252,249,195,240,255, + 246,78,6,134,199,64,246,219,151,12,255,63,188,4,138,1,227,153,79,132,129,129,87,152,129,81,223,137,129,41,174,10,82,56,60,61,2,76,154,60, + 208,18,8,168,255,215,63,96,193,195,193,32,22,169,194,192,113,246,149,100,230,182,23,77,50,236,34,178,181,55,223,206,248,246,243,23,44,65,35,131, + 191,244,42,101,242,243,131,193,99,27,44,44,44,35,38,193,0,4,16,11,129,6,46,72,158,3,86,178,136,10,9,10,149,42,11,39,4,138,60,73, + 148,13,145,100,97,147,1,150,42,159,127,67,218,39,160,56,250,11,76,4,134,165,64,182,37,195,191,169,93,12,255,15,111,0,202,1,171,37,198,255, + 144,10,3,220,10,2,22,12,160,0,102,7,26,255,245,57,3,195,167,39,12,255,175,93,96,248,247,250,57,3,83,94,50,3,195,51,96,130,249,15, + 29,114,249,243,13,82,85,129,74,46,160,62,62,19,80,149,199,201,20,188,252,65,58,219,127,33,158,170,59,239,39,124,254,254,243,3,90,87,255,63, + 189,218,52,223,190,253,28,113,85,18,64,0,177,224,72,44,176,198,45,59,44,177,136,9,241,11,53,107,201,20,120,138,60,137,146,142,87,96,96,226, + 2,166,163,143,191,160,73,11,72,252,250,12,172,98,172,24,254,179,0,19,75,158,31,3,195,155,59,12,12,130,64,53,140,220,144,4,192,200,136,105, + 19,27,11,68,156,253,55,195,255,203,59,128,49,144,199,192,32,160,12,108,251,92,1,138,241,49,48,200,58,48,48,136,153,1,93,2,44,224,94,28, + 7,150,80,251,25,56,36,88,25,164,146,85,24,252,22,221,143,254,253,95,248,87,221,189,247,83,191,124,251,142,62,248,55,218,237,166,17,0,8,32, + 38,60,189,33,88,53,196,205,203,203,45,80,161,44,150,234,204,254,40,82,60,88,134,129,137,19,152,16,190,253,65,77,4,255,129,241,195,175,192,192, + 112,227,2,48,177,220,5,70,52,176,45,194,8,77,143,216,18,11,92,223,127,136,181,255,25,33,205,215,255,64,66,64,150,129,193,102,6,208,230,88, + 96,41,245,138,225,255,238,251,12,255,185,162,24,24,236,129,98,127,249,129,53,214,47,6,241,112,89,6,95,137,111,177,69,178,124,49,192,210,7,152, + 42,25,120,160,238,101,67,234,250,51,210,42,224,128,205,56,6,54,96,130,255,63,194,146,36,64,0,177,224,40,93,88,161,85,17,15,19,11,11,119, + 153,186,116,156,47,223,171,100,153,24,25,70,54,49,96,188,124,3,54,19,254,1,91,165,127,128,152,137,25,146,153,255,1,171,143,47,207,128,9,197, + 6,168,147,3,210,149,38,182,199,254,15,168,159,157,139,225,63,211,79,6,70,94,25,6,6,245,2,134,255,139,150,50,252,91,213,3,52,255,55,164, + 156,88,197,205,192,20,211,194,192,232,63,143,129,225,88,38,3,187,200,11,6,133,20,5,150,132,149,79,50,31,255,19,123,62,255,246,243,237,12,152, + 243,80,52,27,17,238,237,205,97,208,212,148,103,248,253,251,15,120,46,102,164,0,128,0,98,193,147,88,64,185,150,35,68,73,194,201,159,227,117,146, + 84,144,4,19,187,172,0,48,81,0,235,237,63,192,174,176,152,46,176,202,240,4,170,146,135,36,150,251,235,192,189,28,70,147,16,6,70,73,29,134, + 255,207,207,1,147,27,23,180,125,67,160,31,246,239,47,3,35,23,23,48,177,0,19,163,92,37,195,255,249,115,24,254,173,104,103,96,16,226,2,13, + 9,66,27,192,191,25,254,77,47,100,96,124,255,26,216,64,238,101,96,56,152,192,192,2,116,142,180,175,4,123,214,179,39,37,143,165,4,222,237,121, + 246,225,40,3,98,46,138,198,137,102,100,78,107,1,4,16,19,150,4,3,42,210,185,64,197,187,190,140,152,122,150,48,115,150,140,13,23,15,151,134, + 16,48,177,0,115,251,79,96,91,69,209,157,129,65,165,137,225,223,241,79,12,255,102,0,75,130,13,192,106,72,22,216,203,49,169,6,182,107,142,48, + 48,166,86,2,195,147,25,220,59,34,10,0,115,41,131,28,176,237,34,105,204,240,127,239,65,134,127,203,58,161,237,31,102,72,149,5,194,172,192,116, + 44,192,201,240,127,69,27,195,255,237,251,25,24,76,27,129,13,230,79,12,108,178,188,12,138,86,92,162,133,82,156,105,124,156,236,18,48,183,35,85, + 77,84,175,150,216,217,89,25,20,20,196,193,165,203,72,3,0,1,196,132,165,116,97,7,7,58,19,19,79,12,247,255,64,21,217,207,42,2,118,192, + 106,226,43,48,211,254,124,207,192,32,101,196,240,95,36,150,225,95,77,18,195,255,137,192,170,99,239,60,134,255,11,107,25,254,101,185,48,252,191,5, + 212,42,99,207,192,104,164,206,192,232,16,6,140,208,239,68,68,215,127,112,19,149,81,223,158,129,225,253,51,134,127,139,90,129,46,248,15,25,199,65, + 46,24,64,137,6,212,195,18,224,96,248,55,179,24,216,77,7,230,112,195,92,160,29,239,24,248,109,36,25,84,133,191,153,186,138,240,152,193,186,255, + 12,136,249,45,170,183,101,108,109,117,25,156,157,45,192,203,9,70,26,0,8,32,38,36,26,185,161,203,105,38,204,167,225,40,198,226,33,236,34,6, + 108,187,2,165,126,3,219,43,124,192,12,172,10,76,36,125,13,12,255,175,3,123,45,226,192,42,132,31,216,184,21,229,97,248,255,229,33,195,191,150, + 56,134,127,135,111,49,48,240,170,50,48,70,151,48,48,8,11,3,245,253,196,223,232,5,149,66,108,192,210,68,207,142,225,223,166,89,12,12,207,129, + 13,102,78,104,207,10,75,218,2,39,36,150,191,12,255,250,243,129,250,156,24,24,68,12,25,88,184,255,50,136,90,8,49,68,11,50,70,137,241,241, + 136,34,37,26,86,90,148,50,30,30,230,12,191,126,125,3,175,51,25,105,0,32,128,152,144,122,70,136,210,5,72,251,10,176,122,41,104,51,8,115, + 40,10,66,70,94,65,3,114,250,69,12,255,246,159,102,248,127,122,11,48,162,184,161,173,131,255,16,154,7,216,13,230,252,203,240,191,63,135,225,255, + 242,201,12,140,42,250,192,68,3,172,162,190,253,6,183,81,112,130,31,63,24,24,21,13,129,145,207,198,240,127,7,176,65,203,197,70,184,87,5,74, + 80,175,238,51,252,219,186,26,152,128,129,189,167,47,63,24,4,204,69,25,76,181,152,116,2,196,184,29,145,134,3,216,105,81,202,128,26,185,255,255, + 143,204,30,59,64,0,161,207,19,129,90,152,172,186,194,124,170,206,18,140,118,124,230,66,144,17,141,31,159,128,173,75,75,96,196,235,48,48,44,239, + 2,150,32,160,72,69,235,145,131,186,213,172,64,113,54,70,134,127,211,202,24,254,111,158,201,192,20,146,207,192,104,237,205,192,240,249,27,246,68,0, + 18,2,117,165,173,128,141,231,179,187,24,24,94,60,134,152,65,40,50,64,242,92,64,251,79,108,6,38,5,57,160,171,129,133,10,11,35,131,152,147, + 8,147,63,239,55,15,17,14,86,113,104,98,225,128,102,4,170,37,24,97,97,190,17,89,178,192,0,64,0,33,15,255,195,74,24,78,123,94,54,11, + 69,69,22,73,86,41,96,149,3,90,170,199,2,84,162,153,1,108,220,46,102,248,255,234,17,48,26,216,113,84,25,255,33,114,192,200,252,55,173,156, + 225,255,165,195,12,76,249,83,24,24,37,20,128,37,205,87,204,68,3,170,142,4,128,85,158,186,62,195,255,125,171,33,19,148,196,2,96,194,250,255, + 226,26,195,255,71,192,68,198,13,44,5,191,253,98,96,1,186,87,85,146,89,83,157,141,73,141,1,177,244,130,21,234,63,138,99,89,80,144,135,97, + 193,130,10,6,62,62,174,17,91,194,0,4,16,19,218,168,46,7,31,7,7,176,217,194,102,206,165,12,12,103,102,160,240,175,143,224,17,215,255,31, + 248,24,254,111,155,14,108,199,176,224,47,1,64,221,104,208,56,204,143,143,12,255,38,229,0,35,83,0,216,107,106,3,38,142,255,144,82,8,150,176, + 64,209,247,21,88,29,153,186,2,35,251,35,195,255,59,231,129,250,56,137,119,57,168,132,251,7,44,158,126,124,129,118,205,255,49,48,177,50,51,240, + 136,179,178,121,72,241,25,1,5,57,145,74,24,170,12,228,153,152,168,51,168,171,203,128,215,226,142,84,0,16,64,76,72,237,23,240,210,5,101,110, + 118,25,57,222,255,42,236,114,188,144,238,46,104,88,94,41,138,225,255,198,249,192,46,243,107,160,10,14,194,163,26,160,68,195,3,44,157,110,93,1, + 246,164,114,129,61,166,96,6,70,39,96,91,227,227,87,200,186,23,208,92,18,168,199,195,196,204,192,104,235,203,240,255,216,14,200,200,9,177,211,190, + 224,169,8,96,15,69,72,5,216,107,3,54,196,191,189,134,183,109,5,244,5,24,116,4,88,13,57,217,217,249,145,74,25,88,9,67,81,130,81,86, + 150,2,207,31,49,50,142,220,42,9,32,128,152,208,186,211,108,214,50,162,26,130,252,127,248,89,69,56,33,75,16,68,13,128,61,32,96,233,114,112, + 5,48,17,176,146,22,230,252,92,12,255,118,47,97,248,183,115,49,3,83,124,21,3,179,148,28,3,179,0,176,113,44,46,193,240,143,23,72,91,184, + 49,48,74,43,50,48,221,60,2,44,137,136,72,136,32,187,65,137,234,55,176,154,252,242,159,129,209,47,3,216,131,123,0,100,191,1,138,131,74,195, + 63,12,156,138,252,12,138,66,127,228,204,101,196,229,25,80,151,143,82,212,91,146,145,17,101,72,76,244,24,145,93,105,100,0,16,64,24,171,232,228, + 153,254,40,242,74,178,48,48,129,86,203,253,249,13,78,48,12,55,46,51,48,188,121,6,84,193,206,64,210,228,9,176,4,249,207,193,198,240,111,58, + 176,11,252,249,37,195,67,159,28,134,162,83,239,24,12,215,61,98,16,93,246,152,65,115,213,117,134,234,186,122,134,39,160,201,104,113,113,134,255,184, + 74,24,80,35,19,132,65,83,17,239,128,13,240,111,76,12,76,105,61,12,76,46,192,154,231,194,36,160,102,46,72,159,27,52,29,193,193,204,32,40, + 194,204,41,201,193,42,5,205,8,172,212,232,94,255,253,251,15,88,186,252,26,209,165,11,8,0,4,16,11,82,131,151,149,133,141,157,75,136,233,143, + 40,155,40,43,98,132,21,216,3,249,127,249,20,98,86,154,148,4,3,82,11,76,100,44,108,204,12,87,167,214,50,68,157,254,201,112,233,198,55,184, + 244,199,123,15,24,218,128,120,181,0,59,195,2,55,25,6,43,126,126,134,63,239,63,0,173,129,218,13,234,142,131,150,117,254,6,141,48,3,53,136, + 74,48,48,26,88,50,48,121,69,3,171,73,96,252,31,205,132,148,54,156,66,208,210,9,226,54,14,118,70,22,177,255,191,164,144,252,198,204,128,186, + 71,138,164,22,171,142,142,34,3,43,176,125,244,23,228,22,6,150,17,157,96,0,2,136,5,169,132,97,21,226,229,225,230,103,102,228,7,151,46,255, + 161,93,101,240,114,107,38,72,247,26,148,203,97,99,47,132,27,26,160,21,186,12,255,129,237,149,247,252,98,12,89,155,47,48,92,122,250,21,171,202, + 219,31,126,50,228,28,124,206,176,219,67,156,129,239,215,15,240,216,13,35,43,208,78,80,181,197,39,204,192,32,167,206,192,104,236,196,192,232,24,201, + 192,40,10,76,7,223,143,3,75,61,96,21,41,1,44,253,64,203,97,222,223,3,186,9,180,206,134,7,156,168,57,68,216,24,164,25,255,74,48,113, + 112,112,254,251,241,227,51,165,85,18,104,115,217,203,151,239,193,139,165,70,58,0,8,32,22,164,110,53,51,31,7,59,23,31,203,31,94,54,208,36, + 32,168,87,3,154,203,121,115,137,129,209,45,144,225,255,110,96,163,247,45,48,114,184,217,32,189,39,144,28,56,248,255,65,26,185,176,68,4,79,76, + 255,193,187,2,152,57,217,25,118,63,254,204,112,8,71,98,129,129,243,47,191,49,172,122,202,202,144,105,23,196,240,91,92,133,129,73,89,139,129,145, + 31,152,88,152,217,24,24,5,128,165,220,47,96,17,115,249,24,144,254,4,196,192,4,245,93,153,225,191,128,41,3,147,148,40,3,131,42,80,238,218, + 20,6,134,15,192,46,54,151,16,48,229,51,51,40,113,51,72,137,11,240,241,62,127,241,227,45,3,98,67,29,89,9,6,212,43,2,85,73,163,128, + 129,1,32,128,88,144,138,106,230,255,255,255,51,179,241,48,49,177,10,177,65,218,3,108,192,132,243,112,47,3,163,149,43,3,83,235,6,134,255,75, + 187,25,254,63,185,2,236,14,191,7,134,226,23,200,178,4,80,187,131,157,5,210,155,98,99,101,96,100,231,102,248,15,234,93,49,178,51,252,231,6, + 150,16,242,10,12,219,182,93,33,202,49,135,88,101,25,50,67,114,129,118,0,27,178,15,174,49,252,59,119,128,129,225,245,19,6,198,223,63,25,254, + 127,7,54,54,191,1,219,47,44,144,46,249,127,112,175,138,133,225,47,176,219,206,96,31,201,192,20,94,199,192,120,165,14,232,238,207,12,140,192,42, + 144,129,249,31,200,15,172,12,168,59,49,241,86,73,220,192,134,247,215,175,63,70,83,5,30,0,16,64,200,221,77,38,54,38,70,86,102,22,96,75, + 149,25,22,166,76,144,241,142,147,192,200,208,78,102,96,108,234,100,248,255,238,51,164,1,252,230,45,164,20,226,3,182,31,68,36,64,43,182,193,51, + 202,140,192,72,252,15,140,216,255,64,189,140,28,60,12,255,217,217,25,62,95,200,99,96,56,123,159,160,99,222,92,63,203,240,191,55,158,225,207,157, + 251,12,140,224,113,21,144,11,129,13,103,112,239,8,24,231,124,156,136,248,6,181,167,64,37,27,104,156,104,213,100,134,255,34,114,12,140,150,1,192, + 174,252,44,96,161,196,194,240,129,225,247,215,47,191,126,255,37,118,12,70,65,65,130,97,225,194,10,6,103,231,226,209,170,7,15,0,8,32,22,164, + 65,250,255,34,172,76,188,220,191,127,112,253,7,70,6,35,100,52,12,148,140,32,244,153,118,96,162,152,196,192,168,234,207,192,96,148,10,140,6,121, + 134,255,79,239,50,48,220,187,8,44,13,174,67,22,119,63,186,206,240,255,213,83,134,255,63,190,3,75,128,191,12,127,64,123,144,120,217,24,100,158, + 61,33,202,49,226,156,140,12,191,129,250,254,113,115,65,218,75,56,219,166,140,136,222,19,104,92,136,27,216,40,126,114,13,200,118,3,175,31,254,7, + 76,200,140,191,126,48,51,254,253,131,126,24,0,214,177,24,49,49,1,134,141,27,155,25,68,69,5,71,19,11,1,0,16,64,40,11,168,190,254,103, + 252,245,243,15,243,223,127,191,129,109,15,14,88,33,3,12,223,31,239,33,221,107,45,96,175,228,45,7,195,255,233,211,25,254,159,223,193,240,255,205, + 99,200,158,34,216,234,58,164,188,12,42,21,64,109,230,63,124,252,12,142,226,124,12,147,136,232,97,57,203,242,50,252,248,14,108,159,0,75,142,255, + 196,110,221,128,141,30,203,169,50,64,214,73,252,101,248,245,238,47,168,243,244,255,47,68,14,57,145,96,36,22,121,121,113,134,29,59,186,24,20,21, + 37,192,167,39,140,2,252,0,32,128,144,19,12,211,227,247,31,63,189,20,227,126,255,231,253,47,65,102,65,96,241,15,202,160,160,53,48,226,38,12, + 12,6,221,12,255,22,207,102,248,191,121,26,176,13,243,22,50,249,7,154,40,4,173,170,99,68,138,15,120,227,23,50,226,251,27,152,248,76,133,89, + 25,34,53,133,24,150,95,123,139,211,33,118,146,156,12,14,18,236,12,63,222,190,102,224,98,36,161,117,10,181,143,81,76,22,152,176,95,128,221,242, + 231,235,31,96,149,196,242,229,199,239,63,255,208,218,44,40,41,86,86,86,140,97,215,174,110,6,53,53,25,134,215,175,63,142,232,73,69,98,1,64, + 0,177,32,5,228,255,215,31,191,124,127,243,139,227,227,95,208,110,0,112,23,26,88,212,179,113,51,48,232,86,51,252,155,221,195,240,127,229,36,6, + 6,33,96,195,66,152,23,181,123,13,143,134,255,104,227,109,192,138,13,88,197,176,124,249,194,80,162,193,195,240,230,63,15,195,238,123,47,129,137,16, + 181,97,105,98,106,198,208,98,38,196,192,113,247,16,176,128,98,34,45,226,254,2,75,36,94,81,6,70,69,13,96,47,233,8,3,168,225,243,231,235, + 23,134,215,63,255,124,248,251,235,215,31,44,245,26,152,47,41,41,196,176,115,103,55,131,146,146,52,195,167,79,95,25,24,71,211,10,81,0,32,128, + 152,24,16,107,94,65,253,227,191,47,152,121,94,254,249,249,31,210,251,1,173,129,145,182,6,246,90,62,48,252,223,58,25,88,217,115,65,218,12,200, + 221,104,60,173,12,80,188,179,2,99,226,223,251,55,12,194,192,58,102,202,148,73,12,253,254,38,12,94,242,220,12,150,210,60,12,110,10,124,12,157, + 230,194,12,11,188,213,25,228,99,75,129,213,144,0,3,235,159,159,144,132,70,172,15,126,0,19,181,146,62,48,17,179,51,48,188,187,10,238,157,125, + 123,247,155,225,29,3,203,103,6,212,61,74,240,181,189,114,114,226,12,123,247,246,49,104,106,202,50,124,251,246,125,196,143,222,146,2,0,2,176,114, + 245,42,17,196,64,120,50,73,60,214,221,205,33,200,117,250,26,130,149,173,141,118,190,193,21,247,22,182,231,139,248,8,87,249,28,214,119,219,184,90, + 136,39,194,178,183,201,248,101,179,224,54,130,11,22,97,32,132,252,205,144,249,230,99,38,241,133,241,163,22,170,214,214,95,187,15,114,61,219,138,174, + 226,28,192,118,155,74,96,99,154,67,248,27,73,26,117,192,210,7,57,52,107,60,201,213,29,249,247,87,186,221,63,211,245,197,41,125,122,166,66,11, + 205,96,32,135,167,71,226,124,78,217,242,158,204,195,10,6,211,66,239,246,119,208,43,244,195,60,99,139,234,242,6,110,18,161,123,243,70,190,203,105, + 255,210,180,213,65,215,35,131,241,24,234,181,214,178,88,156,200,102,179,134,27,58,27,94,22,53,120,54,153,92,50,18,134,187,96,214,170,40,50,118, + 46,83,198,88,213,117,29,130,188,132,173,172,61,146,200,92,91,107,4,238,57,164,165,228,95,178,35,18,44,4,200,199,180,81,26,163,85,89,230,218, + 185,99,28,139,99,25,140,74,227,20,214,183,18,153,106,31,63,88,97,14,144,146,184,165,105,27,249,22,64,44,12,136,131,122,192,248,232,227,103,15, + 159,242,51,127,21,121,253,157,155,149,157,9,178,157,4,212,86,97,98,32,121,161,60,35,176,136,97,254,254,157,129,77,70,133,129,211,59,138,225,223, + 220,42,134,239,160,29,40,172,140,12,2,108,144,54,14,51,11,43,3,187,172,36,3,211,190,5,12,12,170,189,12,172,197,64,188,8,216,141,23,230, + 135,110,97,193,2,128,61,153,191,159,190,48,48,124,255,6,158,46,96,176,112,98,96,120,212,5,172,62,153,25,126,60,252,194,240,244,11,199,235,43, + 239,62,191,128,249,13,88,162,48,197,197,185,114,185,185,153,50,105,107,43,114,8,9,9,1,195,23,114,180,23,35,120,30,130,233,63,43,235,119,80, + 59,6,182,185,31,47,0,245,164,128,181,29,19,63,63,55,208,44,62,150,23,47,222,242,156,63,127,71,233,235,215,31,18,63,127,254,18,252,249,243, + 183,0,208,2,112,243,159,153,153,233,15,59,59,235,91,14,14,246,247,124,124,220,207,140,141,85,239,139,136,240,255,4,170,253,249,237,219,143,159,160, + 200,38,167,128,3,37,2,144,59,128,102,51,11,8,112,115,112,114,114,49,61,123,246,88,232,226,197,59,234,223,190,253,20,253,241,227,151,40,80,30, + 214,117,1,29,89,246,137,147,147,253,13,55,55,251,43,11,11,237,155,192,140,243,21,216,59,252,243,253,251,207,31,255,192,41,159,56,71,0,4,16, + 114,130,1,159,130,240,224,231,239,215,247,190,242,61,82,191,245,94,147,213,68,144,129,225,205,101,96,163,215,154,129,129,147,7,50,183,131,43,18,113, + 213,121,95,254,48,176,199,37,51,236,60,113,146,225,192,166,195,12,44,156,28,64,11,191,65,124,1,244,52,51,180,41,164,199,203,197,16,180,162,139, + 129,181,110,41,195,57,183,92,134,117,179,39,49,176,114,112,161,164,127,240,142,123,160,223,100,121,89,25,162,164,248,24,184,223,1,27,228,118,1,12, + 140,124,192,68,253,234,12,176,11,207,195,240,237,238,99,134,91,63,152,30,188,248,244,245,19,200,95,192,92,247,215,203,203,156,239,217,179,183,145,19, + 38,172,149,102,103,103,249,13,140,76,70,164,128,255,15,12,52,246,152,24,151,35,42,42,50,43,112,37,24,72,9,244,31,116,30,29,179,181,181,54, + 251,207,159,63,133,118,236,56,173,177,111,223,57,247,107,215,30,152,0,19,140,44,48,199,10,1,149,242,162,117,38,96,59,49,223,3,19,205,59,51, + 51,141,251,250,250,74,7,34,34,156,118,169,168,72,61,83,82,146,122,255,242,229,251,63,164,148,57,80,149,76,202,202,82,108,194,194,252,194,91,182, + 28,215,171,173,157,239,125,229,202,3,147,203,151,239,129,230,208,132,25,32,107,129,144,251,154,160,56,254,4,244,239,123,43,43,173,39,42,42,210,71, + 226,227,61,182,233,233,41,221,253,253,251,207,59,160,245,191,129,238,255,15,74,59,248,18,48,64,0,193,18,12,252,132,167,47,255,24,62,159,252,203, + 115,199,249,213,87,77,96,140,1,219,5,55,24,24,149,128,246,170,152,49,48,220,216,199,192,192,205,67,92,41,6,178,21,88,186,48,73,43,51,48, + 57,6,50,236,204,201,100,152,114,21,20,135,159,176,42,143,209,18,98,8,22,5,182,153,166,150,49,156,85,242,98,104,187,8,106,130,124,198,170,214, + 66,146,155,33,72,82,152,129,135,95,136,225,191,127,10,3,195,227,141,96,231,255,251,246,143,225,253,195,191,127,119,188,248,118,9,216,221,6,181,172, + 127,113,115,115,252,5,118,157,57,167,77,219,232,245,248,241,43,19,92,206,85,86,150,6,150,68,18,171,176,141,4,131,138,114,96,143,138,81,94,94, + 130,19,88,245,240,239,218,117,198,177,167,103,101,200,237,219,79,220,128,129,204,77,112,82,13,50,1,42,246,227,199,79,177,67,135,46,106,0,177,231, + 188,121,219,243,156,156,12,87,149,150,70,172,85,87,151,185,46,37,37,242,25,88,50,252,198,55,14,4,58,4,17,88,162,129,26,236,108,170,170,210, + 252,23,46,220,53,8,9,105,204,184,114,229,190,59,48,210,9,185,3,148,55,5,129,9,67,240,232,209,171,74,64,108,183,114,229,129,116,59,59,189, + 77,85,85,49,11,61,61,205,175,8,11,243,125,126,247,238,211,175,127,120,154,29,0,1,196,194,128,122,28,216,47,96,15,230,231,209,87,111,111,62, + 187,205,224,36,252,237,55,55,195,127,208,2,240,135,12,76,206,17,12,255,46,2,19,12,215,127,226,166,100,64,99,32,192,210,229,95,114,22,100,228, + 247,206,5,252,161,10,234,130,243,240,48,48,190,188,201,240,247,238,107,252,165,22,208,236,63,159,191,50,252,11,44,100,96,18,3,58,251,208,6,96, + 190,22,98,248,117,245,3,195,229,167,127,31,28,255,252,235,46,212,95,191,128,57,234,47,40,194,89,88,152,240,142,200,1,171,8,166,23,47,222,193, + 166,18,224,39,64,128,78,198,116,118,54,102,1,150,64,60,192,8,82,203,204,236,207,62,120,240,98,24,52,7,147,13,128,246,73,111,222,124,188,16, + 152,248,130,83,82,188,167,53,55,39,46,251,240,225,203,251,53,107,14,126,193,217,33,252,251,143,177,169,41,129,83,92,92,80,180,172,108,86,210,210, + 165,123,178,128,98,34,228,186,1,88,109,9,3,237,79,220,189,251,172,87,118,118,192,132,210,210,176,149,95,190,252,120,109,98,162,254,245,232,209,43, + 88,83,13,64,0,49,33,85,71,160,5,4,160,92,249,247,228,203,183,247,118,62,101,187,244,241,216,43,96,2,1,134,203,221,181,12,140,118,142,12, + 140,114,234,64,85,223,25,8,86,186,160,30,214,7,96,105,97,228,192,240,223,39,137,225,231,190,149,12,127,191,227,159,124,4,21,115,191,254,252,99, + 248,201,193,206,240,251,35,254,4,243,15,216,45,255,107,21,206,240,207,59,140,225,223,217,22,96,218,4,205,27,49,50,188,61,245,158,97,221,139,95, + 167,63,252,248,245,158,1,114,66,213,15,96,23,29,124,10,231,255,255,12,120,135,2,129,213,18,211,219,183,159,80,86,230,129,246,78,183,183,167,176, + 2,171,15,209,222,222,213,1,126,126,213,75,129,137,37,142,210,196,130,12,128,237,29,185,169,83,55,180,5,7,55,244,190,122,245,65,53,40,200,142, + 223,211,211,12,35,128,99,99,221,152,252,253,173,248,126,252,248,173,25,30,222,212,182,104,209,174,90,74,18,11,90,117,43,62,101,202,250,182,240,240, + 230,150,47,95,190,171,206,157,91,202,99,110,174,137,53,146,1,2,136,9,169,74,250,5,77,48,63,128,38,252,88,251,238,207,241,123,71,62,253,252, + 5,58,76,227,243,45,200,146,2,183,84,32,251,31,254,2,6,212,151,254,10,76,28,98,138,12,140,37,253,12,255,128,9,229,207,165,195,12,255,64, + 59,23,241,37,130,255,144,142,24,232,72,152,63,172,248,247,42,255,151,80,5,38,150,40,134,255,215,187,24,254,191,189,201,192,200,207,199,240,237,202, + 91,134,51,55,254,62,217,243,254,215,101,168,127,64,13,216,159,192,18,230,15,49,221,102,96,196,49,127,253,250,29,190,12,2,52,17,217,221,157,193, + 22,22,230,32,90,87,55,47,164,182,118,222,212,55,111,62,170,208,106,120,99,255,254,243,161,65,65,117,83,174,94,125,96,208,209,145,202,239,232,104, + 0,119,180,156,156,24,67,122,186,15,231,147,39,111,212,146,146,58,187,143,29,187,26,197,64,253,29,157,140,39,78,92,139,138,137,105,237,2,150,116, + 74,157,157,233,60,160,1,77,116,0,16,64,176,18,230,15,82,41,3,62,63,238,196,139,183,15,246,190,103,63,247,229,40,168,148,1,182,91,46,207, + 96,96,114,7,150,50,198,46,192,102,200,103,236,165,12,51,19,100,119,192,95,30,6,166,220,54,6,70,41,96,151,239,202,49,134,127,111,159,50,252, + 99,97,37,88,194,128,11,138,255,12,132,87,228,115,179,51,252,187,61,153,225,255,211,195,12,140,188,194,12,127,191,253,97,120,190,231,37,195,214,55, + 127,78,190,250,254,243,45,3,226,56,179,159,192,46,228,111,96,79,5,100,36,35,254,46,242,63,70,96,162,129,171,41,44,12,97,13,15,119,20,236, + 233,89,21,0,108,44,55,49,64,246,107,209,20,0,27,230,86,101,101,51,171,128,93,98,185,204,76,63,46,72,162,96,100,0,86,23,236,192,106,72, + 172,180,116,102,222,173,91,79,28,105,233,134,219,183,159,186,148,151,207,202,149,146,18,18,139,143,119,103,67,151,7,8,32,88,9,243,27,41,144,65, + 75,226,128,13,132,191,95,150,190,248,122,242,238,177,143,95,127,222,3,10,255,1,150,242,143,231,48,48,149,79,102,96,20,146,7,170,248,12,169,122, + 96,9,7,52,171,253,13,168,245,47,59,80,205,108,6,70,96,94,252,255,244,28,195,255,27,151,24,254,253,254,78,176,119,5,63,181,249,63,225,54, + 245,255,207,15,129,248,9,195,127,118,96,167,4,216,245,127,187,227,17,195,233,231,92,119,86,191,253,121,22,154,232,191,66,241,119,96,149,244,27,216, + 83,250,71,168,144,1,245,156,128,13,78,112,117,4,236,246,50,6,4,88,115,3,123,65,86,253,253,107,90,128,98,2,36,134,251,95,164,118,33,73, + 3,29,55,111,62,118,171,171,155,159,47,35,35,198,165,169,41,199,0,116,7,11,176,65,42,92,85,53,39,227,216,177,43,49,68,118,185,63,243,241, + 113,221,7,246,132,206,233,232,40,156,86,83,147,61,11,236,210,223,7,138,127,34,70,63,176,218,77,156,52,105,125,88,96,160,173,128,139,139,49,74, + 196,1,4,16,11,3,226,244,109,88,162,129,5,54,247,133,15,223,238,207,121,43,180,167,98,215,75,127,197,116,96,10,120,178,155,129,65,200,128,129, + 177,114,33,195,255,154,64,96,71,17,152,136,56,160,171,240,64,163,195,194,82,12,76,133,115,24,24,117,128,61,203,131,233,12,12,198,157,12,255,30, + 109,99,160,194,130,125,180,100,206,2,94,199,203,196,251,157,225,243,185,103,12,119,47,252,251,60,237,19,235,174,15,223,64,179,164,224,4,255,5,169, + 132,1,214,134,44,127,9,57,0,188,34,244,31,164,187,29,17,225,200,6,108,252,169,2,171,161,74,96,34,18,36,198,73,28,28,108,239,36,37,133, + 47,1,139,241,187,192,200,122,7,140,156,31,80,59,57,128,109,35,145,107,215,30,106,189,126,253,65,7,104,30,222,146,10,216,19,59,174,171,171,116, + 6,88,53,113,128,70,223,92,92,140,216,129,93,101,227,213,171,15,198,17,114,3,176,26,125,14,236,38,239,5,118,183,175,1,253,253,18,88,178,62, + 7,250,11,212,240,103,249,245,235,55,232,160,2,41,96,207,206,224,194,133,59,174,191,126,253,193,231,47,166,25,51,54,229,0,123,80,103,188,189,45, + 142,31,56,112,225,43,208,221,224,132,15,16,64,44,72,153,27,86,37,193,2,156,11,24,130,156,179,30,190,63,36,197,194,43,156,185,230,129,141,168, + 159,12,3,227,149,73,12,140,166,77,12,76,253,123,25,254,45,239,96,96,184,127,9,60,127,195,168,227,192,192,20,2,108,227,176,1,219,59,7,74, + 32,37,15,171,8,3,227,199,15,144,118,13,85,107,92,96,11,150,139,153,225,235,189,79,12,143,182,188,253,219,251,154,123,235,225,7,207,111,64,19, + 201,23,104,130,7,31,209,10,26,253,100,103,103,35,234,200,15,208,212,19,63,63,55,147,141,141,46,47,176,7,226,3,236,134,155,18,28,200,98,97, + 254,102,100,164,186,222,192,64,121,255,207,159,127,94,191,126,253,241,221,139,23,239,129,221,227,63,255,65,109,39,144,253,252,252,60,28,126,126,150,66, + 192,110,177,204,225,195,151,131,129,145,102,141,54,86,3,90,98,113,3,24,65,43,140,140,212,246,191,123,247,249,30,176,219,254,17,88,42,176,25,27, + 171,75,166,164,116,103,0,149,72,224,11,16,96,73,178,19,232,238,213,31,62,124,125,112,243,230,147,79,111,222,124,248,3,108,68,255,1,118,213,255, + 179,179,179,50,1,187,204,47,164,164,132,175,1,75,157,51,134,134,170,123,129,189,163,248,251,247,159,91,225,25,156,148,154,54,109,67,100,79,79,230, + 13,13,13,185,159,192,174,59,120,124,10,32,128,144,19,204,31,164,54,204,23,6,216,217,118,255,255,178,78,125,241,115,191,210,49,86,9,79,230,167, + 42,34,33,114,12,12,39,170,129,85,78,56,3,115,126,5,80,7,27,195,127,208,80,254,47,96,124,61,233,101,96,120,113,26,178,124,147,133,3,58, + 194,68,214,186,107,252,69,46,43,51,195,175,23,192,196,178,254,229,223,233,175,185,247,172,189,247,252,12,208,252,159,208,129,155,79,72,37,204,47,96, + 149,196,12,236,82,19,156,252,2,201,130,46,149,0,70,62,7,48,146,229,129,57,58,156,144,59,184,184,56,158,250,250,90,206,228,229,229,58,117,228, + 200,149,119,192,4,246,253,243,103,208,86,209,255,200,7,51,130,70,123,89,128,165,206,91,77,77,249,151,94,94,230,247,110,221,146,186,176,103,207,185, + 248,223,191,255,8,0,205,120,98,105,169,181,93,67,67,118,23,176,36,122,56,111,222,246,55,247,238,61,255,14,108,83,253,171,173,141,229,62,117,234, + 186,62,176,116,114,193,231,14,99,99,181,117,192,196,54,23,216,24,126,7,44,61,62,2,219,98,63,25,144,142,109,3,118,159,25,159,62,125,195,4, + 196,172,151,46,221,251,108,97,161,245,209,199,199,242,221,182,109,199,255,220,189,251,220,14,151,185,199,143,95,243,62,123,246,246,202,132,4,143,119,37, + 37,211,193,9,6,32,128,88,144,219,156,72,213,210,55,104,224,131,119,14,190,254,242,253,85,195,115,150,245,252,71,24,163,237,120,158,73,241,187,73, + 51,48,222,91,14,44,93,54,130,215,208,50,254,1,186,239,251,59,72,87,7,116,2,38,168,189,242,247,43,164,221,3,58,151,8,52,105,204,200,76, + 76,229,11,77,91,248,231,32,254,127,251,197,240,114,223,199,255,171,95,242,28,154,115,239,209,97,96,108,127,135,38,148,143,80,119,127,131,38,254,223, + 192,4,3,140,48,230,127,132,183,107,255,3,117,163,153,92,93,77,184,54,109,58,234,9,236,41,168,19,40,254,95,132,134,58,244,3,75,145,83,27, + 54,28,126,247,230,205,167,175,12,136,51,131,255,34,53,205,152,128,221,95,230,247,239,191,48,3,35,244,43,48,81,125,118,116,52,90,229,231,103,245, + 30,200,86,54,51,211,216,11,76,40,119,119,239,62,251,17,152,80,62,3,115,54,200,237,191,129,9,236,191,137,137,58,251,228,201,235,125,128,237,43, + 54,92,238,0,150,26,231,29,29,13,23,238,218,117,250,41,48,49,128,252,255,19,152,224,65,13,125,80,239,240,31,82,27,13,228,14,22,96,98,98, + 61,116,232,210,143,239,223,127,254,246,247,183,158,184,100,201,94,145,87,175,222,107,225,232,57,138,29,63,126,213,43,40,200,230,12,208,158,31,192,70, + 249,95,128,0,98,65,107,168,193,186,215,95,25,144,182,159,128,216,247,222,127,126,82,207,196,179,182,113,199,199,16,139,79,191,37,69,131,129,221,102, + 208,84,193,151,183,144,6,47,11,15,106,19,22,52,177,245,230,16,3,163,71,40,3,195,66,96,169,243,253,51,161,153,60,160,11,191,129,71,135,25, + 254,225,223,50,251,237,227,255,255,235,190,243,157,92,240,232,209,209,191,191,127,127,129,38,150,15,208,4,3,47,93,32,254,97,100,33,102,242,27,52, + 184,7,44,41,88,129,129,204,117,250,244,77,15,2,202,127,3,75,138,121,156,156,236,199,86,175,222,255,6,152,88,190,48,32,78,38,255,139,101,214, + 13,190,127,253,241,227,215,63,215,175,63,252,13,88,170,108,84,84,148,100,219,191,255,194,183,59,119,158,126,7,70,206,15,104,34,7,31,143,15,172, + 94,88,129,137,76,242,234,213,251,166,120,242,215,79,79,79,179,37,188,188,156,239,128,213,204,111,103,103,35,70,9,9,33,38,65,65,94,102,160,24, + 176,93,197,14,95,127,242,237,219,15,166,79,159,190,3,19,238,103,230,23,47,222,49,126,252,248,245,151,136,136,192,43,15,15,211,133,139,22,237,106, + 129,198,51,6,216,189,251,140,129,143,143,133,44,176,84,250,178,110,221,225,127,0,1,196,130,165,117,255,139,1,117,131,62,108,161,56,243,133,183,95, + 238,22,255,231,91,94,127,228,71,160,235,183,219,138,34,129,10,12,204,66,60,144,147,169,64,9,4,214,21,1,31,254,3,140,244,123,91,25,24,77, + 108,24,152,51,39,51,48,148,23,227,28,234,135,116,201,217,129,213,156,53,3,163,154,41,3,227,205,103,12,12,199,38,226,84,250,244,55,195,251,99, + 239,63,95,255,247,231,207,103,104,34,121,15,77,48,159,160,137,253,7,172,135,2,46,180,192,19,140,132,18,204,127,6,33,33,94,96,145,125,95,27, + 216,117,149,195,167,22,212,14,80,80,144,216,183,106,213,129,183,192,196,242,9,106,31,52,129,98,189,166,135,9,169,215,244,251,243,231,111,191,128,37, + 202,87,80,163,246,31,100,90,251,47,122,130,3,54,124,57,158,63,127,171,241,252,249,59,113,92,238,16,16,224,189,5,108,167,112,1,221,96,199,205, + 205,249,11,148,8,128,213,207,223,39,79,94,255,3,173,41,2,54,124,255,35,15,27,128,252,8,44,193,152,128,13,96,102,96,2,101,3,102,12,214, + 175,95,127,112,1,19,215,195,207,159,191,99,29,99,2,86,99,90,192,182,157,44,48,108,110,131,220,7,16,64,44,88,122,182,176,82,230,27,82,3, + 4,182,54,150,225,206,187,79,143,170,255,114,175,126,203,204,225,238,249,242,150,142,180,135,36,51,151,46,176,90,2,237,11,250,254,23,177,209,158,17, + 186,88,255,76,35,3,131,86,30,3,163,62,176,157,119,238,1,238,102,185,186,33,3,99,72,8,80,27,176,196,186,126,19,127,246,254,243,247,55,176, + 246,248,14,44,118,65,137,229,29,20,127,64,43,93,254,146,210,120,2,86,73,160,198,49,243,151,47,223,228,129,69,183,40,62,165,192,134,233,150,135, + 15,95,190,1,226,143,176,222,24,3,254,147,200,97,43,255,224,99,94,160,29,26,72,227,77,200,55,180,128,79,52,6,70,16,168,20,0,37,92,156, + 163,185,192,106,83,123,243,230,227,205,148,246,32,8,100,40,145,39,79,94,137,75,75,139,176,3,171,246,31,0,1,196,130,99,56,228,55,3,234,197, + 89,76,200,51,159,143,62,126,125,94,246,245,251,250,67,111,121,111,199,188,122,110,101,97,252,73,74,212,74,152,129,69,158,23,162,236,215,95,72,137, + 3,58,45,10,116,210,193,213,105,12,12,111,223,224,119,246,247,59,192,146,101,34,208,178,31,12,140,95,191,19,154,121,248,207,193,206,246,25,152,131, + 222,65,75,23,228,182,11,114,78,39,126,224,228,47,104,150,150,137,25,152,227,196,24,240,108,111,4,182,93,222,105,106,202,94,1,150,46,159,144,18, + 203,111,34,22,127,160,223,58,199,136,69,238,31,100,24,5,88,47,114,113,176,2,75,24,65,2,99,71,212,56,180,158,17,121,246,30,27,56,118,236, + 154,60,176,123,207,201,207,207,245,25,32,128,88,240,120,236,23,218,140,43,3,210,82,136,63,191,254,252,251,179,238,249,199,83,59,95,49,223,246,127, + 205,160,19,124,233,135,161,153,54,135,148,168,1,31,19,139,44,55,3,51,31,59,176,124,1,54,30,64,91,79,64,51,254,255,158,19,152,124,252,201, + 192,196,199,203,240,239,39,104,46,233,43,161,233,253,63,28,28,108,31,129,141,59,88,233,242,17,169,161,11,75,44,68,206,146,34,192,199,143,95,184, + 46,95,190,47,133,79,13,176,157,243,136,149,149,245,203,151,47,160,147,10,224,165,10,177,137,243,63,82,137,130,75,14,84,229,49,177,178,50,11,30, + 60,120,81,158,97,16,128,55,111,62,138,242,240,112,113,0,195,156,9,32,128,112,37,24,88,32,252,198,145,11,224,235,103,190,2,203,239,101,207,63, + 31,219,254,150,229,170,253,147,223,234,62,103,190,106,25,203,176,203,73,200,48,115,114,200,114,50,252,19,226,96,248,47,202,202,192,128,127,238,143,225, + 215,251,95,12,111,15,61,103,248,250,234,223,159,71,215,254,252,194,55,20,15,90,59,4,204,233,159,129,189,26,88,35,247,27,52,183,255,197,209,232, + 36,170,100,6,213,237,192,18,134,147,64,239,232,13,27,27,243,119,96,21,134,220,192,37,165,52,35,164,150,145,131,131,149,9,88,221,178,2,219,14, + 204,131,33,193,0,195,4,52,210,205,6,106,115,1,4,16,11,1,143,253,65,227,255,71,155,221,6,69,18,168,30,226,126,255,235,207,175,13,47,255, + 124,216,246,154,233,138,206,211,191,146,14,119,57,149,52,184,190,202,9,179,126,224,19,145,251,205,247,225,254,103,54,124,169,230,233,171,191,95,150,156, + 103,187,121,235,195,247,103,215,191,253,3,229,114,99,124,53,8,176,161,246,25,180,138,12,154,96,126,160,181,1,200,152,177,5,23,205,76,4,83,54, + 3,104,30,149,229,15,176,58,36,39,177,16,5,126,255,254,11,74,188,12,12,52,60,201,156,164,58,11,216,198,1,246,34,65,203,78,25,1,2,136, + 80,130,249,143,214,30,248,143,212,40,254,137,52,255,196,3,197,156,191,254,253,251,117,238,227,183,175,64,252,128,137,145,145,93,74,144,87,192,140,147, + 67,250,198,151,47,160,197,75,56,123,31,247,127,253,127,245,237,237,167,115,192,134,220,103,1,62,110,22,2,195,53,127,248,249,121,190,1,115,251,55, + 180,54,4,217,27,160,129,213,219,71,80,219,129,157,157,21,239,141,19,192,94,8,63,55,55,23,51,180,203,138,115,4,57,46,206,21,124,227,43,176, + 43,203,240,246,237,39,240,13,174,160,109,184,192,98,157,193,220,92,147,65,67,67,14,60,246,3,90,48,181,98,197,126,208,196,35,162,57,247,253,23, + 8,255,7,117,162,6,67,130,249,253,27,86,210,49,50,0,4,16,11,145,69,40,172,219,247,15,109,118,27,121,194,242,11,100,148,142,1,118,84,24, + 251,191,255,255,57,158,126,248,252,243,206,183,95,127,62,252,253,167,78,160,33,251,135,131,133,249,11,211,191,255,239,249,121,57,241,46,136,249,254,253, + 55,31,104,209,53,176,39,241,139,80,98,97,132,2,80,175,4,159,153,204,204,140,223,128,213,192,15,21,21,169,87,87,174,224,222,214,251,225,195,87, + 101,14,14,22,54,89,89,81,150,91,183,30,99,77,44,229,229,17,12,29,29,105,224,0,126,246,236,53,3,176,171,206,48,101,202,122,240,145,103,155, + 55,31,99,200,200,8,96,240,240,240,0,7,229,159,63,95,192,247,22,212,215,47,132,59,249,197,139,183,255,191,125,251,241,89,79,79,241,197,149,43, + 247,112,198,139,163,163,193,34,25,25,209,251,160,1,57,38,42,95,218,4,218,236,1,44,193,65,85,255,31,9,9,161,251,192,4,255,229,211,167,175, + 255,0,2,136,216,4,195,128,212,174,65,94,210,9,171,150,190,66,19,10,236,20,110,216,145,167,156,44,204,76,156,60,156,108,172,31,153,153,126,19, + 40,246,126,1,115,247,59,96,99,239,53,48,247,138,227,159,243,249,205,205,197,197,14,26,160,34,120,213,13,176,171,204,4,154,75,1,230,88,124,99, + 43,255,152,153,89,126,126,253,250,19,88,213,113,189,132,250,149,25,123,125,254,93,4,216,107,208,243,244,52,187,125,242,228,117,148,19,169,164,164,68, + 24,146,146,60,24,170,171,99,128,165,202,71,112,130,121,255,254,11,176,148,129,156,137,3,76,100,192,18,234,55,195,55,208,172,62,184,157,254,23,200, + 254,204,32,46,46,196,160,165,37,207,112,237,218,67,216,8,235,255,87,175,62,254,1,102,136,215,248,123,55,12,191,4,5,121,142,29,59,118,253,51, + 40,130,169,185,17,15,100,30,104,196,24,24,126,63,206,158,189,245,21,232,182,207,192,18,242,31,64,0,17,123,58,14,250,245,50,255,24,48,23,94, + 193,18,14,7,3,226,108,57,78,160,39,184,129,197,48,43,144,254,129,191,132,97,250,9,236,74,190,5,210,175,120,120,56,94,1,213,127,251,247,239, + 63,174,134,47,31,176,52,224,16,21,229,255,143,150,232,192,155,224,144,142,230,96,212,210,146,99,126,246,236,13,223,247,239,63,241,149,48,63,64,118, + 191,121,243,225,47,27,27,219,83,96,64,189,5,86,21,98,184,194,242,228,201,107,94,190,190,22,219,129,57,156,117,243,230,227,240,30,143,159,159,37, + 248,162,240,247,239,63,131,170,56,80,169,133,220,5,102,128,236,171,131,76,67,32,142,172,249,15,84,199,194,16,24,104,3,75,48,224,48,6,86,205, + 255,128,57,251,5,116,216,0,107,247,26,88,18,90,25,25,169,174,123,252,248,229,167,151,47,223,147,115,150,218,127,44,61,97,6,180,30,241,111,164, + 17,232,127,0,1,196,68,134,5,200,35,147,63,144,170,35,216,136,43,168,50,6,13,186,128,54,42,191,96,102,102,126,201,199,199,245,26,152,16,190, + 19,74,48,124,124,220,239,128,17,254,6,88,68,191,1,54,44,241,174,221,216,189,251,140,158,141,141,46,143,148,148,48,220,163,81,81,206,12,89,89, + 254,112,53,160,91,234,237,236,244,153,175,94,125,104,0,44,9,120,241,148,110,127,88,88,152,190,220,188,249,248,167,128,0,247,117,69,69,201,71,248, + 236,62,127,254,142,237,222,189,231,189,242,242,130,248,92,93,141,153,65,119,15,76,158,156,11,190,157,254,213,171,247,88,55,198,65,182,133,252,1,150, + 38,130,12,34,34,2,172,175,95,63,87,184,126,253,166,42,43,43,27,55,48,225,51,163,95,214,117,227,198,163,191,192,112,187,1,77,52,184,186,187, + 218,192,132,165,21,30,238,244,7,216,99,252,130,52,159,70,8,131,87,227,43,43,75,125,141,140,116,254,174,175,175,252,13,24,254,232,106,62,67,11, + 0,228,129,201,127,0,1,196,68,102,170,68,222,203,132,60,97,249,21,105,94,7,132,223,3,75,130,119,192,6,234,7,32,253,11,127,130,97,252,3, + 140,172,79,192,156,248,1,24,1,207,129,109,148,23,248,212,159,62,125,211,13,152,32,196,99,99,221,56,69,68,32,37,77,69,69,4,3,176,170,96, + 0,205,163,128,34,49,61,221,155,93,86,86,76,4,88,34,184,224,27,140,3,173,150,151,147,19,187,123,233,210,221,31,192,72,248,12,12,200,67,4, + 194,128,103,210,164,117,165,55,110,60,182,236,234,74,231,207,204,244,3,39,26,80,59,2,219,36,39,104,244,31,52,87,5,204,60,140,189,189,89,28, + 234,234,50,210,161,161,13,53,86,86,57,75,22,45,218,225,105,103,167,43,230,230,102,10,114,43,44,103,255,7,150,30,191,128,37,229,107,96,227,248, + 12,62,135,108,219,118,34,94,71,71,94,42,55,55,232,31,48,195,125,131,198,3,94,12,244,239,215,130,130,224,63,211,167,23,114,3,75,40,243,222, + 222,76,161,41,83,242,152,130,131,237,126,138,137,9,194,226,17,166,254,7,82,59,241,63,64,0,81,218,207,255,143,111,140,6,132,129,17,255,207,194, + 66,139,235,254,253,231,214,175,95,127,84,195,101,16,176,190,190,107,106,170,190,247,212,169,27,111,180,181,21,191,1,91,230,134,143,31,191,214,192,221, + 240,5,111,214,250,9,244,248,89,91,91,221,223,47,94,188,255,107,108,172,6,26,182,103,184,124,249,62,99,90,154,15,71,104,168,163,240,162,69,59, + 163,118,236,56,29,135,47,193,200,201,137,95,3,186,113,205,166,77,199,62,1,219,24,255,93,93,77,190,157,57,115,211,1,232,6,94,220,115,165,255, + 249,247,238,61,103,1,76,172,31,50,50,252,158,3,19,217,239,87,175,62,48,72,75,139,252,7,149,108,160,196,3,42,85,64,37,199,187,119,159,89, + 162,163,157,89,129,145,207,247,249,243,55,157,196,196,174,186,163,71,175,196,0,221,47,189,125,251,41,175,179,103,111,243,2,115,250,157,212,84,239,111, + 64,45,255,79,156,184,254,31,52,231,195,195,195,197,174,161,33,251,15,232,22,47,96,66,196,26,87,95,190,252,16,191,118,237,145,28,208,191,23,98, + 99,93,223,0,219,96,127,94,190,124,247,11,88,242,254,1,38,12,48,6,186,17,216,120,229,4,225,191,160,197,221,211,167,23,176,3,195,73,14,152, + 232,51,38,78,92,219,126,236,216,85,99,96,41,243,35,38,198,245,123,124,188,219,23,160,59,129,102,188,255,13,218,113,1,204,200,255,64,109,42,88, + 85,9,16,64,52,233,182,35,77,37,176,1,3,80,160,185,57,201,72,91,91,97,3,150,182,16,28,3,3,124,87,123,123,170,37,208,131,82,192,46, + 169,50,208,241,173,12,152,251,162,209,241,15,95,95,203,217,219,182,181,155,127,254,188,85,252,245,235,245,98,175,94,173,19,251,250,117,135,232,233,211, + 211,245,195,195,29,219,161,185,4,159,25,192,4,98,60,161,168,40,84,27,88,10,138,2,75,10,137,236,236,0,3,111,111,243,73,132,244,65,241,87, + 96,36,172,1,230,210,200,59,119,150,40,125,253,186,77,236,203,151,173,98,223,190,109,23,249,250,117,187,40,144,22,187,119,111,153,252,130,5,21,238, + 137,137,158,221,192,158,199,61,108,230,104,104,200,239,93,186,180,58,224,229,203,181,226,192,94,22,39,48,114,185,197,196,4,196,106,106,98,205,117,117, + 149,54,18,114,7,176,116,58,14,44,49,194,128,254,151,121,255,126,19,255,143,31,59,57,128,246,179,0,195,133,5,68,63,124,184,130,227,195,135,205, + 252,175,94,173,151,92,176,160,220,91,65,65,226,0,186,25,64,251,78,2,237,46,59,121,114,170,206,223,191,123,4,110,221,90,4,90,4,143,18,185, + 0,1,68,139,35,33,145,83,226,95,78,78,118,80,215,140,152,225,243,255,192,122,248,15,48,210,126,3,219,8,76,65,65,118,71,128,189,160,135,192, + 6,164,2,30,61,236,192,70,103,10,48,135,56,232,233,41,93,4,86,125,119,65,250,63,126,252,162,124,235,214,83,253,71,143,94,170,18,242,35,176, + 52,120,109,106,170,121,252,232,209,203,159,129,85,0,104,247,223,159,35,71,46,189,11,8,176,217,113,225,194,61,203,167,79,95,155,16,112,55,23,176, + 183,20,12,196,46,51,102,108,126,10,236,9,93,1,54,218,159,128,38,234,64,126,2,246,144,148,158,63,127,167,114,243,230,35,57,160,217,56,123,127, + 55,110,60,116,138,137,105,51,2,230,240,105,21,21,209,203,129,37,211,147,201,147,215,255,60,123,246,230,107,39,39,195,77,183,110,61,49,255,249,243, + 23,78,253,143,31,191,178,200,201,153,56,103,238,220,173,7,76,77,53,118,133,134,58,92,1,150,50,159,64,235,148,129,97,2,108,91,125,224,89,185, + 114,191,46,176,180,114,189,112,225,174,53,176,167,41,140,110,6,80,141,89,103,231,10,163,133,11,119,197,3,237,92,223,218,154,188,88,84,84,224,46, + 242,0,46,64,0,209,26,49,171,168,72,243,244,247,103,235,1,75,152,117,4,74,152,157,147,38,229,154,74,74,10,131,102,103,69,128,85,141,174,143, + 143,101,47,145,185,156,108,12,172,206,22,148,150,134,27,10,11,243,138,192,6,32,129,165,128,72,112,176,173,78,122,186,111,38,144,253,138,214,110,64, + 47,53,59,58,82,179,102,207,46,230,3,207,68,112,115,136,231,228,4,26,132,134,218,183,163,205,147,17,194,255,128,153,245,62,16,223,5,246,82,31, + 129,14,35,32,197,29,192,166,196,141,29,59,186,236,59,59,211,80,246,252,0,4,208,160,186,162,27,84,95,2,123,43,224,217,242,253,251,47,124,52, + 49,81,219,15,204,37,23,104,101,159,128,0,207,29,43,43,157,45,39,78,92,123,255,246,237,103,216,44,247,31,96,238,251,181,115,231,153,247,192,54, + 198,73,96,181,54,9,88,242,189,167,87,24,88,90,106,175,215,212,148,223,191,113,227,49,112,164,131,54,237,239,219,119,238,19,80,108,39,80,110,13, + 41,77,3,96,59,79,1,136,149,128,254,144,37,180,145,15,173,71,247,33,63,63,168,251,227,199,207,183,230,205,219,134,50,137,11,16,64,131,44,193, + 48,1,123,18,224,4,243,23,216,173,252,122,229,202,131,59,129,129,54,51,64,167,14,80,189,232,99,102,250,232,231,103,53,11,216,13,190,13,44,166, + 191,194,18,11,108,108,9,216,13,255,182,99,199,169,183,192,42,107,59,176,120,239,101,101,101,166,117,162,249,7,108,180,175,4,182,25,38,207,154,181, + 229,205,214,173,39,96,61,147,223,192,176,248,4,116,203,115,7,7,131,249,102,102,26,43,105,28,7,31,226,227,221,219,216,217,217,142,84,86,206,249, + 118,243,230,19,148,4,3,16,64,131,42,193,64,22,242,128,215,161,254,5,182,204,127,239,217,115,246,51,11,11,203,89,96,119,111,42,48,130,63,81, + 203,30,208,188,81,80,144,45,176,228,96,221,15,236,25,189,253,254,29,116,8,48,124,230,25,54,245,241,19,216,83,248,186,101,203,241,247,64,245,123, + 128,37,77,15,176,122,120,66,163,72,250,14,236,153,205,240,244,52,155,181,124,249,190,231,192,196,242,11,122,154,3,56,193,0,123,100,63,79,159,190, + 249,97,215,174,211,143,237,237,13,22,185,184,24,207,103,64,93,126,66,21,192,199,199,245,56,38,198,165,147,155,155,125,15,176,253,244,233,222,189,231, + 127,209,7,248,0,2,136,214,211,231,76,66,66,124,172,192,92,33,120,238,220,109,135,215,175,63,104,226,235,86,219,216,232,238,61,118,236,202,219,247, + 239,191,128,151,87,2,139,210,255,160,33,118,93,93,229,231,192,54,208,125,96,215,92,25,40,38,68,97,53,244,24,216,54,154,10,12,156,157,235,214, + 29,122,9,236,242,126,101,64,44,186,194,152,102,0,13,135,63,121,242,250,15,176,49,251,28,232,190,171,64,251,89,129,141,67,57,42,117,24,254,1, + 123,145,23,129,137,119,178,140,140,200,206,109,219,78,190,184,112,225,206,39,6,212,197,228,240,161,139,231,207,223,254,249,246,237,199,47,43,43,237,59, + 138,138,146,15,95,188,120,43,5,108,28,83,99,127,245,31,96,87,250,0,48,99,78,2,154,127,106,221,186,195,111,222,190,5,207,103,252,70,115,3, + 3,64,0,81,45,193,4,4,88,51,168,171,203,129,118,238,145,157,96,172,173,117,246,30,61,10,79,48,224,241,253,119,239,190,252,125,240,224,197,95, + 96,119,251,53,48,194,46,1,187,189,127,64,235,92,255,253,35,120,204,6,106,87,134,139,253,185,153,153,230,86,47,47,243,41,192,72,63,179,101,203, + 177,87,64,123,190,32,13,123,163,247,228,224,13,64,96,59,224,31,48,183,253,2,22,128,31,128,126,185,4,108,160,223,5,29,137,241,241,227,87,94, + 160,59,200,217,66,251,93,78,78,236,146,189,189,254,42,160,159,231,61,124,248,242,218,246,237,39,95,62,122,244,234,51,116,100,245,55,142,6,46,195, + 203,151,239,126,223,185,243,244,151,152,152,224,51,11,11,205,179,130,130,60,31,128,238,224,6,186,81,136,129,196,229,16,192,146,237,179,178,178,228,41, + 71,71,131,197,90,90,10,43,47,93,186,119,103,223,190,11,111,63,127,6,237,119,134,175,2,64,89,236,5,16,64,84,235,86,7,6,58,48,196,197, + 249,50,120,120,228,48,0,27,140,212,234,154,255,1,237,55,2,182,51,62,109,221,122,252,175,174,174,210,79,61,61,229,199,90,90,242,123,129,185,94, + 19,152,56,13,128,221,86,5,232,32,30,11,108,231,34,104,62,9,148,176,128,85,200,75,80,195,22,152,27,111,42,42,74,92,2,150,22,55,65,141, + 233,91,183,30,129,6,232,96,139,197,113,37,22,6,228,238,36,208,252,127,199,142,93,251,123,253,250,227,239,70,70,170,239,77,77,213,79,219,219,235, + 41,62,125,250,70,21,216,229,213,2,70,26,200,29,160,19,168,216,127,253,250,203,140,212,144,255,15,26,90,0,246,84,94,241,242,114,62,150,145,17, + 189,5,236,57,222,4,118,187,239,2,75,136,103,192,220,252,13,216,117,255,12,116,251,55,164,196,251,27,173,180,131,205,219,253,0,157,107,4,44,225, + 254,1,195,227,151,130,130,196,87,125,125,229,167,33,33,118,251,129,213,170,18,176,205,167,3,12,43,245,175,95,191,203,0,221,203,243,243,39,98,1, + 22,51,51,227,127,160,27,126,129,118,104,242,242,114,63,80,82,146,184,6,76,248,55,126,255,254,123,23,24,150,175,14,29,186,252,5,152,161,97,107, + 139,144,195,5,101,21,0,64,0,86,174,93,5,97,32,8,166,240,93,136,17,67,64,11,187,20,246,130,31,225,239,248,27,254,141,32,136,118,22,54, + 134,8,98,19,11,69,66,26,73,206,83,99,188,92,116,150,168,4,81,43,171,107,151,153,217,205,110,118,238,254,38,24,206,147,27,1,195,97,95,233, + 118,123,202,96,48,251,135,104,94,132,69,81,28,155,166,45,86,171,237,169,217,212,61,8,96,137,12,29,161,114,228,0,98,17,253,134,46,165,204,211, + 223,85,218,13,233,186,234,226,60,163,100,135,32,134,77,38,230,1,25,28,0,200,75,10,20,161,124,183,88,166,69,243,90,135,120,30,23,227,241,60, + 32,3,23,200,119,241,73,89,116,58,173,17,68,81,192,52,149,129,128,85,223,231,85,114,236,147,41,11,83,159,168,215,107,59,33,34,65,211,23,200, + 62,90,150,205,17,203,229,241,68,218,147,156,235,27,73,183,207,9,148,196,34,101,44,215,107,39,220,108,220,51,170,13,3,38,182,97,52,102,237,182, + 81,66,195,154,69,211,94,70,172,26,225,65,158,93,52,239,129,166,85,104,19,127,133,168,133,227,236,217,116,186,228,116,237,133,177,99,58,142,240,23, + 46,119,1,88,185,130,20,132,97,32,136,180,13,169,6,91,74,63,231,19,250,209,222,122,20,138,120,243,172,32,181,138,155,180,56,19,68,66,91,15, + 130,47,200,50,179,187,217,100,50,249,243,197,157,243,98,117,85,237,62,9,227,81,91,205,148,209,57,59,243,223,21,166,85,238,165,7,16,110,41,18, + 162,170,123,144,116,214,58,81,198,172,147,162,48,199,52,213,49,1,18,17,94,167,15,32,143,224,8,186,137,96,235,8,85,87,9,102,132,241,71,149, + 222,75,31,93,247,120,34,121,239,109,123,186,33,134,139,194,4,205,132,41,203,109,156,101,38,122,63,195,161,31,104,192,54,59,32,110,135,138,167,13, + 196,34,177,37,80,250,237,194,204,178,132,213,244,207,97,63,156,163,144,72,62,77,102,125,211,28,174,232,32,138,9,147,231,155,136,254,164,152,182,79, + 128,139,174,227,234,122,63,34,30,203,3,5,141,108,232,106,225,250,18,196,241,245,125,209,75,0,81,49,193,192,54,220,131,102,100,217,65,219,72,65, + 129,245,15,116,161,38,144,205,249,233,211,87,65,2,221,220,223,192,92,248,239,207,159,127,184,18,13,242,44,249,79,96,32,176,2,205,103,6,97,96, + 195,149,233,209,163,151,200,247,9,32,71,46,250,162,175,191,104,237,3,98,75,187,191,12,168,107,129,192,215,6,1,221,193,2,172,14,152,129,24,60, + 29,2,44,214,209,151,121,34,207,179,33,187,5,157,102,96,32,110,231,193,127,180,196,14,43,21,88,126,253,250,3,194,160,99,52,152,161,238,96,196, + 18,38,200,75,83,144,39,144,255,50,16,177,106,17,32,128,168,150,96,64,235,61,129,110,7,93,88,196,102,98,162,255,117,201,146,202,223,155,54,29, + 103,6,237,85,6,230,114,49,96,149,161,141,79,63,176,136,127,15,12,116,240,38,118,92,141,79,44,145,15,187,81,142,17,75,224,160,7,208,63,180, + 226,254,63,153,237,42,6,6,196,102,191,63,12,136,173,56,204,72,9,133,9,139,190,127,120,48,169,110,249,135,68,195,220,193,140,230,14,38,164,156, + 76,200,29,127,137,76,176,12,0,1,68,181,4,3,172,67,153,183,110,61,97,222,216,184,192,55,45,205,231,180,177,177,250,189,148,20,175,127,87,175, + 62,144,234,235,91,147,8,76,249,98,248,244,3,219,28,239,65,117,233,151,47,63,254,19,81,61,252,69,242,36,242,254,41,108,106,145,3,130,26,51, + 174,255,208,74,29,38,180,34,150,17,135,91,24,112,12,195,83,218,206,67,46,69,25,25,240,95,196,129,173,138,69,47,205,241,2,128,0,162,90,130, + 1,21,135,63,127,126,227,57,125,250,102,4,16,231,1,235,210,107,192,58,253,43,176,103,162,2,108,160,17,60,99,69,79,79,233,209,139,23,239,190, + 3,171,46,66,251,137,176,237,237,97,36,160,150,22,128,20,119,208,195,45,255,177,180,17,168,238,22,128,0,162,86,130,97,2,182,214,89,120,121,185, + 224,199,63,3,27,119,90,63,126,16,55,24,9,76,88,79,128,221,224,199,192,22,251,95,10,170,139,193,0,6,211,237,231,52,113,11,64,0,81,35, + 193,128,139,62,96,195,19,212,51,32,241,158,98,8,208,208,144,3,141,75,220,132,30,90,51,50,175,156,31,34,0,32,128,168,53,151,4,218,56,206, + 12,44,81,72,190,87,17,52,71,100,103,167,183,238,206,157,39,159,159,62,125,243,135,129,70,155,195,70,1,117,0,64,0,81,109,242,17,116,2,37, + 104,171,41,137,9,230,151,171,171,241,66,96,123,231,212,190,125,23,190,48,144,182,79,121,20,12,0,0,8,32,170,37,152,183,111,63,253,3,157,222, + 200,195,195,249,150,24,245,236,236,108,111,65,147,128,192,234,104,205,218,181,135,94,3,75,151,31,12,228,237,85,30,5,116,4,0,1,68,141,201,71, + 112,183,246,237,219,143,204,10,10,18,191,221,220,76,46,8,10,242,222,228,224,96,125,207,201,201,254,19,116,100,216,191,127,12,160,35,180,126,2,19, + 211,39,208,46,58,29,29,197,77,62,62,22,115,89,89,153,15,109,217,114,226,249,163,71,175,96,147,128,196,28,155,49,10,6,16,0,4,16,35,149, + 204,0,37,60,54,62,62,110,78,57,57,113,62,57,57,81,65,96,194,16,0,109,96,3,118,183,65,43,229,133,65,231,154,241,240,112,188,227,228,100, + 123,247,234,213,135,239,87,175,62,252,112,255,254,243,207,223,190,253,128,237,125,65,94,98,48,10,6,41,0,8,32,106,237,173,132,29,113,6,218,237, + 8,218,249,200,193,194,194,194,14,44,65,216,5,5,121,88,4,4,120,152,128,189,32,208,249,43,255,222,188,249,8,154,219,1,221,19,4,219,204,143, + 60,183,67,179,173,12,163,128,58,0,32,128,24,169,104,14,108,152,30,148,104,96,183,130,192,206,199,67,62,144,8,54,143,129,124,139,202,223,209,196, + 50,52,0,64,0,49,82,217,44,88,245,132,126,19,61,174,9,48,228,33,254,209,196,50,4,0,64,128,1,0,102,20,176,16,7,130,12,56,0,0, + 0,0,73,69,78,68,174,66,96,130,0,0}; +const char* BinaryData::juce_png = (const char*) temp8; + +static const unsigned char temp9[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,102,100,101,102,32,95,87,73,78,51,50,13,10,32,35,105,110,99,108,117,100,101,32,60,119,105,110,100,111,119,115,46,104,62, + 13,10,35,101,108,105,102,32,33,32,100,101,102,105,110,101,100,32,40,76,73,78,85,88,41,13,10,32,35,105,110,99,108,117,100,101,32,60,67,97, + 114,98,111,110,46,104,62,13,10,32,35,105,110,99,108,117,100,101,32,60,77,111,118,105,101,115,46,104,62,13,10,35,101,110,100,105,102,13,10,13, + 10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10,35,105,102, + 32,74,85,67,69,95,79,80,69,78,71,76,13,10,13,10,35,105,102,100,101,102,32,95,87,73,78,51,50,13,10,32,35,105,110,99,108,117,100,101, + 32,60,103,108,47,103,108,46,104,62,13,10,32,35,105,110,99,108,117,100,101,32,60,103,108,47,103,108,117,46,104,62,13,10,32,35,105,102,100,101, + 102,32,95,77,83,67,95,86,69,82,13,10,32,32,35,112,114,97,103,109,97,32,99,111,109,109,101,110,116,40,108,105,98,44,32,34,79,112,101,110, + 71,76,51,50,46,76,105,98,34,41,13,10,32,32,35,112,114,97,103,109,97,32,99,111,109,109,101,110,116,40,108,105,98,44,32,34,71,108,85,51, + 50,46,76,105,98,34,41,13,10,32,35,101,110,100,105,102,13,10,35,101,108,105,102,32,100,101,102,105,110,101,100,32,40,76,73,78,85,88,41,13, + 10,32,35,105,110,99,108,117,100,101,32,60,71,76,47,103,108,46,104,62,13,10,32,35,105,110,99,108,117,100,101,32,60,71,76,47,103,108,117,116, + 46,104,62,13,10,32,35,117,110,100,101,102,32,75,101,121,80,114,101,115,115,13,10,35,101,108,115,101,13,10,32,35,105,110,99,108,117,100,101,32, + 60,97,103,108,47,97,103,108,46,104,62,13,10,32,35,105,110,99,108,117,100,101,32,60,103,108,117,116,47,103,108,117,116,46,104,62,13,10,35,101, + 110,100,105,102,13,10,13,10,35,105,102,110,100,101,102,32,71,76,95,66,71,82,65,95,69,88,84,13,10,32,35,100,101,102,105,110,101,32,71,76, + 95,66,71,82,65,95,69,88,84,32,48,120,56,48,101,49,13,10,35,101,110,100,105,102,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,68,101,109,111, + 79,112,101,110,71,76,67,97,110,118,97,115,32,32,58,32,112,117,98,108,105,99,32,79,112,101,110,71,76,67,111,109,112,111,110,101,110,116,44,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,84,105,109,101,114,13, + 10,123,13,10,32,32,32,32,102,108,111,97,116,32,114,111,116,97,116,105,111,110,44,32,100,101,108,116,97,59,13,10,32,32,32,32,73,109,97,103, + 101,42,32,105,109,97,103,101,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,68,101,109,111,79,112,101,110,71,76,67,97,110,118, + 97,115,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,111,116,97,116,105,111,110,32,61,32,48,46,48,102,59,13,10,32, + 32,32,32,32,32,32,32,100,101,108,116,97,32,61,32,49,46,48,102,59,13,10,13,10,32,32,32,32,32,32,32,32,73,109,97,103,101,42,32,105, + 109,32,61,32,73,109,97,103,101,70,105,108,101,70,111,114,109,97,116,58,58,108,111,97,100,70,114,111,109,32,40,66,105,110,97,114,121,68,97,116, + 97,58,58,106,117,99,101,95,112,110,103,44,32,66,105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,83,105,122,101,41,59,13, + 10,32,32,32,32,32,32,32,32,105,109,97,103,101,32,61,32,110,101,119,32,73,109,97,103,101,32,40,73,109,97,103,101,58,58,82,71,66,44,32, + 53,49,50,44,32,53,49,50,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,71,114,97,112,104,105,99,115,32,103,32,40,42,105, + 109,97,103,101,41,59,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58,58,119,104,105,116, + 101,41,59,13,10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,73,109,97,103,101,32,40,105,109,44,32,48,44,32,48,44,32,53,49,50,44, + 32,53,49,50,44,32,48,44,32,48,44,32,105,109,45,62,103,101,116,87,105,100,116,104,40,41,44,32,105,109,45,62,103,101,116,72,101,105,103,104, + 116,40,41,41,59,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,105,109,59,13,10,13,10,32,32,32,32,32,32,32,32,115,116,97, + 114,116,84,105,109,101,114,32,40,50,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,101,109,111,79,112,101,110,71,76,67, + 97,110,118,97,115,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,105,109,97,103,101,59,13,10,32, + 32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,119,104,101,110,32,116,104,101,32,99,111,109,112,111,110,101,110,116,32,99,114,101,97,116,101, + 115,32,97,32,110,101,119,32,105,110,116,101,114,110,97,108,32,99,111,110,116,101,120,116,44,32,116,104,105,115,32,105,115,32,99,97,108,108,101,100, + 44,32,97,110,100,13,10,32,32,32,32,47,47,32,119,101,39,108,108,32,117,115,101,32,116,104,101,32,111,112,112,111,114,116,117,110,105,116,121,32, + 116,111,32,99,114,101,97,116,101,32,116,104,101,32,116,101,120,116,117,114,101,115,32,110,101,101,100,101,100,46,13,10,32,32,32,32,118,111,105,100, + 32,110,101,119,79,112,101,110,71,76,67,111,110,116,101,120,116,67,114,101,97,116,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,47,47,32,40,110,111,32,110,101,101,100,32,116,111,32,99,97,108,108,32,109,97,107,101,67,117,114,114,101,110,116,67,111,110,116,101,120, + 116,65,99,116,105,118,101,40,41,44,32,97,115,32,116,104,97,116,32,119,105,108,108,32,104,97,118,101,13,10,32,32,32,32,32,32,32,32,47,47, + 32,98,101,101,110,32,100,111,110,101,32,102,111,114,32,117,115,32,98,101,102,111,114,101,32,116,104,101,32,109,101,116,104,111,100,32,99,97,108,108, + 41,46,13,10,32,32,32,32,32,32,32,32,103,108,67,108,101,97,114,67,111,108,111,114,32,40,48,46,48,102,44,32,48,46,48,102,44,32,48,46, + 48,102,44,32,48,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,103,108,67,108,101,97,114,68,101,112,116,104,32,40,49,46,48,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,103,108,68,101,112,116,104,70,117,110,99,32,40,71,76,95,76,69,83,83,41,59,13,10,32,32,32,32,32, + 32,32,32,103,108,69,110,97,98,108,101,32,40,71,76,95,68,69,80,84,72,95,84,69,83,84,41,59,13,10,32,32,32,32,32,32,32,32,103,108, + 69,110,97,98,108,101,32,40,71,76,95,84,69,88,84,85,82,69,95,50,68,41,59,13,10,32,32,32,32,32,32,32,32,103,108,69,110,97,98,108, + 101,32,40,71,76,95,66,76,69,78,68,41,59,13,10,32,32,32,32,32,32,32,32,103,108,83,104,97,100,101,77,111,100,101,108,32,40,71,76,95, + 83,77,79,79,84,72,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,108,84,101,120,80,97,114,97,109,101,116,101,114,105,32,40,71,76,95, + 84,69,88,84,85,82,69,95,50,68,44,32,71,76,95,84,69,88,84,85,82,69,95,87,82,65,80,95,83,44,32,71,76,95,67,76,65,77,80,41, + 59,13,10,32,32,32,32,32,32,32,32,103,108,84,101,120,80,97,114,97,109,101,116,101,114,105,32,40,71,76,95,84,69,88,84,85,82,69,95,50, + 68,44,32,71,76,95,84,69,88,84,85,82,69,95,87,82,65,80,95,84,44,32,71,76,95,67,76,65,77,80,41,59,13,10,32,32,32,32,32,32, + 32,32,103,108,84,101,120,80,97,114,97,109,101,116,101,114,105,32,40,71,76,95,84,69,88,84,85,82,69,95,50,68,44,32,71,76,95,84,69,88, + 84,85,82,69,95,77,65,71,95,70,73,76,84,69,82,44,32,71,76,95,76,73,78,69,65,82,41,59,13,10,32,32,32,32,32,32,32,32,103,108, + 84,101,120,80,97,114,97,109,101,116,101,114,105,32,40,71,76,95,84,69,88,84,85,82,69,95,50,68,44,32,71,76,95,84,69,88,84,85,82,69, + 95,77,73,78,95,70,73,76,84,69,82,44,32,71,76,95,76,73,78,69,65,82,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,108,80,105, + 120,101,108,83,116,111,114,101,105,32,40,71,76,95,85,78,80,65,67,75,95,65,76,73,71,78,77,69,78,84,44,32,52,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,105,110,116,32,115,116,114,105,100,101,44,32,112,105,120,83,116,114,105,100,101,59,13,10,32,32,32,32,32,32,32,32,99, + 111,110,115,116,32,118,111,105,100,42,32,112,105,120,101,108,115,32,61,32,105,109,97,103,101,45,62,108,111,99,107,80,105,120,101,108,68,97,116,97, + 82,101,97,100,79,110,108,121,32,40,48,44,32,48,44,32,105,109,97,103,101,45,62,103,101,116,87,105,100,116,104,40,41,44,32,105,109,97,103,101, + 45,62,103,101,116,72,101,105,103,104,116,40,41,44,32,115,116,114,105,100,101,44,32,112,105,120,83,116,114,105,100,101,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,103,108,84,101,120,73,109,97,103,101,50,68,32,40,71,76,95,84,69,88,84,85,82,69,95,50,68,44,32,48,44,32,52,44, + 32,105,109,97,103,101,45,62,103,101,116,87,105,100,116,104,40,41,44,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,44,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,44,32,71,76,95,82,71,66,44,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,71,76,95,85,78,83,73,71,78,69,68,95,66,89,84,69,44,32,112,105,120,101,108, + 115,41,59,13,10,32,32,32,32,32,32,32,32,105,109,97,103,101,45,62,114,101,108,101,97,115,101,80,105,120,101,108,68,97,116,97,82,101,97,100, + 79,110,108,121,32,40,112,105,120,101,108,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,108,72,105,110,116,32,40,71,76,95,76,73,78, + 69,95,83,77,79,79,84,72,95,72,73,78,84,44,32,71,76,95,78,73,67,69,83,84,41,59,13,10,32,32,32,32,32,32,32,32,103,108,72,105, + 110,116,32,40,71,76,95,80,79,73,78,84,95,83,77,79,79,84,72,95,72,73,78,84,44,32,71,76,95,78,73,67,69,83,84,41,59,13,10,32, + 32,32,32,32,32,32,32,103,108,66,108,101,110,100,70,117,110,99,32,40,71,76,95,83,82,67,95,65,76,80,72,65,44,32,71,76,95,79,78,69, + 95,77,73,78,85,83,95,83,82,67,95,65,76,80,72,65,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,109,111, + 117,115,101,68,114,97,103,32,40,99,111,110,115,116,32,77,111,117,115,101,69,118,101,110,116,38,32,101,41,13,10,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,100,101,108,116,97,32,61,32,101,46,103,101,116,68,105,115,116,97,110,99,101,70,114,111,109,68,114,97,103,83,116,97,114,116, + 88,40,41,32,47,32,49,48,48,46,48,102,59,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125, + 13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,110,100,101,114,79,112,101,110,71,76,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,103,108,67,108,101,97,114,67,111,108,111,114,32,40,48,46,56,102,44,32,48,46,48,102,44,32,48,46,52,102,44,32,48,46,48,102, + 41,59,13,10,32,32,32,32,32,32,32,32,103,108,67,108,101,97,114,32,40,71,76,95,67,79,76,79,82,95,66,85,70,70,69,82,95,66,73,84, + 32,124,32,71,76,95,68,69,80,84,72,95,66,85,70,70,69,82,95,66,73,84,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,108,77,97, + 116,114,105,120,77,111,100,101,40,71,76,95,80,82,79,74,69,67,84,73,79,78,41,59,13,10,32,32,32,32,32,32,32,32,103,108,76,111,97,100, + 73,100,101,110,116,105,116,121,40,41,59,13,10,32,32,32,32,32,32,32,32,103,108,79,114,116,104,111,32,40,48,46,48,44,32,103,101,116,87,105, + 100,116,104,40,41,44,32,48,46,48,44,32,103,101,116,72,101,105,103,104,116,40,41,44,32,48,44,32,49,41,59,13,10,13,10,32,32,32,32,32, + 32,32,32,103,108,67,111,108,111,114,52,102,32,40,49,46,48,102,44,32,49,46,48,102,44,32,49,46,48,102,44,32,102,97,98,115,102,32,40,115, + 105,110,102,32,40,114,111,116,97,116,105,111,110,32,47,32,49,48,48,46,48,102,41,41,41,59,13,10,32,32,32,32,32,32,32,32,103,108,66,101, + 103,105,110,40,71,76,95,81,85,65,68,83,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,105, + 32,40,48,44,32,48,41,59,32,103,108,86,101,114,116,101,120,50,102,32,40,53,48,46,48,102,44,32,103,101,116,72,101,105,103,104,116,40,41,32, + 45,32,53,48,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,105,32,40,49,44,32, + 48,41,59,32,103,108,86,101,114,116,101,120,50,102,32,40,103,101,116,87,105,100,116,104,40,41,32,45,32,53,48,46,48,102,44,32,103,101,116,72, + 101,105,103,104,116,40,41,32,45,32,53,48,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114, + 100,50,105,32,40,49,44,32,49,41,59,32,103,108,86,101,114,116,101,120,50,102,32,40,103,101,116,87,105,100,116,104,40,41,32,45,32,53,48,46, + 48,102,44,32,53,48,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,105,32,40,48, + 44,32,49,41,59,32,103,108,86,101,114,116,101,120,50,102,32,40,53,48,46,48,102,44,32,53,48,46,48,102,41,59,13,10,32,32,32,32,32,32, + 32,32,103,108,69,110,100,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,108,77,97,116,114,105,120,77,111,100,101,32,40,71,76,95,80, + 82,79,74,69,67,84,73,79,78,41,59,13,10,32,32,32,32,32,32,32,32,103,108,76,111,97,100,73,100,101,110,116,105,116,121,40,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,103,108,67,108,101,97,114,32,40,71,76,95,68,69,80,84,72,95,66,85,70,70,69,82,95,66,73,84,41,59, + 13,10,32,32,32,32,32,32,32,32,103,108,117,80,101,114,115,112,101,99,116,105,118,101,32,40,52,53,46,48,102,44,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,101,116,87,105,100,116,104,40,41,32,47,32,40,71,76,102,108,111,97,116,41, + 32,103,101,116,72,101,105,103,104,116,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48, + 46,49,102,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,49,48,48,46,48,102,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,103,108,77,97,116,114,105,120,77,111,100,101,32,40,71,76,95,77,79,68,69,76,86,73,69,87,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,103,108,76,111,97,100,73,100,101,110,116,105,116,121,40,41,59,13,10,32,32,32,32,32,32,32,32,103,108,80, + 117,115,104,77,97,116,114,105,120,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,114,97,110,115,108,97,116,101,102, + 32,40,48,46,48,102,44,32,48,46,48,102,44,32,45,53,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,82,111,116, + 97,116,101,102,32,40,114,111,116,97,116,105,111,110,44,32,48,46,53,102,44,32,49,46,48,102,44,32,48,46,48,102,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,103,108,66,101,103,105,110,32,40,71,76,95,81,85,65,68,83,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,103,108,67,111,108,111,114,51,102,32,40,48,46,48,102,44,32,49,46,48,102,44,32,48,46,48,102,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,48,46,48, + 102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,45,49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,49,46,48,102,41,59,32, + 103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102,44,32,45,49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,49,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101, + 114,116,101,120,51,102,40,32,49,46,48,102,44,32,32,49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,49,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120, + 51,102,40,45,49,46,48,102,44,32,32,49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,103,108,67,111,108,111,114,51,102,32,40,49,46,48,102,44,32,48,46,48,102,44,32,48,46,48,102,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,48,46,48,102,41,59,32,103, + 108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,45,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114, + 116,101,120,51,102,40,45,49,46,48,102,44,32,32,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,49,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51, + 102,40,32,49,46,48,102,44,32,32,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,103,108,84,101,120,67,111,111,114,100,50,102,40,49,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49, + 46,48,102,44,32,45,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103, + 108,67,111,108,111,114,51,102,32,40,48,46,48,102,44,32,48,46,48,102,44,32,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116, + 101,120,51,102,40,45,49,46,48,102,44,32,32,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102, + 40,45,49,46,48,102,44,32,32,49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 103,108,84,101,120,67,111,111,114,100,50,102,40,49,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46, + 48,102,44,32,32,49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101, + 120,67,111,111,114,100,50,102,40,49,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102,44,32, + 32,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,67,111,108,111, + 114,51,102,32,40,49,46,48,102,44,32,49,46,48,102,44,32,48,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40, + 45,49,46,48,102,44,32,45,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103, + 108,84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48, + 102,44,32,45,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120, + 67,111,111,114,100,50,102,40,49,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102,44,32,45, + 49,46,48,102,44,32,32,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114, + 100,50,102,40,49,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,45,49,46,48,102, + 44,32,32,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,67,111,108,111,114,51,102,32,40, + 48,46,48,102,44,32,49,46,48,102,44,32,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108, + 84,101,120,67,111,111,114,100,50,102,40,48,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102, + 44,32,45,49,46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67, + 111,111,114,100,50,102,40,48,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102,44,32,32,49, + 46,48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100, + 50,102,40,49,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102,44,32,32,49,46,48,102,44, + 32,32,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,49, + 46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,32,49,46,48,102,44,32,45,49,46,48,102,44,32,32,49,46, + 48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,67,111,108,111,114,51,102,32,40,49,46,48,102,44, + 32,48,46,48,102,44,32,49,46,48,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111, + 111,114,100,50,102,40,48,46,48,102,44,32,48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,45,49,46, + 48,102,44,32,45,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50, + 102,40,48,46,48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,45,49,46,48,102,44,32, + 32,49,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,49,46, + 48,102,44,32,49,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,32,49,46,48,102,44,32,32,49,46,48, + 102,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,108,84,101,120,67,111,111,114,100,50,102,40,49,46,48,102,44,32, + 48,46,48,102,41,59,32,103,108,86,101,114,116,101,120,51,102,40,45,49,46,48,102,44,32,32,49,46,48,102,44,32,45,49,46,48,102,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,108,69,110,100,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,108,80,111,112, + 77,97,116,114,105,120,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,116,105,109,101,114,67,97,108,108,98,97, + 99,107,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,111,116,97,116,105,111,110,32,43,61,32,100,101,108,116,97,59,13, + 10,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108, + 97,115,115,32,79,112,101,110,71,76,68,101,109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,13,10,123,13,10,32, + 32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,13,10,32,32,32,32,68,101,109,111,79,112,101,110,71,76,67,97,110,118,97,115,42,32,99,97,110,118,97,115,59,13,10,13,10,112,117, + 98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,79,112,101,110,71,76,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40,34,79,112,101,110,71,76,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32, + 99,97,110,118,97,115,32,61,32,110,101,119,32,68,101,109,111,79,112,101,110,71,76,67,97,110,118,97,115,40,41,59,13,10,32,32,32,32,32,32, + 32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,99,97,110,118,97,115,41,59,13,10,32,32,32,32,125,13,10,13,10, + 32,32,32,32,126,79,112,101,110,71,76,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101, + 65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105,122,101, + 100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,99,97,110,118,97,115,45,62,115,101,116,66,111,117,110,100,115,32,40,49, + 48,44,32,49,48,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,50,48,44,32,103,101,116,72,101,105,103,104,116,40,41,32,45,32,53,48, + 41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,79,112, + 101,110,71,76,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,79,112,101,110,71,76,68,101,109,111, + 40,41,59,13,10,125,13,10,13,10,35,101,110,100,105,102,13,10,0,0}; +const char* BinaryData::opengldemo_cpp = (const char*) temp9; + +static const unsigned char temp10[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,115,116,97,116,105,99,32,102,108,111,97,116,32,114,97,110,100,111,109,78,117,109,98,101,114,40,41,13,10,123,13,10,32,32,32,32, + 114,101,116,117,114,110,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111, + 97,116,40,41,32,42,32,51,48,48,46,48,102,32,45,32,49,53,48,46,48,102,59,13,10,125,13,10,13,10,13,10,47,47,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32, + 80,97,116,104,115,65,110,100,84,114,97,110,115,102,111,114,109,115,68,101,109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101, + 110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98, + 108,105,99,32,83,108,105,100,101,114,76,105,115,116,101,110,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,67,111,109,98,111,66,111,120,76,105,115,116,101,110,101,114,13,10,123,13, + 10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,80,97,116,104,115,65,110,100,84,114,97,110,115,102,111,114,109,115,68,101, + 109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40,34,80,97,116,104,115,34,41, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,78,111,32,112,97,114,116,115,32,111,102,32,116,104,105,115,32,99,111,109,112,111,110, + 101,110,116,32,97,114,101,32,115,101,109,105,45,116,114,97,110,115,112,97,114,101,110,116,44,32,115,111,32,99,97,108,108,105,110,103,32,115,101,116, + 79,112,97,113,117,101,40,41,13,10,32,32,32,32,32,32,32,32,47,47,32,97,108,108,111,119,115,32,116,104,101,32,114,101,100,114,97,119,32,115, + 121,115,116,101,109,32,116,111,32,101,120,112,108,111,105,116,32,116,104,105,115,32,102,97,99,116,32,97,110,100,32,111,112,116,105,109,105,115,101,32, + 114,101,112,97,105,110,116,105,110,103,46,13,10,32,32,32,32,32,32,32,32,115,101,116,79,112,97,113,117,101,32,40,116,114,117,101,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,103,101,110,101,114,97,116,101,82,97,110,100,111,109,83,104,97,112,101,40,41,59,13,10,32,32,32,32,32,32, + 32,32,103,101,110,101,114,97,116,101,73,109,97,103,101,40,41,59,13,10,32,32,32,32,32,32,32,32,103,101,110,101,114,97,116,101,68,114,97,119, + 97,98,108,101,40,41,59,13,10,32,32,32,32,32,32,32,32,103,101,110,101,114,97,116,101,83,86,71,68,114,97,119,97,98,108,101,40,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116,121,112,101,67,104,111,111,115,101, + 114,32,32,32,32,61,32,110,101,119,32,67,111,109,98,111,66,111,120,32,40,84,40,34,116,121,112,101,34,41,41,41,59,13,10,32,32,32,32,32, + 32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,115,99,97,108,101,83,108,105,100,101,114,32,32,32,32,61,32,110, + 101,119,32,83,108,105,100,101,114,32,40,84,40,34,115,99,97,108,101,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100, + 77,97,107,101,86,105,115,105,98,108,101,32,40,97,110,103,108,101,83,108,105,100,101,114,32,32,32,32,61,32,110,101,119,32,83,108,105,100,101,114, + 32,40,84,40,34,97,110,103,108,101,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98, + 108,101,32,40,120,83,108,105,100,101,114,32,32,32,32,32,32,32,32,61,32,110,101,119,32,83,108,105,100,101,114,32,40,84,40,34,120,34,41,41, + 41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,121,83,108,105,100,101,114,32,32, + 32,32,32,32,32,32,61,32,110,101,119,32,83,108,105,100,101,114,32,40,84,40,34,121,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,97, + 100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,111,112,97,99,105,116,121,83,108,105,100,101,114,32,32,61,32,110,101,119,32,83, + 108,105,100,101,114,32,40,84,40,34,111,112,97,99,105,116,121,34,41,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,40,110,101,119,32,76, + 97,98,101,108,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,84,40,34,116,121,112,101,58,34,41,41,41,32,32,32,32,32,45,62, + 97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,116,121,112,101,67,104,111,111,115,101,114,44,32,116,114,117,101,41,59,13,10, + 32,32,32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,84,40,34,115,99, + 97,108,101,58,34,41,41,41,32,32,32,32,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,115,99,97,108,101,83,108, + 105,100,101,114,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40,83,116,114,105,110,103, + 58,58,101,109,112,116,121,44,32,84,40,34,97,110,103,108,101,58,34,41,41,41,32,32,32,32,45,62,97,116,116,97,99,104,84,111,67,111,109,112, + 111,110,101,110,116,32,40,97,110,103,108,101,83,108,105,100,101,114,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119, + 32,76,97,98,101,108,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,84,40,34,120,32,111,102,102,115,101,116,58,34,41,41,41,32, + 45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,120,83,108,105,100,101,114,44,32,116,114,117,101,41,59,13,10,32,32, + 32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,32,84,40,34,121,32,111,102, + 102,115,101,116,58,34,41,41,41,32,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,121,83,108,105,100,101,114,44,32, + 116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40,83,116,114,105,110,103,58,58,101,109,112,116, + 121,44,32,84,40,34,111,112,97,99,105,116,121,58,34,41,41,41,32,32,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32, + 40,111,112,97,99,105,116,121,83,108,105,100,101,114,44,32,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104, + 111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,114,97,110,100,111,109,32,115,104,97,112,101,32,45,32,115,111,108,105,100,32, + 99,111,108,111,117,114,34,41,44,32,49,41,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73, + 116,101,109,32,40,84,40,34,114,97,110,100,111,109,32,115,104,97,112,101,32,45,32,108,105,110,101,97,114,32,103,114,97,100,105,101,110,116,32,102, + 105,108,108,34,41,44,32,50,41,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109, + 32,40,84,40,34,114,97,110,100,111,109,32,115,104,97,112,101,32,45,32,114,97,100,105,97,108,32,103,114,97,100,105,101,110,116,32,102,105,108,108, + 34,41,44,32,51,41,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84, + 40,34,114,97,110,100,111,109,32,115,104,97,112,101,32,45,32,116,105,108,101,100,32,105,109,97,103,101,32,102,105,108,108,34,41,44,32,56,41,59, + 13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,105,109,97,103,101, + 32,45,32,108,111,119,32,113,117,97,108,105,116,121,34,41,44,32,52,41,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115, + 101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,105,109,97,103,101,32,45,32,104,105,103,104,32,113,117,97,108,105,116,121,34,41,44,32, + 53,41,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,105,109, + 97,103,101,32,45,32,99,111,108,111,117,114,45,102,105,108,108,101,100,32,97,108,112,104,97,32,99,104,97,110,110,101,108,34,41,44,32,54,41,59, + 13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,105,109,97,103,101, + 32,45,32,103,114,97,100,105,101,110,116,45,102,105,108,108,101,100,32,97,108,112,104,97,32,99,104,97,110,110,101,108,34,41,44,32,55,41,59,13, + 10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,105,109,97,103,101,32, + 45,32,97,108,112,104,97,109,97,112,45,102,105,108,108,101,100,32,97,108,112,104,97,32,99,104,97,110,110,101,108,34,41,44,32,57,41,59,13,10, + 32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,73,116,101,109,32,40,84,40,34,100,114,97,119,97,98,108, + 101,32,111,98,106,101,99,116,34,41,44,32,49,48,41,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111,115,101,114,45,62,97, + 100,100,73,116,101,109,32,40,84,40,34,83,86,71,32,111,98,106,101,99,116,34,41,44,32,49,49,41,59,13,10,32,32,32,32,32,32,32,32,116, + 121,112,101,67,104,111,111,115,101,114,45,62,115,101,116,83,101,108,101,99,116,101,100,73,100,32,40,49,49,41,59,13,10,32,32,32,32,32,32,32, + 32,116,121,112,101,67,104,111,111,115,101,114,45,62,97,100,100,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,115,99,97,108,101,83,108,105,100,101,114,32,32,32,45,62,97,100,100,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59, + 13,10,32,32,32,32,32,32,32,32,97,110,103,108,101,83,108,105,100,101,114,32,32,32,45,62,97,100,100,76,105,115,116,101,110,101,114,32,40,116, + 104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,120,83,108,105,100,101,114,32,32,32,32,32,32,32,45,62,97,100,100,76,105,115,116,101,110, + 101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,121,83,108,105,100,101,114,32,32,32,32,32,32,32,45,62,97,100,100,76, + 105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,111,112,97,99,105,116,121,83,108,105,100,101,114,32,45, + 62,97,100,100,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,99,97,108,101,83,108,105, + 100,101,114,45,62,115,101,116,82,97,110,103,101,32,40,48,46,48,49,44,32,49,48,46,48,44,32,48,46,48,48,49,41,59,13,10,32,32,32,32, + 32,32,32,32,115,99,97,108,101,83,108,105,100,101,114,45,62,115,101,116,86,97,108,117,101,32,40,49,46,48,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,97,110,103,108,101,83,108,105,100,101,114,45,62,115,101,116,82,97,110,103,101,32,40,45,49,46,48,44,32,49,46,48,44,32,48,46, + 48,48,49,41,59,13,10,32,32,32,32,32,32,32,32,97,110,103,108,101,83,108,105,100,101,114,45,62,115,101,116,86,97,108,117,101,32,40,48,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,120,83,108,105,100,101,114,45,62,115,101,116,82,97,110,103,101,32,40,45,49,48,44,32,49,48,44, + 32,48,46,48,48,49,41,59,13,10,32,32,32,32,32,32,32,32,120,83,108,105,100,101,114,45,62,115,101,116,86,97,108,117,101,32,40,48,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,121,83,108,105,100,101,114,45,62,115,101,116,82,97,110,103,101,32,40,45,49,48,44,32,49,48,44,32, + 48,46,48,48,49,41,59,13,10,32,32,32,32,32,32,32,32,121,83,108,105,100,101,114,45,62,115,101,116,86,97,108,117,101,32,40,48,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,111,112,97,99,105,116,121,83,108,105,100,101,114,45,62,115,101,116,82,97,110,103,101,32,40,48,44,32,49, + 44,32,48,46,48,49,41,59,13,10,32,32,32,32,32,32,32,32,111,112,97,99,105,116,121,83,108,105,100,101,114,45,62,115,101,116,86,97,108,117, + 101,32,40,49,46,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,80,97,116,104,115,65,110,100,84,114,97,110,115,102,111,114, + 109,115,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,109,97,103,101,32,33,61,32,48,41, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,105,109,97,103,101,59,13,10,13,10,32,32,32,32,32,32,32,32,100, + 101,108,101,116,101,32,100,114,97,119,97,98,108,101,59,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,115,118,103,68,114,97,119,97, + 98,108,101,59,13,10,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115,38,32,103,41,13,10,32,32,32, + 32,123,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,67,104,101,99,107,101,114,66,111,97,114,100,32,40,48,44,32,48,44,32,103,101, + 116,87,105,100,116,104,40,41,44,32,103,101,116,72,101,105,103,104,116,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,53,48,44,32,53,48,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,67,111,108,111,117,114,32,40,48,120,102,102,101,48,101,48,101,48,41,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,108,111,117,114,115,58,58,119,104,105,116,101,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,116,121,112,101,32,61,32,116,121,112,101,67,104,111,111,115,101,114,45,62,103,101,116, + 83,101,108,101,99,116,101,100,73,100,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,32,61,61,32,49,41,13, + 10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108, + 111,117,114,115,58,58,98,108,117,101,46,119,105,116,104,65,108,112,104,97,32,40,40,102,108,111,97,116,41,32,111,112,97,99,105,116,121,83,108,105, + 100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,102,105,108,108,80,97, + 116,104,32,40,115,104,97,112,101,44,32,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10, + 32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,32,50,32,124,124,32,116,121,112,101,32,61,61,32,51,41, + 13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,71,114,97,100,105,101,110,116,66,114,117,115,104,32,103, + 98,32,40,67,111,108,111,117,114,115,58,58,98,108,117,101,46,119,105,116,104,65,108,112,104,97,32,40,40,102,108,111,97,116,41,32,111,112,97,99, + 105,116,121,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,101,116,87,105,100,116,104,40,41,32,42,32,48,46,53,102,44,32,103,101,116,72,101,105, + 103,104,116,40,41,32,42,32,48,46,53,102,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,67,111,108,111,117,114,115,58,58,114,101,100,46,119,105,116,104,65,108,112,104,97,32,40,40,102,108,111,97,116,41,32,111,112,97, + 99,105,116,121,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,101,116,87,105,100,116,104,40,41,32,42,32,48,46,54,102,44,32,103,101,116,72,101, + 105,103,104,116,40,41,32,42,32,48,46,55,102,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,116,121,112,101,32,61,61,32,51,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,66,114, + 117,115,104,32,40,38,103,98,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,102,105,108,108,80,97,116,104,32,40,115,104,97,112, + 101,44,32,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32, + 101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,32,56,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,73,109,97,103,101,66,114,117,115,104,32,105,98,32,40,105,109,97,103,101,44,32,49,48,48,44,32,49,48,48,44,32,40,102,108,111, + 97,116,41,32,111,112,97,99,105,116,121,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,59,13,10,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,103,46,115,101,116,66,114,117,115,104,32,40,38,105,98,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46, + 102,105,108,108,80,97,116,104,32,40,115,104,97,112,101,44,32,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,59,13,10,32,32,32,32,32, + 32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,32,52,32,124,124,32,116,121,112,101, + 32,61,61,32,53,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,32, + 61,61,32,52,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,73,109,97,103,101,82,101,115,97,109,112,108, + 105,110,103,81,117,97,108,105,116,121,32,40,71,114,97,112,104,105,99,115,58,58,108,111,119,82,101,115,97,109,112,108,105,110,103,81,117,97,108,105, + 116,121,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 103,46,115,101,116,73,109,97,103,101,82,101,115,97,109,112,108,105,110,103,81,117,97,108,105,116,121,32,40,71,114,97,112,104,105,99,115,58,58,109, + 101,100,105,117,109,82,101,115,97,109,112,108,105,110,103,81,117,97,108,105,116,121,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 103,46,115,101,116,79,112,97,99,105,116,121,32,40,40,102,108,111,97,116,41,32,111,112,97,99,105,116,121,83,108,105,100,101,114,45,62,103,101,116, + 86,97,108,117,101,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,105,109,97,103,101,32,33,61,32,48,41, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,73, + 109,97,103,101,84,114,97,110,115,102,111,114,109,101,100,32,40,105,109,97,103,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,44,32,48,44,32,105,109,97,103,101,45,62,103,101, + 116,87,105,100,116,104,40,41,44,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,102,102,105,110,101,84,114,97, + 110,115,102,111,114,109,58,58,116,114,97,110,115,108,97,116,105,111,110,32,40,45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116,87, + 105,100,116,104,40,41,44,32,45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,41,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,46,102,111,108,108,111,119,101,100,66,121,32,40,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,44,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,97,108,115,101,41,59,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32, + 105,102,32,40,116,121,112,101,32,61,61,32,54,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103, + 46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,98,108,117,101,46,119,105,116,104,65,108,112,104,97,32,40,40,102,108, + 111,97,116,41,32,111,112,97,99,105,116,121,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,105,102,32,40,105,109,97,103,101,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,73,109,97,103,101,84,114,97,110,115,102,111,114,109,101,100,32, + 40,105,109,97,103,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,48,44,32,48,44,32,105,109,97,103,101,45,62,103,101,116,87,105,100,116,104,40,41,44,32,105,109,97,103,101,45, + 62,103,101,116,72,101,105,103,104,116,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,102,102,105,110,101,84,114,97,110,115,102,111,114,109,58,58,116,114,97,110,115,108,97,116, + 105,111,110,32,40,45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116,87,105,100,116,104,40,41,44,32,45,48,46,53,102,32,42,32, + 105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,102,111,108,108,111,119,101,100,66,121,32,40,103,101, + 116,84,114,97,110,115,102,111,114,109,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32, + 32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,32,55,41,13,10,32, + 32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,71,114,97,100,105,101,110,116,66,114,117,115,104,32,103,98,32,40, + 67,111,108,111,117,114,115,58,58,98,108,117,101,46,119,105,116,104,65,108,112,104,97,32,40,40,102,108,111,97,116,41,32,111,112,97,99,105,116,121, + 83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,103,101,116,87,105,100,116,104,40,41,32,42,32,48,46,53,102,44,32,103,101,116,72,101,105,103,104,116, + 40,41,32,42,32,48,46,53,102,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,67,111,108,111,117,114,115,58,58,114,101,100,46,119,105,116,104,65,108,112,104,97,32,40,40,102,108,111,97,116,41,32,111,112,97,99,105,116, + 121,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,103,101,116,87,105,100,116,104,40,41,32,42,32,48,46,54,102,44,32,103,101,116,72,101,105,103,104, + 116,40,41,32,42,32,48,46,55,102,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,102,97,108,115,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,66,114,117,115,104,32,40,38,103, + 98,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,105,109,97,103,101,32,33,61,32,48,41,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,73,109,97,103,101,84,114, + 97,110,115,102,111,114,109,101,100,32,40,105,109,97,103,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,44,32,48,44,32,105,109,97,103,101,45,62,103,101,116,87,105,100,116,104, + 40,41,44,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,102,102,105,110,101,84,114,97,110,115,102,111,114,109, + 58,58,116,114,97,110,115,108,97,116,105,111,110,32,40,45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116,87,105,100,116,104,40,41, + 44,32,45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,102,111,108,108, + 111,119,101,100,66,121,32,40,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,116,121,112, + 101,32,61,61,32,57,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,73,109,97,103,101,66,114,117, + 115,104,32,105,98,32,40,105,109,97,103,101,44,32,49,48,48,44,32,49,48,48,44,32,40,102,108,111,97,116,41,32,111,112,97,99,105,116,121,83, + 108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,66,114, + 117,115,104,32,40,38,105,98,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,105,109,97,103,101,32,33,61,32,48, + 41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119, + 73,109,97,103,101,84,114,97,110,115,102,111,114,109,101,100,32,40,105,109,97,103,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,44,32,48,44,32,105,109,97,103,101,45,62,103, + 101,116,87,105,100,116,104,40,41,44,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,44,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,102,102,105,110,101,84,114, + 97,110,115,102,111,114,109,58,58,116,114,97,110,115,108,97,116,105,111,110,32,40,45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116, + 87,105,100,116,104,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 45,48,46,53,102,32,42,32,105,109,97,103,101,45,62,103,101,116,72,101,105,103,104,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,102,111,108,108,111,119, + 101,100,66,121,32,40,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,116,121,112,101,32, + 61,61,32,49,48,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,79,112,97,99, + 105,116,121,32,40,40,102,108,111,97,116,41,32,111,112,97,99,105,116,121,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,108,111,97,116,32,120,44,32,121,44,32,119,44,32,104,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,100,114,97,119,97,98,108,101,45,62,103,101,116,66,111,117,110,100,115,32,40,120,44,32,121,44,32,119,44,32,104,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,114,97,119,97,98,108,101,45,62,100,114,97,119,32,40,103,44,32,65,102,102,105,110, + 101,84,114,97,110,115,102,111,114,109,58,58,116,114,97,110,115,108,97,116,105,111,110,32,40,45,120,32,45,32,48,46,53,102,32,42,32,119,44,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,45,121,32,45,32,48,46,53,102,32,42,32,104,41,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,102,111,108,108,111,119,101,100,66, + 121,32,40,103,101,116,84,114,97,110,115,102,111,114,109,40,41,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32, + 32,101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,32,49,49,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,103,46,115,101,116,79,112,97,99,105,116,121,32,40,40,102,108,111,97,116,41,32,111,112,97,99,105,116,121,83,108,105,100,101, + 114,45,62,103,101,116,86,97,108,117,101,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,108,111,97,116,32,120,44,32, + 121,44,32,119,44,32,104,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,118,103,68,114,97,119,97,98,108,101,45,62,103,101,116,66,111, + 117,110,100,115,32,40,120,44,32,121,44,32,119,44,32,104,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,118,103,68,114,97, + 119,97,98,108,101,45,62,100,114,97,119,32,40,103,44,32,65,102,102,105,110,101,84,114,97,110,115,102,111,114,109,58,58,116,114,97,110,115,108,97, + 116,105,111,110,32,40,45,120,32,45,32,48,46,53,102,32,42,32,119,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,45,121,32,45,32,48,46,53,102,32,42,32,104,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,102,111,108,108,111,119,101,100,66,121,32,40,103,101,116,84,114,97,110,115,102,111, + 114,109,40,41,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101, + 115,105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,120,32,61,32,49,48, + 48,59,13,10,32,32,32,32,32,32,32,32,105,110,116,32,121,32,61,32,52,59,13,10,32,32,32,32,32,32,32,32,116,121,112,101,67,104,111,111, + 115,101,114,45,62,115,101,116,66,111,117,110,100,115,32,40,120,44,32,121,44,32,51,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32, + 32,121,32,43,61,32,50,56,59,13,10,32,32,32,32,32,32,32,32,115,99,97,108,101,83,108,105,100,101,114,45,62,115,101,116,66,111,117,110,100, + 115,32,40,120,44,32,121,44,32,51,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,121,32,43,61,32,50,56,59,13,10,32,32, + 32,32,32,32,32,32,97,110,103,108,101,83,108,105,100,101,114,45,62,115,101,116,66,111,117,110,100,115,32,40,120,44,32,121,44,32,51,48,48,44, + 32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,121,32,43,61,32,50,56,59,13,10,32,32,32,32,32,32,32,32,120,83,108,105,100,101,114, + 45,62,115,101,116,66,111,117,110,100,115,32,40,120,44,32,121,44,32,51,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,121,32, + 43,61,32,50,56,59,13,10,32,32,32,32,32,32,32,32,121,83,108,105,100,101,114,45,62,115,101,116,66,111,117,110,100,115,32,40,120,44,32,121, + 44,32,51,48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,121,32,43,61,32,50,56,59,13,10,32,32,32,32,32,32,32,32,111, + 112,97,99,105,116,121,83,108,105,100,101,114,45,62,115,101,116,66,111,117,110,100,115,32,40,120,44,32,121,44,32,51,48,48,44,32,50,52,41,59, + 13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,115,108,105,100,101,114,86,97,108,117,101,67,104,97,110,103,101,100,32,40, + 83,108,105,100,101,114,42,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32, + 32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,99,111,109,98,111,66,111,120,67,104,97,110,103,101,100,32,40,67,111,109,98,111,66,111,120, + 42,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10, + 112,114,105,118,97,116,101,58,13,10,32,32,32,32,80,97,116,104,32,115,104,97,112,101,59,13,10,32,32,32,32,73,109,97,103,101,42,32,105,109, + 97,103,101,59,13,10,32,32,32,32,68,114,97,119,97,98,108,101,42,32,100,114,97,119,97,98,108,101,59,13,10,32,32,32,32,68,114,97,119,97, + 98,108,101,67,111,109,112,111,115,105,116,101,42,32,115,118,103,68,114,97,119,97,98,108,101,59,13,10,13,10,32,32,32,32,67,111,109,98,111,66, + 111,120,42,32,116,121,112,101,67,104,111,111,115,101,114,59,13,10,32,32,32,32,83,108,105,100,101,114,42,32,115,99,97,108,101,83,108,105,100,101, + 114,59,13,10,32,32,32,32,83,108,105,100,101,114,42,32,97,110,103,108,101,83,108,105,100,101,114,59,13,10,32,32,32,32,83,108,105,100,101,114, + 42,32,120,83,108,105,100,101,114,59,13,10,32,32,32,32,83,108,105,100,101,114,42,32,121,83,108,105,100,101,114,59,13,10,32,32,32,32,83,108, + 105,100,101,114,42,32,111,112,97,99,105,116,121,83,108,105,100,101,114,59,13,10,13,10,32,32,32,32,118,111,105,100,32,103,101,110,101,114,97,116, + 101,82,97,110,100,111,109,83,104,97,112,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,104,97,112,101,46,115,116,97, + 114,116,78,101,119,83,117,98,80,97,116,104,32,40,114,97,110,100,111,109,78,117,109,98,101,114,40,41,44,32,114,97,110,100,111,109,78,117,109,98, + 101,114,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,48,59,32,105,32,60,32,55,59, + 32,43,43,105,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,104,97,112,101,46,108,105,110,101, + 84,111,32,40,114,97,110,100,111,109,78,117,109,98,101,114,40,41,44,32,114,97,110,100,111,109,78,117,109,98,101,114,40,41,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,115,104,97,112,101,46,113,117,97,100,114,97,116,105,99,84,111,32,40,114,97,110,100,111,109,78,117,109, + 98,101,114,40,41,44,32,114,97,110,100,111,109,78,117,109,98,101,114,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,97,110,100,111,109,78,117,109,98,101,114,40,41,44,32,114,97,110,100,111,109,78,117,109, + 98,101,114,40,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,115,104,97,112,101,46,99,108,111,115, + 101,83,117,98,80,97,116,104,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,103,101,110,101,114,97,116,101,73, + 109,97,103,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,109,97,103,101,32,61,32,73,109,97,103,101,70,105,108,101, + 70,111,114,109,97,116,58,58,108,111,97,100,70,114,111,109,32,40,66,105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,44,32, + 66,105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,83,105,122,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32, + 32,118,111,105,100,32,103,101,110,101,114,97,116,101,68,114,97,119,97,98,108,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32, + 32,47,47,32,99,114,101,97,116,101,32,97,32,99,111,109,112,111,115,105,116,101,32,100,114,97,119,97,98,108,101,32,111,98,106,101,99,116,46,46, + 13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,67,111,109,112,111,115,105,116,101,42,32,100,99,32,61,32,110,101,119,32,68,114, + 97,119,97,98,108,101,67,111,109,112,111,115,105,116,101,40,41,59,13,10,32,32,32,32,32,32,32,32,100,114,97,119,97,98,108,101,32,61,32,100, + 99,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,46,46,97,100,100,32,97,32,112,97,116,104,115,32,100,114,97,119,97,98,108,101,32, + 116,111,32,105,116,46,46,46,13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,80,97,116,104,32,100,112,59,13,10,32,32,32,32, + 32,32,32,32,100,112,46,115,101,116,80,97,116,104,32,40,115,104,97,112,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,100,112,46,115,101, + 116,79,117,116,108,105,110,101,32,40,52,46,48,102,44,32,67,111,108,111,117,114,115,58,58,98,108,117,101,41,59,13,10,13,10,32,32,32,32,32, + 32,32,32,71,114,97,100,105,101,110,116,66,114,117,115,104,32,103,98,32,40,67,111,108,111,117,114,71,114,97,100,105,101,110,116,32,40,67,111,108, + 111,117,114,115,58,58,114,101,100,46,119,105,116,104,65,108,112,104,97,32,40,48,46,52,102,41,44,32,45,49,48,48,46,48,102,44,32,45,49,48, + 48,46,48,102,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,67,111,108,111,117,114,115,58,58,103,114,101,101,110,46,119,105,116,104,65,108,112,104,97,32,40,48,46,54,102,41, + 44,32,49,48,48,46,48,102,44,32,49,48,48,46,48,102,44,32,102,97,108,115,101,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,100,112, + 46,115,101,116,70,105,108,108,66,114,117,115,104,32,40,103,98,41,59,13,10,13,10,32,32,32,32,32,32,32,32,100,99,45,62,105,110,115,101,114, + 116,68,114,97,119,97,98,108,101,32,40,100,112,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,46,46,97,100,100,32,97,110,32,105, + 109,97,103,101,32,100,114,97,119,97,98,108,101,46,46,13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,73,109,97,103,101,32,100, + 105,59,13,10,32,32,32,32,32,32,32,32,100,105,46,115,101,116,73,109,97,103,101,32,40,105,109,97,103,101,44,32,102,97,108,115,101,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,100,99,45,62,105,110,115,101,114,116,68,114,97,119,97,98,108,101,32,40,100,105,44,32,65,102,102,105,110, + 101,84,114,97,110,115,102,111,114,109,58,58,115,99,97,108,101,32,40,48,46,51,102,44,32,48,46,56,102,41,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,47,47,32,46,46,97,110,100,32,97,32,116,101,120,116,32,111,98,106,101,99,116,13,10,32,32,32,32,32,32,32,32,68,114,97,119, + 97,98,108,101,84,101,120,116,32,100,116,59,13,10,32,32,32,32,32,32,32,32,100,116,46,115,101,116,84,101,120,116,32,40,84,40,34,74,85,67, + 69,32,68,114,97,119,97,98,108,101,115,34,41,44,32,70,111,110,116,32,40,51,48,46,48,102,44,32,70,111,110,116,58,58,98,111,108,100,41,41, + 59,13,10,32,32,32,32,32,32,32,32,100,116,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,103,114,101,101,110,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,100,99,45,62,105,110,115,101,114,116,68,114,97,119,97,98,108,101,32,40,100,116,44,32,65,102,102, + 105,110,101,84,114,97,110,115,102,111,114,109,58,58,116,114,97,110,115,108,97,116,105,111,110,32,40,45,56,48,46,48,102,44,32,45,50,48,46,48, + 102,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 46,115,99,97,108,101,100,32,40,50,46,48,102,44,32,48,46,56,102,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,114,111,116,97,116,101,100,32,40,45,49,46,51,102,41,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,103,101,110,101,114,97,116,101,83,86,71,68,114,97,119,97,98,108,101,40,41,13,10,32, + 32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,118,103,68,114,97,119,97,98,108,101,32,61,32,48,59,13,10,13,10,32,32,32,32,32,32, + 32,32,77,101,109,111,114,121,73,110,112,117,116,83,116,114,101,97,109,32,105,99,111,110,115,70,105,108,101,83,116,114,101,97,109,32,40,66,105,110, + 97,114,121,68,97,116,97,58,58,105,99,111,110,115,95,122,105,112,44,32,66,105,110,97,114,121,68,97,116,97,58,58,105,99,111,110,115,95,122,105, + 112,83,105,122,101,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,90,105,112,70,105,108,101,32,105,99,111,110,115,32,40,38, + 105,99,111,110,115,70,105,108,101,83,116,114,101,97,109,44,32,102,97,108,115,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,76, + 111,97,100,32,97,32,114,97,110,100,111,109,32,83,86,71,32,102,105,108,101,32,102,114,111,109,32,111,117,114,32,101,109,98,101,100,100,101,100,32, + 105,99,111,110,115,46,122,105,112,32,102,105,108,101,46,13,10,32,32,32,32,32,32,32,32,73,110,112,117,116,83,116,114,101,97,109,42,32,115,118, + 103,70,105,108,101,83,116,114,101,97,109,13,10,32,32,32,32,32,32,32,32,32,32,32,32,61,32,105,99,111,110,115,46,99,114,101,97,116,101,83, + 116,114,101,97,109,70,111,114,69,110,116,114,121,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41, + 46,110,101,120,116,73,110,116,32,40,105,99,111,110,115,46,103,101,116,78,117,109,69,110,116,114,105,101,115,40,41,41,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,105,102,32,40,115,118,103,70,105,108,101,83,116,114,101,97,109,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,42,32,108,111,97,100,101,100,83,86,71,32,61,32,68,114,97,119, + 97,98,108,101,58,58,99,114,101,97,116,101,70,114,111,109,73,109,97,103,101,68,97,116,97,83,116,114,101,97,109,32,40,42,115,118,103,70,105,108, + 101,83,116,114,101,97,109,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,108,111,97,100,101,100,83,86,71,32,33, + 61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32, + 116,111,32,109,97,107,101,32,111,117,114,32,105,99,111,110,32,116,104,101,32,114,105,103,104,116,32,115,105,122,101,44,32,119,101,39,108,108,32,112, + 117,116,32,105,116,32,105,110,115,105,100,101,32,97,32,68,114,97,119,97,98,108,101,67,111,109,112,111,115,105,116,101,44,32,97,110,100,32,97,112, + 112,108,121,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,32,116,114,97,110,115,102,111,114,109,32,116,111,32,103, + 101,116,32,105,116,32,116,111,32,116,104,101,32,115,105,122,101,32,119,101,32,119,97,110,116,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,102,108,111,97,116,32,120,44,32,121,44,32,119,44,32,104,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,108,111,97,100,101,100,83,86,71,45,62,103,101,116,66,111,117,110,100,115,32,40,120,44,32,121,44,32,119,44,32,104,41,59,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,102,108,111,97,116,32,115,99,97,108,101,70,97,99,116,111,114,32,61,32,51, + 48,48,46,48,102,32,47,32,106,109,97,120,32,40,119,44,32,104,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 115,118,103,68,114,97,119,97,98,108,101,32,61,32,110,101,119,32,68,114,97,119,97,98,108,101,67,111,109,112,111,115,105,116,101,40,41,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,118,103,68,114,97,119,97,98,108,101,45,62,105,110,115,101,114,116,68,114,97,119,97, + 98,108,101,32,40,108,111,97,100,101,100,83,86,71,44,32,65,102,102,105,110,101,84,114,97,110,115,102,111,114,109,58,58,115,99,97,108,101,32,40, + 115,99,97,108,101,70,97,99,116,111,114,44,32,115,99,97,108,101,70,97,99,116,111,114,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,115,118,103,70,105,108,101,83,116,114,101,97,109,59,13, + 10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,99,111,110,115,116,32,65,102,102,105,110,101,84,114,97, + 110,115,102,111,114,109,32,103,101,116,84,114,97,110,115,102,111,114,109,40,41,32,99,111,110,115,116,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,114,101,116,117,114,110,32,65,102,102,105,110,101,84,114,97,110,115,102,111,114,109,58,58,114,111,116,97,116,105,111,110,32,40,102,108, + 111,97,116,95,80,105,32,42,32,50,46,48,102,32,42,32,40,102,108,111,97,116,41,32,97,110,103,108,101,83,108,105,100,101,114,45,62,103,101,116, + 86,97,108,117,101,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,115,99,97,108,101,100,32,40,40,102,108,111,97, + 116,41,32,115,99,97,108,101,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,102,108,111,97,116,41,32,115,99,97,108,101,83,108,105,100,101,114,45,62,103,101,116,86,97, + 108,117,101,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,116,114,97,110,115,108,97,116,101,100,32,40,103,101,116, + 87,105,100,116,104,40,41,32,42,32,48,46,53,102,32,43,32,40,102,108,111,97,116,41,32,120,83,108,105,100,101,114,45,62,103,101,116,86,97,108, + 117,101,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,101,116,72, + 101,105,103,104,116,40,41,32,42,32,48,46,53,102,32,43,32,40,102,108,111,97,116,41,32,121,83,108,105,100,101,114,45,62,103,101,116,86,97,108, + 117,101,40,41,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,80,97, + 116,104,115,65,110,100,84,114,97,110,115,102,111,114,109,115,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101, + 119,32,80,97,116,104,115,65,110,100,84,114,97,110,115,102,111,114,109,115,68,101,109,111,40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::pathsandtransformsdemo_cpp = (const char*) temp10; + +static const unsigned char temp11[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 35,105,102,32,74,85,67,69,95,81,85,73,67,75,84,73,77,69,32,38,38,32,33,32,74,85,67,69,95,76,73,78,85,88,13,10,13,10,47,47, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10, + 47,47,32,115,111,32,116,104,97,116,32,119,101,32,99,97,110,32,101,97,115,105,108,121,32,104,97,118,101,32,116,119,111,32,81,84,32,119,105,110, + 100,111,119,115,32,101,97,99,104,32,119,105,116,104,32,97,32,102,105,108,101,32,98,114,111,119,115,101,114,44,32,119,114,97,112,32,116,104,105,115, + 32,117,112,32,97,115,32,97,32,99,108,97,115,115,46,46,13,10,99,108,97,115,115,32,81,117,105,99,107,84,105,109,101,87,105,110,100,111,119,87, + 105,116,104,70,105,108,101,66,114,111,119,115,101,114,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98, + 108,105,99,32,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116,76,105,115,116,101,110,101,114,13,10,123,13,10,112,117,98,108,105,99, + 58,13,10,32,32,32,32,81,117,105,99,107,84,105,109,101,87,105,110,100,111,119,87,105,116,104,70,105,108,101,66,114,111,119,115,101,114,40,41,13, + 10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,113,116,67,111,109, + 112,32,61,32,110,101,119,32,81,117,105,99,107,84,105,109,101,77,111,118,105,101,67,111,109,112,111,110,101,110,116,40,41,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,47,47,32,97,110,100,32,97,32,102,105,108,101,45,99,104,111,111,115,101,114,46,46,13,10,32,32,32,32,32,32,32,32, + 97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,102,105,108,101,67,104,111,111,115,101,114,32,61,32,110,101,119,32,70,105,108, + 101,110,97,109,101,67,111,109,112,111,110,101,110,116,32,40,84,40,34,109,111,118,105,101,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,58,58,110,111,110,101,120,105,115,116,101,110,116,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,44,32,102,97,108,115,101,44,32,102,97,108,115,101,44,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,42,46,42,34,41,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,116,114,105,110,103,58,58,101,109,112,116,121,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,40,99,104,111,111,115,101,32,97,32,118,105,100,101,111,32,102,105,108,101, + 32,116,111,32,112,108,97,121,41,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114,45,62,97,100,100, + 76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114,45,62,115, + 101,116,66,114,111,119,115,101,66,117,116,116,111,110,84,101,120,116,32,40,84,40,34,98,114,111,119,115,101,34,41,41,59,13,10,32,32,32,32,125, + 13,10,13,10,32,32,32,32,126,81,117,105,99,107,84,105,109,101,87,105,110,100,111,119,87,105,116,104,70,105,108,101,66,114,111,119,115,101,114,40, + 41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,113,116,67,111,109,112,45,62,115,101,116,66,111,117,110,100,115,32,40,48,44,32,48,44,32,103,101,116,87,105,100,116,104,40,41,44, + 32,103,101,116,72,101,105,103,104,116,40,41,32,45,32,51,48,41,59,13,10,32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114, + 45,62,115,101,116,66,111,117,110,100,115,32,40,48,44,32,103,101,116,72,101,105,103,104,116,40,41,32,45,32,50,52,44,32,103,101,116,87,105,100, + 116,104,40,41,44,32,50,52,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,102,105,108,101,110,97,109,101,67,111, + 109,112,111,110,101,110,116,67,104,97,110,103,101,100,32,40,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116,42,41,13,10,32,32,32, + 32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115,32,105,115,32,99,97,108,108,101,100,32,119,104,101,110,32,116,104,101,32,117, + 115,101,114,32,99,104,97,110,103,101,115,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,110,32,116,104,101,32,102,105,108,101,32,99,104,111, + 111,115,101,114,32,98,111,120,13,10,32,32,32,32,32,32,32,32,105,102,32,40,113,116,67,111,109,112,45,62,108,111,97,100,77,111,118,105,101,32, + 40,102,105,108,101,67,104,111,111,115,101,114,45,62,103,101,116,67,117,114,114,101,110,116,70,105,108,101,40,41,44,32,116,114,117,101,41,41,13,10, + 32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,108,111,97,100,101,100,32,116,104,101,32,102,105,108, + 101,32,111,107,44,32,115,111,32,108,101,116,39,115,32,115,116,97,114,116,32,105,116,32,112,108,97,121,105,110,103,46,46,13,10,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,113,116,67,111,109,112,45,62,112,108,97,121,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32, + 32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87, + 105,110,100,111,119,58,58,115,104,111,119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,87,97,114,110, + 105,110,103,73,99,111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,84,40,34,67,111,117,108,100,110,39,116,32,108,111,97,100,32,116,104,101,32,102,105,108,101,33,34,41,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,84,40,34,83,111,114,114,121,44,32,81,117,105,99,107,84,105,109,101,32,100,105,100,110,39,116,32,109,97,110,97,103,101,32,116,111,32, + 108,111,97,100,32,116,104,97,116,32,102,105,108,101,33,34,41,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13, + 10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,81,117,105,99,107,84,105,109,101,77,111,118,105,101,67,111,109,112,111,110,101,110,116,42,32, + 113,116,67,111,109,112,59,13,10,32,32,32,32,70,105,108,101,110,97,109,101,67,111,109,112,111,110,101,110,116,42,32,102,105,108,101,67,104,111,111, + 115,101,114,59,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,81,117,105,99,107,84,105,109,101,68,101,109,111,32,32,58,32,112, + 117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,81, + 117,105,99,107,84,105,109,101,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40, + 84,40,34,81,117,105,99,107,84,105,109,101,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,97,100,100,32,97,32,109,111,118, + 105,101,32,99,111,109,112,111,110,101,110,116,46,46,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108, + 101,32,40,113,116,67,111,109,112,49,32,61,32,110,101,119,32,81,117,105,99,107,84,105,109,101,87,105,110,100,111,119,87,105,116,104,70,105,108,101, + 66,114,111,119,115,101,114,40,41,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 113,116,67,111,109,112,50,32,61,32,110,101,119,32,81,117,105,99,107,84,105,109,101,87,105,110,100,111,119,87,105,116,104,70,105,108,101,66,114,111, + 119,115,101,114,40,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,81,117,105,99,107,84,105,109,101,68,101,109,111,40,41,13, + 10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,113,116,67,111,109,112,49,45,62,115,101,116,66,111,117,110,100,115,82,101,108,97,116,105,118,101,32,40,48,46,48,53,102,44,32,48,46,48, + 53,102,44,32,48,46,52,50,53,102,44,32,48,46,57,102,41,59,13,10,32,32,32,32,32,32,32,32,113,116,67,111,109,112,50,45,62,115,101,116, + 66,111,117,110,100,115,82,101,108,97,116,105,118,101,32,40,48,46,53,50,53,102,44,32,48,46,48,53,102,44,32,48,46,52,50,53,102,44,32,48, + 46,57,102,41,59,13,10,32,32,32,32,125,13,10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,81,117,105,99, + 107,84,105,109,101,87,105,110,100,111,119,87,105,116,104,70,105,108,101,66,114,111,119,115,101,114,42,32,113,116,67,111,109,112,49,59,13,10,32,32, + 32,32,81,117,105,99,107,84,105,109,101,87,105,110,100,111,119,87,105,116,104,70,105,108,101,66,114,111,119,115,101,114,42,32,113,116,67,111,109,112, + 50,59,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,81,117,105,99,107,84,105,109,101, + 68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,81,117,105,99,107,84,105,109,101,68,101,109,111,40, + 41,59,13,10,125,13,10,13,10,35,101,110,100,105,102,13,10,0,0}; +const char* BinaryData::quicktimedemo_cpp = (const char*) temp11; + +static const unsigned char temp12[] = {13,10,70,89,73,46,46,13,10,13,10,84,111,32,101,109,98,101,100,32,116,104,101,32,102,105,108,101,115,32,97,110,100,32,116,104,105,110,103,115, + 32,116,104,97,116,32,116,104,101,32,100,101,109,111,32,110,101,101,100,115,32,105,110,116,111,32,105,116,115,32,101,120,101,99,117,116,97,98,108,101, + 44,32,13,10,73,39,118,101,32,117,115,101,100,32,109,121,32,66,105,110,97,114,121,66,117,105,108,100,101,114,32,117,116,105,108,105,116,121,32,45, + 32,116,104,101,32,102,105,108,101,115,32,105,110,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121,32,97,114,101,32,116,104,101,13,10,111,110, + 101,115,32,116,104,97,116,32,103,101,116,32,101,110,99,111,100,101,100,32,105,110,116,111,32,66,105,110,97,114,121,68,97,116,97,46,99,112,112,32, + 97,110,100,32,66,105,110,97,114,121,68,97,116,97,46,104,44,32,119,104,105,99,104,32,103,101,116,32,98,117,105,108,116,32,13,10,105,110,116,111, + 32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,46,13,10,0,0}; +const char* BinaryData::readme__what_this_directory_is_for_txt = (const char*) temp12; + +static const unsigned char temp13[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,47,42,42,13,10,32,32,32,32,84,104,105,115,32,99,108,97,115,115,32,115,104,111,119,115,32,104,111,119,32,116,111,32,105,109,112, + 108,101,109,101,110,116,32,97,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100,101,108,32,116,111,32,115,104,111,119,32,105,110,32,97,32, + 84,97,98,108,101,76,105,115,116,66,111,120,46,13,10,42,47,13,10,99,108,97,115,115,32,84,97,98,108,101,68,101,109,111,67,111,109,112,111,110, + 101,110,116,32,32,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100, + 101,108,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,84,97,98,108,101,68,101,109,111,67,111,109,112,111, + 110,101,110,116,40,41,13,10,32,32,32,32,32,32,32,32,58,32,102,111,110,116,32,40,49,52,46,48,102,41,44,13,10,32,32,32,32,32,32,32, + 32,32,32,100,101,109,111,68,97,116,97,32,40,48,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,76,111,97,100,32, + 115,111,109,101,32,100,97,116,97,32,102,114,111,109,32,97,110,32,101,109,98,101,100,100,101,100,32,88,77,76,32,102,105,108,101,46,46,13,10,32, + 32,32,32,32,32,32,32,108,111,97,100,68,97,116,97,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,67,114,101,97,116,101,32, + 111,117,114,32,116,97,98,108,101,32,99,111,109,112,111,110,101,110,116,32,97,110,100,32,97,100,100,32,105,116,32,116,111,32,116,104,105,115,32,99, + 111,109,112,111,110,101,110,116,46,46,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116, + 97,98,108,101,32,61,32,110,101,119,32,84,97,98,108,101,76,105,115,116,66,111,120,32,40,84,40,34,100,101,109,111,32,116,97,98,108,101,34,41, + 44,32,116,104,105,115,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,103,105,118,101,32,105,116,32,97,32,98,111,114,100,101,114, + 13,10,32,32,32,32,32,32,32,32,116,97,98,108,101,45,62,115,101,116,67,111,108,111,117,114,32,40,76,105,115,116,66,111,120,58,58,111,117,116, + 108,105,110,101,67,111,108,111,117,114,73,100,44,32,67,111,108,111,117,114,115,58,58,103,114,101,121,41,59,13,10,32,32,32,32,32,32,32,32,116, + 97,98,108,101,45,62,115,101,116,79,117,116,108,105,110,101,84,104,105,99,107,110,101,115,115,32,40,49,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,47,47,32,65,100,100,32,115,111,109,101,32,99,111,108,117,109,110,115,32,116,111,32,116,104,101,32,116,97,98,108,101,32,104,101,97,100,101, + 114,44,32,98,97,115,101,100,32,111,110,32,116,104,101,32,99,111,108,117,109,110,32,108,105,115,116,32,105,110,32,111,117,114,32,100,97,116,97,98, + 97,115,101,46,46,13,10,32,32,32,32,32,32,32,32,102,111,114,69,97,99,104,88,109,108,67,104,105,108,100,69,108,101,109,101,110,116,32,40,42, + 99,111,108,117,109,110,76,105,115,116,44,32,99,111,108,117,109,110,88,109,108,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,116,97,98,108,101,45,62,103,101,116,72,101,97,100,101,114,40,41,45,62,97,100,100,67,111,108,117,109,110,32,40,99,111, + 108,117,109,110,88,109,108,45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105,98,117,116,101,32,84,40,34,110,97,109,101,34,41,44,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,99,111,108,117,109,110,88,109,108,45,62,103,101,116,73,110,116,65,116,116,114,105,98,117,116,101,32,84,40,34,99,111,108,117,109,110,73, + 100,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,99,111,108,117,109,110,88,109,108,45,62,103,101,116,73,110,116,65,116,116,114,105,98,117,116,101,32,84,40,34,119, + 105,100,116,104,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,53,48,44,32,52,48,48,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,97,98,108,101,72,101,97,100,101,114,67,111,109,112, + 111,110,101,110,116,58,58,100,101,102,97,117,108,116,70,108,97,103,115,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32, + 32,32,32,32,47,47,32,119,101,32,99,111,117,108,100,32,110,111,119,32,99,104,97,110,103,101,32,115,111,109,101,32,105,110,105,116,105,97,108,32, + 115,101,116,116,105,110,103,115,46,46,13,10,32,32,32,32,32,32,32,32,116,97,98,108,101,45,62,103,101,116,72,101,97,100,101,114,40,41,45,62, + 115,101,116,83,111,114,116,67,111,108,117,109,110,73,100,32,40,49,44,32,116,114,117,101,41,59,32,47,47,32,115,111,114,116,32,102,111,114,119,97, + 114,100,115,32,98,121,32,116,104,101,32,73,68,32,99,111,108,117,109,110,13,10,32,32,32,32,32,32,32,32,116,97,98,108,101,45,62,103,101,116, + 72,101,97,100,101,114,40,41,45,62,115,101,116,67,111,108,117,109,110,86,105,115,105,98,108,101,32,40,55,44,32,102,97,108,115,101,41,59,32,47, + 47,32,104,105,100,101,32,116,104,101,32,34,108,101,110,103,116,104,34,32,99,111,108,117,109,110,32,117,110,116,105,108,32,116,104,101,32,117,115,101, + 114,32,115,104,111,119,115,32,105,116,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,117,110,45,99,111,109,109,101,110,116,32,116,104,105,115, + 32,108,105,110,101,32,116,111,32,104,97,118,101,32,97,32,103,111,32,111,102,32,115,116,114,101,116,99,104,45,116,111,45,102,105,116,32,109,111,100, + 101,13,10,32,32,32,32,32,32,32,32,47,47,32,116,97,98,108,101,45,62,103,101,116,72,101,97,100,101,114,40,41,45,62,115,101,116,83,116,114, + 101,116,99,104,84,111,70,105,116,65,99,116,105,118,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,84, + 97,98,108,101,68,101,109,111,67,111,109,112,111,110,101,110,116,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101, + 116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,100,101,109,111,68, + 97,116,97,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,84,104,105,115,32,105,115,32,111,118,101,114, + 108,111,97,100,101,100,32,102,114,111,109,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100,101,108,44,32,97,110,100,32,109,117,115,116,32, + 114,101,116,117,114,110,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,114,111,119,115,32,105,110,32,111,117,114,32,116, + 97,98,108,101,13,10,32,32,32,32,105,110,116,32,103,101,116,78,117,109,82,111,119,115,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,114,101,116,117,114,110,32,110,117,109,82,111,119,115,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,84,104,105,115, + 32,105,115,32,111,118,101,114,108,111,97,100,101,100,32,102,114,111,109,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100,101,108,44,32,97, + 110,100,32,115,104,111,117,108,100,32,102,105,108,108,32,105,110,32,116,104,101,32,98,97,99,107,103,114,111,117,110,100,32,111,102,32,116,104,101,32, + 119,104,111,108,101,32,114,111,119,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,82,111,119,66,97,99,107,103,114,111,117,110,100,32,40, + 71,114,97,112,104,105,99,115,38,32,103,44,32,105,110,116,32,114,111,119,78,117,109,98,101,114,44,32,105,110,116,32,119,105,100,116,104,44,32,105, + 110,116,32,104,101,105,103,104,116,44,32,98,111,111,108,32,114,111,119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,123,13,10,32, + 32,32,32,32,32,32,32,105,102,32,40,114,111,119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103, + 46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58,58,108,105,103,104,116,98,108,117,101,41,59,13,10,32,32,32,32,125,13,10,13, + 10,32,32,32,32,47,47,32,84,104,105,115,32,105,115,32,111,118,101,114,108,111,97,100,101,100,32,102,114,111,109,32,84,97,98,108,101,76,105,115, + 116,66,111,120,77,111,100,101,108,44,32,97,110,100,32,109,117,115,116,32,112,97,105,110,116,32,97,110,121,32,99,101,108,108,115,32,116,104,97,116, + 32,97,114,101,110,39,116,32,117,115,105,110,103,32,99,117,115,116,111,109,13,10,32,32,32,32,47,47,32,99,111,109,112,111,110,101,110,116,115,46, + 13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,67,101,108,108,32,40,71,114,97,112,104,105,99,115,38,32,103,44,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,114,111,119,78,117,109,98,101,114,44,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,99,111,108,117,109,110,73,100,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,105,110,116,32,119,105,100,116,104,44,32,105,110,116,32,104,101,105,103,104,116,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,98,111,111,108,32,114,111,119,73,115,83,101,108,101,99,116,101,100,41,13,10,32,32,32,32,123,13,10,32, + 32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,32,32, + 32,32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40,102,111,110,116,41,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116, + 32,88,109,108,69,108,101,109,101,110,116,42,32,114,111,119,69,108,101,109,101,110,116,32,61,32,100,97,116,97,76,105,115,116,45,62,103,101,116,67, + 104,105,108,100,69,108,101,109,101,110,116,32,40,114,111,119,78,117,109,98,101,114,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40, + 114,111,119,69,108,101,109,101,110,116,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,99,111,110,115,116,32,83,116,114,105,110,103,32,116,101,120,116,32,40,114,111,119,69,108,101,109,101,110,116,45,62,103,101,116,83,116,114,105,110, + 103,65,116,116,114,105,98,117,116,101,32,40,103,101,116,65,116,116,114,105,98,117,116,101,78,97,109,101,70,111,114,67,111,108,117,109,110,73,100,32, + 40,99,111,108,117,109,110,73,100,41,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,84,101,120,116,32, + 40,116,101,120,116,44,32,50,44,32,48,44,32,119,105,100,116,104,32,45,32,52,44,32,104,101,105,103,104,116,44,32,74,117,115,116,105,102,105,99, + 97,116,105,111,110,58,58,99,101,110,116,114,101,100,76,101,102,116,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13, + 10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,46,119,105,116, + 104,65,108,112,104,97,32,40,48,46,50,102,41,41,59,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,82,101,99,116,32,40,119,105,100, + 116,104,32,45,32,49,44,32,48,44,32,49,44,32,104,101,105,103,104,116,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32, + 84,104,105,115,32,105,115,32,111,118,101,114,108,111,97,100,101,100,32,102,114,111,109,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100,101, + 108,44,32,97,110,100,32,116,101,108,108,115,32,117,115,32,116,104,97,116,32,116,104,101,32,117,115,101,114,32,104,97,115,32,99,108,105,99,107,101, + 100,32,97,32,116,97,98,108,101,32,104,101,97,100,101,114,13,10,32,32,32,32,47,47,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,115, + 111,114,116,32,111,114,100,101,114,46,13,10,32,32,32,32,118,111,105,100,32,115,111,114,116,79,114,100,101,114,67,104,97,110,103,101,100,32,40,105, + 110,116,32,110,101,119,83,111,114,116,67,111,108,117,109,110,73,100,44,32,99,111,110,115,116,32,98,111,111,108,32,105,115,70,111,114,119,97,114,100, + 115,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,110,101,119,83,111,114,116,67,111,108,117,109,110,73,100,32,33, + 61,32,48,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,101,109,111,68,97,116,97,83,111,114, + 116,101,114,32,115,111,114,116,101,114,32,40,103,101,116,65,116,116,114,105,98,117,116,101,78,97,109,101,70,111,114,67,111,108,117,109,110,73,100,32, + 40,110,101,119,83,111,114,116,67,111,108,117,109,110,73,100,41,44,32,105,115,70,111,114,119,97,114,100,115,41,59,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,100,97,116,97,76,105,115,116,45,62,115,111,114,116,67,104,105,108,100,69,108,101,109,101,110,116,115,32,40,115,111,114,116,101,114, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,97,98,108,101,45,62,117,112,100,97,116,101,67,111,110,116,101,110,116,40,41, + 59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,84,104,105,115,32,105,115,32,111,118, + 101,114,108,111,97,100,101,100,32,102,114,111,109,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100,101,108,44,32,97,110,100,32,109,117,115, + 116,32,117,112,100,97,116,101,32,97,110,121,32,99,117,115,116,111,109,32,99,111,109,112,111,110,101,110,116,115,32,116,104,97,116,32,119,101,39,114, + 101,32,117,115,105,110,103,13,10,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,114,101,102,114,101,115,104,67,111,109,112,111,110,101,110,116, + 70,111,114,67,101,108,108,32,40,105,110,116,32,114,111,119,78,117,109,98,101,114,44,32,105,110,116,32,99,111,108,117,109,110,73,100,44,32,98,111, + 111,108,32,105,115,82,111,119,83,101,108,101,99,116,101,100,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,101,120,105,115,116,105,110,103,67,111, + 109,112,111,110,101,110,116,84,111,85,112,100,97,116,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,99,111,108, + 117,109,110,73,100,32,61,61,32,53,41,32,47,47,32,73,102,32,105,116,39,115,32,116,104,101,32,114,97,116,105,110,103,115,32,99,111,108,117,109, + 110,44,32,119,101,39,108,108,32,114,101,116,117,114,110,32,111,117,114,32,99,117,115,116,111,109,32,99,111,109,112,111,110,101,110,116,46,46,13,10, + 32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,82,97,116,105,110,103,67,111,108,117,109,110,67,117,115,116,111, + 109,67,111,109,112,111,110,101,110,116,42,32,114,97,116,105,110,103,115,66,111,120,32,61,32,40,82,97,116,105,110,103,67,111,108,117,109,110,67,117, + 115,116,111,109,67,111,109,112,111,110,101,110,116,42,41,32,101,120,105,115,116,105,110,103,67,111,109,112,111,110,101,110,116,84,111,85,112,100,97,116, + 101,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,73,102,32,97,110,32,101,120,105,115,116,105,110,103,32,99,111,109,112, + 111,110,101,110,116,32,105,115,32,98,101,105,110,103,32,112,97,115,115,101,100,45,105,110,32,102,111,114,32,117,112,100,97,116,105,110,103,44,32,119, + 101,39,108,108,32,114,101,45,117,115,101,32,105,116,44,32,98,117,116,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,105,102,32,110, + 111,116,44,32,119,101,39,108,108,32,104,97,118,101,32,116,111,32,99,114,101,97,116,101,32,111,110,101,46,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,105,102,32,40,114,97,116,105,110,103,115,66,111,120,32,61,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,114,97,116,105,110,103,115,66,111,120,32,61,32,110,101,119,32,82,97,116,105,110,103,67,111,108,117,109,110,67,117,115,116,111,109,67,111,109,112, + 111,110,101,110,116,32,40,42,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,97,116,105,110,103,115,66,111,120, + 45,62,115,101,116,82,111,119,65,110,100,67,111,108,117,109,110,32,40,114,111,119,78,117,109,98,101,114,44,32,99,111,108,117,109,110,73,100,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,114,97,116,105,110,103,115,66,111,120,59,13,10,32,32,32,32, + 32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,47,47,32,102,111,114,32,97,110,121,32,111,116,104,101,114,32,99,111,108,117,109,110,44,32,106,117,115,116,32,114,101,116,117,114,110, + 32,48,44,32,97,115,32,119,101,39,108,108,32,98,101,32,112,97,105,110,116,105,110,103,32,116,104,101,115,101,32,99,111,108,117,109,110,115,32,100, + 105,114,101,99,116,108,121,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,106,97,115,115,101,114,116,32,40,101,120,105,115,116,105,110, + 103,67,111,109,112,111,110,101,110,116,84,111,85,112,100,97,116,101,32,61,61,32,48,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114, + 101,116,117,114,110,32,48,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,84,104,105, + 115,32,105,115,32,111,118,101,114,108,111,97,100,101,100,32,102,114,111,109,32,84,97,98,108,101,76,105,115,116,66,111,120,77,111,100,101,108,44,32, + 97,110,100,32,115,104,111,117,108,100,32,99,104,111,111,115,101,32,116,104,101,32,98,101,115,116,32,119,105,100,116,104,32,102,111,114,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,13,10,32,32,32,32,47,47,32,99,111,108,117,109,110,46,13,10,32,32,32,32,105,110,116,32,103,101,116,67, + 111,108,117,109,110,65,117,116,111,83,105,122,101,87,105,100,116,104,32,40,105,110,116,32,99,111,108,117,109,110,73,100,41,13,10,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,105,102,32,40,99,111,108,117,109,110,73,100,32,61,61,32,53,41,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,114,101,116,117,114,110,32,49,48,48,59,32,47,47,32,40,116,104,105,115,32,105,115,32,116,104,101,32,114,97,116,105,110,103,115,32,99,111, + 108,117,109,110,44,32,99,111,110,116,97,105,110,105,110,103,32,97,32,99,117,115,116,111,109,32,99,111,109,112,111,110,101,110,116,41,13,10,13,10, + 32,32,32,32,32,32,32,32,105,110,116,32,119,105,100,101,115,116,32,61,32,51,50,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,102, + 105,110,100,32,116,104,101,32,119,105,100,101,115,116,32,98,105,116,32,111,102,32,116,101,120,116,32,105,110,32,116,104,105,115,32,99,111,108,117,109, + 110,46,46,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,103,101,116,78,117,109,82,111,119,115,40,41,59,32, + 45,45,105,32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116, + 32,88,109,108,69,108,101,109,101,110,116,42,32,114,111,119,69,108,101,109,101,110,116,32,61,32,100,97,116,97,76,105,115,116,45,62,103,101,116,67, + 104,105,108,100,69,108,101,109,101,110,116,32,40,105,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,114,111,119,69, + 108,101,109,101,110,116,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,99,111,110,115,116,32,83,116,114,105,110,103,32,116,101,120,116,32,40,114,111,119,69,108,101,109,101,110,116,45,62,103,101,116,83, + 116,114,105,110,103,65,116,116,114,105,98,117,116,101,32,40,103,101,116,65,116,116,114,105,98,117,116,101,78,97,109,101,70,111,114,67,111,108,117,109, + 110,73,100,32,40,99,111,108,117,109,110,73,100,41,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,119,105,100, + 101,115,116,32,61,32,106,109,97,120,32,40,119,105,100,101,115,116,44,32,102,111,110,116,46,103,101,116,83,116,114,105,110,103,87,105,100,116,104,32, + 40,116,101,120,116,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32, + 32,32,32,32,32,32,114,101,116,117,114,110,32,119,105,100,101,115,116,32,43,32,56,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47, + 47,32,65,32,99,111,117,112,108,101,32,111,102,32,113,117,105,99,107,32,109,101,116,104,111,100,115,32,116,111,32,115,101,116,32,97,110,100,32,103, + 101,116,32,116,104,101,32,34,114,97,116,105,110,103,34,32,118,97,108,117,101,32,119,104,101,110,32,116,104,101,32,117,115,101,114,13,10,32,32,32, + 32,47,47,32,99,104,97,110,103,101,115,32,116,104,101,32,99,111,109,98,111,32,98,111,120,13,10,32,32,32,32,105,110,116,32,103,101,116,82,97, + 116,105,110,103,32,40,99,111,110,115,116,32,105,110,116,32,114,111,119,78,117,109,98,101,114,44,32,99,111,110,115,116,32,105,110,116,32,99,111,108, + 117,109,110,73,100,41,32,99,111,110,115,116,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,97,116,97, + 76,105,115,116,45,62,103,101,116,67,104,105,108,100,69,108,101,109,101,110,116,32,40,114,111,119,78,117,109,98,101,114,41,45,62,103,101,116,73,110, + 116,65,116,116,114,105,98,117,116,101,32,40,84,40,34,82,97,116,105,110,103,34,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32, + 118,111,105,100,32,115,101,116,82,97,116,105,110,103,32,40,99,111,110,115,116,32,105,110,116,32,114,111,119,78,117,109,98,101,114,44,32,99,111,110, + 115,116,32,105,110,116,32,99,111,108,117,109,110,73,100,44,32,99,111,110,115,116,32,105,110,116,32,110,101,119,82,97,116,105,110,103,41,13,10,32, + 32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,97,116,97,76,105,115,116,45,62,103,101,116,67,104,105,108,100,69,108,101,109,101,110,116,32, + 40,114,111,119,78,117,109,98,101,114,41,45,62,115,101,116,65,116,116,114,105,98,117,116,101,32,40,84,40,34,82,97,116,105,110,103,34,41,44,32, + 110,101,119,82,97,116,105,110,103,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,118,111,105,100,32,114,101,115, + 105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,112,111,115,105,116,105,111,110,32,111,117,114,32,116, + 97,98,108,101,32,119,105,116,104,32,97,32,103,97,112,32,97,114,111,117,110,100,32,105,116,115,32,101,100,103,101,13,10,32,32,32,32,32,32,32, + 32,116,97,98,108,101,45,62,115,101,116,66,111,117,110,100,115,73,110,115,101,116,32,40,66,111,114,100,101,114,83,105,122,101,32,40,56,41,41,59, + 13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,106,117,99,101,95,85,115,101,68,101,98,117,103,103,105,110,103,78,101, + 119,79,112,101,114,97,116,111,114,13,10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,84,97,98,108,101,76,105,115,116,66,111,120,42, + 32,116,97,98,108,101,59,32,32,32,32,47,47,32,116,104,101,32,116,97,98,108,101,32,99,111,109,112,111,110,101,110,116,32,105,116,115,101,108,102, + 13,10,32,32,32,32,70,111,110,116,32,102,111,110,116,59,13,10,13,10,32,32,32,32,88,109,108,69,108,101,109,101,110,116,42,32,100,101,109,111, + 68,97,116,97,59,32,32,32,47,47,32,84,104,105,115,32,105,115,32,116,104,101,32,88,77,76,32,100,111,99,117,109,101,110,116,32,108,111,97,100, + 101,100,32,102,114,111,109,32,116,104,101,32,101,109,98,101,100,100,101,100,32,102,105,108,101,32,34,100,101,109,111,32,116,97,98,108,101,32,100,97, + 116,97,46,120,109,108,34,13,10,32,32,32,32,88,109,108,69,108,101,109,101,110,116,42,32,99,111,108,117,109,110,76,105,115,116,59,32,47,47,32, + 65,32,112,111,105,110,116,101,114,32,116,111,32,116,104,101,32,115,117,98,45,110,111,100,101,32,111,102,32,100,101,109,111,68,97,116,97,32,116,104, + 97,116,32,99,111,110,116,97,105,110,115,32,116,104,101,32,108,105,115,116,32,111,102,32,99,111,108,117,109,110,115,13,10,32,32,32,32,88,109,108, + 69,108,101,109,101,110,116,42,32,100,97,116,97,76,105,115,116,59,32,32,32,47,47,32,65,32,112,111,105,110,116,101,114,32,116,111,32,116,104,101, + 32,115,117,98,45,110,111,100,101,32,111,102,32,100,101,109,111,68,97,116,97,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,104,101,32, + 108,105,115,116,32,111,102,32,100,97,116,97,32,114,111,119,115,13,10,32,32,32,32,105,110,116,32,110,117,109,82,111,119,115,59,32,32,32,32,32, + 32,32,32,32,32,32,32,47,47,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,114,111,119,115,32,111,102,32,100,97,116,97,32,119,101,39, + 118,101,32,103,111,116,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,84,104,105,115,32,105,115,32,97,32,99,117,115,116,111,109,32, + 99,111,109,112,111,110,101,110,116,32,99,111,110,116,97,105,110,105,110,103,32,97,32,99,111,109,98,111,32,98,111,120,44,32,119,104,105,99,104,32, + 119,101,39,114,101,32,103,111,105,110,103,32,116,111,32,112,117,116,32,105,110,115,105,100,101,13,10,32,32,32,32,47,47,32,111,117,114,32,116,97, + 98,108,101,39,115,32,34,114,97,116,105,110,103,34,32,99,111,108,117,109,110,46,13,10,32,32,32,32,99,108,97,115,115,32,82,97,116,105,110,103, + 67,111,108,117,109,110,67,117,115,116,111,109,67,111,109,112,111,110,101,110,116,32,32,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110, + 101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,67,111,109,98,111,66,111,120,76,105,115,116,101,110,101,114,13,10,32,32,32,32,123,13, + 10,32,32,32,32,112,117,98,108,105,99,58,13,10,32,32,32,32,32,32,32,32,82,97,116,105,110,103,67,111,108,117,109,110,67,117,115,116,111,109, + 67,111,109,112,111,110,101,110,116,32,40,84,97,98,108,101,68,101,109,111,67,111,109,112,111,110,101,110,116,38,32,111,119,110,101,114,95,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,58,32,111,119,110,101,114,32,40,111,119,110,101,114,95,41,13,10,32,32,32,32,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,106,117,115,116,32,112,117,116,32,97,32,99,111,109,98,111,32,98,111,120,32,105,110,115, + 105,100,101,32,116,104,105,115,32,99,111,109,112,111,110,101,110,116,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97, + 107,101,86,105,115,105,98,108,101,32,40,99,111,109,98,111,66,111,120,32,61,32,110,101,119,32,67,111,109,98,111,66,111,120,32,40,83,116,114,105, + 110,103,58,58,101,109,112,116,121,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,97,100,100,73, + 116,101,109,32,40,84,40,34,102,97,98,34,41,44,32,49,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120, + 45,62,97,100,100,73,116,101,109,32,40,84,40,34,103,114,111,111,118,121,34,41,44,32,50,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,99,111,109,98,111,66,111,120,45,62,97,100,100,73,116,101,109,32,40,84,40,34,104,101,112,34,41,44,32,51,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,97,100,100,73,116,101,109,32,40,84,40,34,110,101,97,116,34,41,44,32,52,41,59, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,97,100,100,73,116,101,109,32,40,84,40,34,119,105,108,100, + 34,41,44,32,53,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,97,100,100,73,116,101,109,32,40, + 84,40,34,115,119,105,110,103,105,110,34,41,44,32,54,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45, + 62,97,100,100,73,116,101,109,32,40,84,40,34,109,97,100,32,102,111,114,32,105,116,34,41,44,32,55,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,47,47,32,119,104,101,110,32,116,104,101,32,99,111,109,98,111,32,105,115,32,99,104,97,110,103,101,100,44,32,119,101,39,108, + 108,32,103,101,116,32,97,32,99,97,108,108,98,97,99,107,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45, + 62,97,100,100,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66, + 111,120,45,62,115,101,116,87,97,110,116,115,75,101,121,98,111,97,114,100,70,111,99,117,115,32,40,102,97,108,115,101,41,59,13,10,32,32,32,32, + 32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,126,82,97,116,105,110,103,67,111,108,117,109,110,67,117,115,116,111,109,67,111,109,112, + 111,110,101,110,116,40,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108, + 108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32, + 114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66, + 111,120,45,62,115,101,116,66,111,117,110,100,115,73,110,115,101,116,32,40,66,111,114,100,101,114,83,105,122,101,32,40,50,41,41,59,13,10,32,32, + 32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,79,117,114,32,100,101,109,111,32,99,111,100,101,32,119,105,108,108, + 32,99,97,108,108,32,116,104,105,115,32,119,104,101,110,32,119,101,32,109,97,121,32,110,101,101,100,32,116,111,32,117,112,100,97,116,101,32,111,117, + 114,32,99,111,110,116,101,110,116,115,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,115,101,116,82,111,119,65,110,100,67,111,108,117,109,110, + 32,40,99,111,110,115,116,32,105,110,116,32,110,101,119,82,111,119,44,32,99,111,110,115,116,32,105,110,116,32,110,101,119,67,111,108,117,109,110,41, + 13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,111,119,32,61,32,110,101,119,82,111,119,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,99,111,108,117,109,110,73,100,32,61,32,110,101,119,67,111,108,117,109,110,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115,101,116,83,101,108,101,99,116,101,100,73,100,32,40,111,119,110,101,114,46,103,101, + 116,82,97,116,105,110,103,32,40,114,111,119,44,32,99,111,108,117,109,110,73,100,41,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32, + 32,125,13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,99,111,109,98,111,66,111,120,67,104,97,110,103,101,100,32,40,67,111,109,98, + 111,66,111,120,42,32,99,111,109,98,111,66,111,120,84,104,97,116,72,97,115,67,104,97,110,103,101,100,41,13,10,32,32,32,32,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,111,119,110,101,114,46,115,101,116,82,97,116,105,110,103,32,40,114,111,119,44,32,99,111,108,117, + 109,110,73,100,44,32,99,111,109,98,111,66,111,120,45,62,103,101,116,83,101,108,101,99,116,101,100,73,100,40,41,41,59,13,10,32,32,32,32,32, + 32,32,32,125,13,10,13,10,32,32,32,32,112,114,105,118,97,116,101,58,13,10,32,32,32,32,32,32,32,32,84,97,98,108,101,68,101,109,111,67, + 111,109,112,111,110,101,110,116,38,32,111,119,110,101,114,59,13,10,32,32,32,32,32,32,32,32,67,111,109,98,111,66,111,120,42,32,99,111,109,98, + 111,66,111,120,59,13,10,32,32,32,32,32,32,32,32,105,110,116,32,114,111,119,44,32,99,111,108,117,109,110,73,100,59,13,10,32,32,32,32,125, + 59,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,65,32,99,111,109,112,97,114,97,116,111,114,32,117,115,101,100,32,116,111,32,115, + 111,114,116,32,111,117,114,32,100,97,116,97,32,119,104,101,110,32,116,104,101,32,117,115,101,114,32,99,108,105,99,107,115,32,97,32,99,111,108,117, + 109,110,32,104,101,97,100,101,114,13,10,32,32,32,32,99,108,97,115,115,32,68,101,109,111,68,97,116,97,83,111,114,116,101,114,13,10,32,32,32, + 32,123,13,10,32,32,32,32,112,117,98,108,105,99,58,13,10,32,32,32,32,32,32,32,32,68,101,109,111,68,97,116,97,83,111,114,116,101,114,32, + 40,99,111,110,115,116,32,83,116,114,105,110,103,32,97,116,116,114,105,98,117,116,101,84,111,83,111,114,116,95,44,32,98,111,111,108,32,102,111,114, + 119,97,114,100,115,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,58,32,97,116,116,114,105,98,117,116,101,84,111,83,111,114,116,32,40,97, + 116,116,114,105,98,117,116,101,84,111,83,111,114,116,95,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,105,114,101,99,116,105, + 111,110,32,40,102,111,114,119,97,114,100,115,32,63,32,49,32,58,32,45,49,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,105,110,116,32,99,111,109,112,97,114,101,69,108,101,109,101,110,116,115,32,40,88,109,108, + 69,108,101,109,101,110,116,42,32,102,105,114,115,116,44,32,88,109,108,69,108,101,109,101,110,116,42,32,115,101,99,111,110,100,41,32,99,111,110,115, + 116,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,114,101,115,117,108,116,32,61,32,102, + 105,114,115,116,45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105,98,117,116,101,32,40,97,116,116,114,105,98,117,116,101,84,111,83,111,114, + 116,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,99,111,109,112,97,114,101,76, + 101,120,105,99,111,103,114,97,112,104,105,99,97,108,108,121,32,40,115,101,99,111,110,100,45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105, + 98,117,116,101,32,40,97,116,116,114,105,98,117,116,101,84,111,83,111,114,116,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 105,102,32,40,114,101,115,117,108,116,32,61,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,117,108,116, + 32,61,32,102,105,114,115,116,45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105,98,117,116,101,32,40,84,40,34,73,68,34,41,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,99,111,109,112,97,114,101,76,101,120,105,99, + 111,103,114,97,112,104,105,99,97,108,108,121,32,40,115,101,99,111,110,100,45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105,98,117,116,101, + 32,40,84,40,34,73,68,34,41,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,105,114,101,99, + 116,105,111,110,32,42,32,114,101,115,117,108,116,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,112,114,105,118,97,116,101, + 58,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,83,116,114,105,110,103,32,97,116,116,114,105,98,117,116,101,84,111,83,111,114,116,59, + 13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,100,105,114,101,99,116,105,111,110,59,13,10,32,32,32,32,125,59,13,10, + 13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,13,10,32,32,32,32,47,47,32,116,104,105,115,32,108,111,97,100,115,32,116,104,101,32,101,109,98,101,100,100,101,100,32,100, + 97,116,97,98,97,115,101,32,88,77,76,32,102,105,108,101,32,105,110,116,111,32,109,101,109,111,114,121,13,10,32,32,32,32,118,111,105,100,32,108, + 111,97,100,68,97,116,97,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,88,109,108,68,111,99,117,109,101,110,116,32,100,97, + 116,97,68,111,99,32,40,83,116,114,105,110,103,32,40,40,99,111,110,115,116,32,99,104,97,114,42,41,32,66,105,110,97,114,121,68,97,116,97,58, + 58,100,101,109,111,95,116,97,98,108,101,95,100,97,116,97,95,120,109,108,41,41,59,13,10,32,32,32,32,32,32,32,32,100,101,109,111,68,97,116, + 97,32,61,32,100,97,116,97,68,111,99,46,103,101,116,68,111,99,117,109,101,110,116,69,108,101,109,101,110,116,40,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,100,97,116,97,76,105,115,116,32,61,32,100,101,109,111,68,97,116,97,45,62,103,101,116,67,104,105,108,100,66,121,78,97,109,101, + 32,40,84,40,34,68,65,84,65,34,41,41,59,13,10,32,32,32,32,32,32,32,32,99,111,108,117,109,110,76,105,115,116,32,61,32,100,101,109,111, + 68,97,116,97,45,62,103,101,116,67,104,105,108,100,66,121,78,97,109,101,32,40,84,40,34,67,79,76,85,77,78,83,34,41,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,110,117,109,82,111,119,115,32,61,32,100,97,116,97,76,105,115,116,45,62,103,101,116,78,117,109,67,104,105,108,100,69, + 108,101,109,101,110,116,115,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,32,40,97,32,117,116,105,108,105,116,121,32,109, + 101,116,104,111,100,32,116,111,32,115,101,97,114,99,104,32,111,117,114,32,88,77,76,32,102,111,114,32,116,104,101,32,97,116,116,114,105,98,117,116, + 101,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,32,99,111,108,117,109,110,32,73,68,41,13,10,32,32,32,32,99,111,110,115,116,32,83, + 116,114,105,110,103,32,103,101,116,65,116,116,114,105,98,117,116,101,78,97,109,101,70,111,114,67,111,108,117,109,110,73,100,32,40,99,111,110,115,116, + 32,105,110,116,32,99,111,108,117,109,110,73,100,41,32,99,111,110,115,116,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,102,111,114, + 69,97,99,104,88,109,108,67,104,105,108,100,69,108,101,109,101,110,116,32,40,42,99,111,108,117,109,110,76,105,115,116,44,32,99,111,108,117,109,110, + 88,109,108,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,99,111,108,117,109,110,88, + 109,108,45,62,103,101,116,73,110,116,65,116,116,114,105,98,117,116,101,32,84,40,34,99,111,108,117,109,110,73,100,34,41,32,61,61,32,99,111,108, + 117,109,110,73,100,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,111,108,117,109,110,88,109,108, + 45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105,98,117,116,101,32,84,40,34,110,97,109,101,34,41,59,13,10,32,32,32,32,32,32,32, + 32,125,13,10,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,114,105,110,103,58,58,101,109,112,116,121,59,13,10,32,32,32, + 32,125,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,84,97,98,108,101,68,101,109,111, + 40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,84,97,98,108,101,68,101,109,111,67,111,109,112,111,110,101,110,116, + 40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::tabledemo_cpp = (const char*) temp13; + +static const unsigned char temp14[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,99,108,97,115,115,32,66,111,117,110,99,105,110,103,66,97,108,108,67,111,109,112,32,32,58,32,112,117,98,108,105,99,32,67,111,109, + 112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105, + 99,32,65,115,121,110,99,85,112,100,97,116,101,114,13,10,123,13,10,32,32,32,32,102,108,111,97,116,32,120,44,32,121,44,32,115,105,122,101,44, + 32,100,120,44,32,100,121,44,32,119,44,32,104,44,32,112,97,114,101,110,116,87,105,100,116,104,44,32,112,97,114,101,110,116,72,101,105,103,104,116, + 59,13,10,32,32,32,32,102,108,111,97,116,32,105,110,110,101,114,88,44,32,105,110,110,101,114,89,59,13,10,32,32,32,32,67,111,108,111,117,114, + 32,99,111,108,111,117,114,59,13,10,32,32,32,32,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,32,108,111,99,107,59,13,10,32,32,32, + 32,105,110,116,32,116,104,114,101,97,100,73,100,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,66,111,117,110,99,105,110,103,66, + 97,108,108,67,111,109,112,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,120,32,61,32,82,97,110,100,111,109,58,58,103,101, + 116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111,97,116,40,41,32,42,32,50,48,48,46,48,102,59,13,10,32, + 32,32,32,32,32,32,32,121,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120, + 116,70,108,111,97,116,40,41,32,42,32,50,48,48,46,48,102,59,13,10,32,32,32,32,32,32,32,32,112,97,114,101,110,116,87,105,100,116,104,32, + 61,32,53,48,59,13,10,32,32,32,32,32,32,32,32,112,97,114,101,110,116,72,101,105,103,104,116,32,61,32,53,48,59,13,10,32,32,32,32,32, + 32,32,32,105,110,110,101,114,88,32,61,32,48,59,13,10,32,32,32,32,32,32,32,32,105,110,110,101,114,89,32,61,32,48,59,13,10,32,32,32, + 32,32,32,32,32,116,104,114,101,97,100,73,100,32,61,32,48,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,102,108,111,97, + 116,32,115,112,101,101,100,32,61,32,53,46,48,102,59,32,47,47,32,103,105,118,101,32,101,97,99,104,32,98,97,108,108,32,97,32,102,105,120,101, + 100,32,115,112,101,101,100,32,115,111,32,119,101,32,99,97,110,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,115,101,101,32,116,104,101,32,101,102,102,101,99,116,115,32,111,102,32,116,104,114,101,97, + 100,32,112,114,105,111,114,105,116,121,32,111,110,32,104,111,119,32,102,97,115,116,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,104,101,121,32,97,99,116,117,97,108,108,121,32,103,111,46,13,10, + 32,32,32,32,32,32,32,32,99,111,110,115,116,32,102,108,111,97,116,32,97,110,103,108,101,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83, + 121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111,97,116,40,41,32,42,32,102,108,111,97,116,95,80,105,32,42,32,50, + 46,48,102,59,13,10,13,10,32,32,32,32,32,32,32,32,100,120,32,61,32,115,105,110,102,32,40,97,110,103,108,101,41,32,42,32,115,112,101,101, + 100,59,13,10,32,32,32,32,32,32,32,32,100,121,32,61,32,99,111,115,102,32,40,97,110,103,108,101,41,32,42,32,115,112,101,101,100,59,13,10, + 13,10,32,32,32,32,32,32,32,32,115,105,122,101,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109, + 40,41,46,110,101,120,116,70,108,111,97,116,40,41,32,42,32,51,48,46,48,102,32,43,32,51,48,46,48,102,59,13,10,13,10,32,32,32,32,32, + 32,32,32,99,111,108,111,117,114,32,61,32,67,111,108,111,117,114,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110, + 100,111,109,40,41,46,110,101,120,116,73,110,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,119, + 105,116,104,65,108,112,104,97,32,40,48,46,53,102,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,119,105, + 116,104,66,114,105,103,104,116,110,101,115,115,32,40,48,46,55,102,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,66,111,117,110, + 99,105,110,103,66,97,108,108,67,111,109,112,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100, + 32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,103,46,115, + 101,116,67,111,108,111,117,114,32,40,99,111,108,111,117,114,41,59,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,69,108,108,105,112,115, + 101,32,40,105,110,110,101,114,88,44,32,105,110,110,101,114,89,44,32,115,105,122,101,44,32,115,105,122,101,41,59,13,10,13,10,32,32,32,32,32, + 32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,32,32,32,32,32,32, + 32,32,103,46,115,101,116,70,111,110,116,32,40,49,48,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,84,101,120,116, + 32,40,83,116,114,105,110,103,58,58,116,111,72,101,120,83,116,114,105,110,103,32,40,116,104,114,101,97,100,73,100,41,44,32,48,44,32,48,44,32, + 103,101,116,87,105,100,116,104,40,41,44,32,103,101,116,72,101,105,103,104,116,40,41,44,32,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58, + 99,101,110,116,114,101,100,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,114,101, + 110,116,83,105,122,101,67,104,97,110,103,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,112,97,114,101,110,116,87,105, + 100,116,104,32,61,32,103,101,116,80,97,114,101,110,116,87,105,100,116,104,40,41,32,45,32,115,105,122,101,59,13,10,32,32,32,32,32,32,32,32, + 112,97,114,101,110,116,72,101,105,103,104,116,32,61,32,103,101,116,80,97,114,101,110,116,72,101,105,103,104,116,40,41,32,45,32,115,105,122,101,59, + 13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,104,97,110,100,108,101,65,115,121,110,99,85,112,100,97,116,101,40,41,13, + 10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,83,99,111,112,101,100,76,111,99,107,32,115,108,32,40,108,111,99, + 107,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,66,111,117,110,100,115,32,40,40,40,105,110,116,41,32,120,41,32,45,32,50,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,105,110,116,41,32,121,41,32,45,32,50,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,105,110,116,41,32,115,105,122,101,41,32,43,32,52,44,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,105,110,116,41,32,115,105,122,101,41,32,43,32,52,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,105,110,110,101,114,88,32,61,32,120,32,45,32,103,101,116,88,40,41,59,13,10,32,32,32,32,32,32,32,32,105,110,110,101,114,89, + 32,61,32,121,32,45,32,103,101,116,89,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,109,111,118,101,66,97,108,108,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,99,111,110,115,116,32,83,99,111,112,101,100,76,111,99,107,32,115,108,32,40,108,111,99,107,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,116,104,114,101,97,100,73,100,32,61,32,84,104,114,101,97,100,58,58,103,101,116,67,117,114,114,101,110,116,84,104,114,101,97,100,73,100,40, + 41,59,32,47,47,32,116,104,105,115,32,105,115,32,115,111,32,116,104,101,32,99,111,109,112,111,110,101,110,116,32,99,97,110,32,112,114,105,110,116, + 32,116,104,101,32,116,104,114,101,97,100,32,73,68,32,105,110,115,105,100,101,32,116,104,101,32,98,97,108,108,13,10,13,10,32,32,32,32,32,32, + 32,32,120,32,43,61,32,100,120,59,13,10,32,32,32,32,32,32,32,32,121,32,43,61,32,100,121,59,13,10,13,10,32,32,32,32,32,32,32,32, + 105,102,32,40,120,32,60,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,120,32,61,32,102,97,98,115,102,32,40,100,120,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,120,32,62,32,112,97,114,101,110,116,87,105,100,116,104,41,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,100,120,32,61,32,45,102,97,98,115,102,32,40,100,120,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,121, + 32,60,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,121,32,61,32,102,97,98,115,102,32,40,100,121,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,105,102,32,40,121,32,62,32,112,97,114,101,110,116,72,101,105,103,104,116,41,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,100,121,32,61,32,45,102,97,98,115,102,32,40,100,121,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115,32,105, + 115,32,99,97,108,108,101,100,32,111,110,32,97,32,98,97,99,107,103,114,111,117,110,100,32,116,104,114,101,97,100,44,32,115,111,32,119,101,32,100, + 111,110,39,116,32,119,97,110,116,32,116,111,32,99,97,108,108,13,10,32,32,32,32,32,32,32,32,47,47,32,97,110,121,32,85,73,32,99,111,100, + 101,32,102,114,111,109,32,104,101,114,101,32,45,32,105,110,115,116,101,97,100,32,119,101,39,108,108,32,116,114,105,103,103,101,114,32,97,110,32,101, + 118,101,110,116,32,116,104,97,116,32,119,105,108,108,32,117,112,100,97,116,101,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,99,111, + 109,112,111,110,101,110,116,39,115,32,112,111,115,105,116,105,111,110,32,108,97,116,101,114,46,32,84,104,105,115,32,105,115,32,97,32,115,97,102,101, + 32,119,97,121,32,116,111,32,97,118,111,105,100,32,100,101,97,100,108,111,99,107,115,13,10,32,32,32,32,32,32,32,32,116,114,105,103,103,101,114, + 65,115,121,110,99,85,112,100,97,116,101,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,106,117,99,101,95,85,115,101,68,101,98, + 117,103,103,105,110,103,78,101,119,79,112,101,114,97,116,111,114,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,68,101,109,111,84, + 104,114,101,97,100,32,32,32,32,58,32,112,117,98,108,105,99,32,66,111,117,110,99,105,110,103,66,97,108,108,67,111,109,112,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,84,104,114,101,97,100,13,10,123,13,10,32,32,32, + 32,105,110,116,32,105,110,116,101,114,118,97,108,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,68,101,109,111,84,104,114,101,97, + 100,40,41,13,10,32,32,32,32,32,32,32,32,58,32,84,104,114,101,97,100,32,40,84,40,34,74,117,99,101,32,68,101,109,111,32,84,104,114,101, + 97,100,34,41,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,110,116,101,114,118,97,108,32,61,32,82,97,110,100,111,109,58, + 58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,53,48,41,32,43,32,54,59,13,10,13,10, + 32,32,32,32,32,32,32,32,47,47,32,103,105,118,101,32,116,104,101,32,116,104,114,101,97,100,115,32,97,32,114,97,110,100,111,109,32,112,114,105, + 111,114,105,116,121,44,32,115,111,32,115,111,109,101,32,119,105,108,108,32,109,111,118,101,32,109,111,114,101,13,10,32,32,32,32,32,32,32,32,47, + 47,32,115,109,111,111,116,104,108,121,32,116,104,97,110,32,111,116,104,101,114,115,46,46,13,10,32,32,32,32,32,32,32,32,115,116,97,114,116,84, + 104,114,101,97,100,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116, + 32,40,51,41,32,43,32,51,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,101,109,111,84,104,114,101,97,100,40,41,13,10, + 32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,97,108,108,111,119,32,116,104,101,32,116,104,114,101,97,100,32,50,32,115,101,99, + 111,110,100,115,32,116,111,32,115,116,111,112,32,99,108,101,97,110,108,121,32,45,32,115,104,111,117,108,100,32,98,101,32,112,108,101,110,116,121,32, + 111,102,32,116,105,109,101,46,13,10,32,32,32,32,32,32,32,32,115,116,111,112,84,104,114,101,97,100,32,40,50,48,48,48,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,117,110,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47, + 32,116,104,105,115,32,105,115,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,114,117,110,115,32,116,104,105,115,32,116,104,114,101,97,100,32, + 45,32,119,101,39,108,108,32,108,111,111,112,32,99,111,110,116,105,110,117,111,117,115,108,121,44,13,10,32,32,32,32,32,32,32,32,47,47,32,117, + 112,100,97,116,105,110,103,32,116,104,101,32,99,111,45,111,114,100,105,110,97,116,101,115,32,111,102,32,111,117,114,32,98,108,111,98,46,13,10,13, + 10,32,32,32,32,32,32,32,32,47,47,32,116,104,114,101,97,100,83,104,111,117,108,100,69,120,105,116,40,41,32,114,101,116,117,114,110,115,32,116, + 114,117,101,32,119,104,101,110,32,116,104,101,32,115,116,111,112,84,104,114,101,97,100,40,41,32,109,101,116,104,111,100,32,104,97,115,32,98,101,101, + 110,13,10,32,32,32,32,32,32,32,32,47,47,32,99,97,108,108,101,100,44,32,115,111,32,119,101,32,115,104,111,117,108,100,32,99,104,101,99,107, + 32,105,116,32,111,102,116,101,110,44,32,97,110,100,32,101,120,105,116,32,97,115,32,115,111,111,110,32,97,115,32,105,116,32,103,101,116,115,32,102, + 108,97,103,103,101,100,46,13,10,32,32,32,32,32,32,32,32,119,104,105,108,101,32,40,33,32,116,104,114,101,97,100,83,104,111,117,108,100,69,120, + 105,116,40,41,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,111,118,101,66,97,108,108,40,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,115,108,101,101,112,32,97,32,98,105,116,32,115,111,32,116,104,101,32,116, + 104,114,101,97,100,115,32,100,111,110,39,116,32,97,108,108,32,103,114,105,110,100,32,116,104,101,32,67,80,85,32,116,111,32,97,32,104,97,108,116, + 46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,119,97,105,116,32,40,105,110,116,101,114,118,97,108,41,59,13,10,32,32,32,32,32,32, + 32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,106,117,99,101,95,85,115,101,68,101,98,117,103,103,105,110,103,78,101,119,79,112, + 101,114,97,116,111,114,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,68,101,109,111,84,104,114,101,97,100,80,111,111,108,74,111, + 98,32,32,58,32,112,117,98,108,105,99,32,66,111,117,110,99,105,110,103,66,97,108,108,67,111,109,112,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,84,104,114,101,97,100,80,111,111,108,74,111,98,13,10, + 123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,68,101,109,111,84,104,114,101,97,100,80,111,111,108,74,111,98,40,41,13,10,32,32,32, + 32,32,32,32,32,58,32,84,104,114,101,97,100,80,111,111,108,74,111,98,32,40,84,40,34,68,101,109,111,32,84,104,114,101,97,100,112,111,111,108, + 32,74,111,98,34,41,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,101,109,111,84,104,114,101,97,100, + 80,111,111,108,74,111,98,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,74,111,98,83,116,97,116,117,115, + 32,114,117,110,74,111,98,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115,32,105,115,32,116,104,101, + 32,99,111,100,101,32,116,104,97,116,32,114,117,110,115,32,116,104,105,115,32,106,111,98,46,32,73,116,39,108,108,32,98,101,32,114,101,112,101,97, + 116,101,100,108,121,32,99,97,108,108,101,100,32,117,110,116,105,108,32,119,101,32,114,101,116,117,114,110,13,10,32,32,32,32,32,32,32,32,47,47, + 32,106,111,98,72,97,115,70,105,110,105,115,104,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,111,98,78,101,101,100,115,82,117,110,110,105, + 110,103,65,103,97,105,110,46,13,10,13,10,32,32,32,32,32,32,32,32,109,111,118,101,66,97,108,108,40,41,59,13,10,32,32,32,32,32,32,32, + 32,84,104,114,101,97,100,58,58,115,108,101,101,112,32,40,51,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,106, + 111,98,78,101,101,100,115,82,117,110,110,105,110,103,65,103,97,105,110,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32, + 114,101,109,111,118,101,100,70,114,111,109,81,117,101,117,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,84,104, + 105,115,32,105,115,32,99,97,108,108,101,100,32,116,111,32,116,101,108,108,32,117,115,32,116,104,97,116,32,111,117,114,32,106,111,98,32,104,97,115, + 32,98,101,101,110,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,112,111,111,108,46,13,10,32,32,32,32,32,32,32,32,47,47, + 32,73,110,32,116,104,105,115,32,99,97,115,101,32,116,104,101,114,101,39,115,32,110,111,32,110,101,101,100,32,116,111,32,100,111,32,97,110,121,116, + 104,105,110,103,32,104,101,114,101,46,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,106,117,99,101,95,85,115,101,68,101,98,117,103,103,105, + 110,103,78,101,119,79,112,101,114,97,116,111,114,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,84,104,114,101,97,100,105,110,103,68,101, + 109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,84,105,109,101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,112,117,98,108,105,99,32,66,117,116,116,111,110,76,105,115,116,101,110,101,114,13,10,123,13,10,32,32,32,32,98,111,111,108, + 32,105,115,85,115,105,110,103,80,111,111,108,59,13,10,32,32,32,32,84,104,114,101,97,100,80,111,111,108,32,112,111,111,108,59,13,10,32,32,32, + 32,84,101,120,116,66,117,116,116,111,110,42,32,99,111,110,116,114,111,108,66,117,116,116,111,110,59,13,10,13,10,112,117,98,108,105,99,58,13,10, + 32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,32,32,32,32,84,104,114,101,97,100,105,110,103,68,101,109,111,40,41,13,10,32,32,32,32,32,32,32,32,58,32,112,111,111, + 108,32,40,51,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,115,85,115,105,110,103,80,111,111,108,32,61,32,102,97,108,115, + 101,59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40,34,77,117,108,116,105,116,104,114,101,97,100,105,110,103, + 34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,79,112,97,113,117,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,125, + 13,10,13,10,32,32,32,32,126,84,104,114,101,97,100,105,110,103,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32, + 32,112,111,111,108,46,114,101,109,111,118,101,65,108,108,74,111,98,115,32,40,116,114,117,101,44,32,50,48,48,48,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32, + 47,47,32,116,104,105,115,32,103,101,116,115,32,99,97,108,108,101,100,32,119,104,101,110,32,97,32,99,111,109,112,111,110,101,110,116,32,105,115,32, + 97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,97,32,112,97,114,101,110,116,32,99,111,109,112,111,110,101,110,116, + 46,13,10,32,32,32,32,118,111,105,100,32,112,97,114,101,110,116,72,105,101,114,97,114,99,104,121,67,104,97,110,103,101,100,40,41,13,10,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,119,101,39,108,108,32,117,115,101,32,116,104,105,115,32,97,115,32,97,110,32,111,112,112, + 111,114,116,117,110,105,116,121,32,116,111,32,115,116,97,114,116,32,97,110,100,32,115,116,111,112,32,116,104,101,32,116,104,114,101,97,100,115,44,32, + 115,111,32,116,104,97,116,13,10,32,32,32,32,32,32,32,32,47,47,32,119,101,32,100,111,110,39,116,32,108,101,97,118,101,32,116,104,101,109,32, + 103,111,105,110,103,32,119,104,101,110,32,116,104,101,32,99,111,109,112,111,110,101,110,116,39,115,32,110,111,116,32,97,99,116,117,97,108,108,121,32, + 118,105,115,105,98,108,101,46,13,10,32,32,32,32,32,32,32,32,115,116,111,112,84,105,109,101,114,40,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,112,111,111,108,46,114,101,109,111,118,101,65,108,108,74,111,98,115,32,40,116,114,117,101,44,32,52,48,48,48,41,59,13,10,32,32,32,32, + 32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65, + 110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,99,111,110,116,114,111,108,66,117,116,116,111,110,32,61,32,110,101,119,32,84,101,120,116,66, + 117,116,116,111,110,32,40,84,40,34,84,104,114,101,97,100,32,116,121,112,101,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,99,111,110,116, + 114,111,108,66,117,116,116,111,110,45,62,99,104,97,110,103,101,87,105,100,116,104,84,111,70,105,116,84,101,120,116,32,40,50,48,41,59,13,10,32, + 32,32,32,32,32,32,32,99,111,110,116,114,111,108,66,117,116,116,111,110,45,62,115,101,116,84,111,112,76,101,102,116,80,111,115,105,116,105,111,110, + 32,40,50,48,44,32,50,48,41,59,13,10,32,32,32,32,32,32,32,32,99,111,110,116,114,111,108,66,117,116,116,111,110,45,62,115,101,116,84,114, + 105,103,103,101,114,101,100,79,110,77,111,117,115,101,68,111,119,110,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,99,111,110,116, + 114,111,108,66,117,116,116,111,110,45,62,115,101,116,65,108,119,97,121,115,79,110,84,111,112,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32, + 32,32,32,99,111,110,116,114,111,108,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105, + 115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,115,83,104,111,119,105,110,103,40,41,41,13,10,32,32,32,32,32,32,32, + 32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,119,104,105,108,101,32,40,103,101,116,78,117,109,67,104,105,108,100,67,111,109,112,111,110, + 101,110,116,115,40,41,32,60,32,53,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100,65,66,97,108,108,40,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,116,97,114,116,84,105,109,101,114,32,40,50,48,48,48,41,59,13,10,32,32,32,32, + 32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115, + 38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58, + 58,119,104,105,116,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,115,101,116,85,115,105,110,103,80,111,111,108, + 32,40,98,111,111,108,32,117,115,101,80,111,111,108,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,115,85,115,105,110,103,80, + 111,111,108,32,61,32,117,115,101,80,111,111,108,59,13,10,32,32,32,32,32,32,32,32,112,97,114,101,110,116,72,105,101,114,97,114,99,104,121,67, + 104,97,110,103,101,100,40,41,59,32,47,47,32,114,101,115,101,116,115,32,101,118,101,114,121,116,104,105,110,103,13,10,32,32,32,32,125,13,10,13, + 10,32,32,32,32,118,111,105,100,32,97,100,100,65,66,97,108,108,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32, + 40,105,115,85,115,105,110,103,80,111,111,108,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,101, + 109,111,84,104,114,101,97,100,80,111,111,108,74,111,98,42,32,110,101,119,67,111,109,112,32,61,32,110,101,119,32,68,101,109,111,84,104,114,101,97, + 100,80,111,111,108,74,111,98,40,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98, + 108,101,32,40,110,101,119,67,111,109,112,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,110,101,119,67,111,109,112,45,62,112,97,114,101, + 110,116,83,105,122,101,67,104,97,110,103,101,100,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,112,111,111,108,46,97,100,100, + 74,111,98,32,40,110,101,119,67,111,109,112,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13, + 10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,101,109,111,84,104,114,101,97,100,42,32,110,101,119,67, + 111,109,112,32,61,32,110,101,119,32,68,101,109,111,84,104,114,101,97,100,40,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100, + 65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,110,101,119,67,111,109,112,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,110, + 101,119,67,111,109,112,45,62,112,97,114,101,110,116,83,105,122,101,67,104,97,110,103,101,100,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13, + 10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,109,111,118,101,65,66,97,108,108,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,105,102,32,40,105,115,85,115,105,110,103,80,111,111,108,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,84,104,114,101,97,100,80,111,111,108,74,111,98,42,32,106,111,98,84,111,82,101,109,111,118,101,32,61,32,112, + 111,111,108,46,103,101,116,74,111,98,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101, + 120,116,73,110,116,32,40,112,111,111,108,46,103,101,116,78,117,109,74,111,98,115,40,41,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,105,102,32,40,106,111,98,84,111,82,101,109,111,118,101,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,111,111,108,46,114,101,109,111,118,101,74,111,98,32,40,106,111,98,84,111,82,101, + 109,111,118,101,44,32,116,114,117,101,44,32,52,48,48,48,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101, + 116,101,32,106,111,98,84,111,82,101,109,111,118,101,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32, + 125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 105,102,32,40,103,101,116,78,117,109,67,104,105,108,100,67,111,109,112,111,110,101,110,116,115,40,41,32,62,32,49,41,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,98,97,108,108, + 32,61,32,103,101,116,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,49,32,43,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115, + 116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,103,101,116,78,117,109,67,104,105,108,100,67,111,109,112,111,110,101,110, + 116,115,40,41,32,45,32,49,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,100,121,110,97,109, + 105,99,95,99,97,115,116,32,60,66,117,116,116,111,110,42,62,32,40,98,97,108,108,41,32,61,61,32,48,41,32,47,47,32,100,111,110,39,116,32, + 100,101,108,101,116,101,32,111,117,114,32,98,117,116,116,111,110,33,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 100,101,108,101,116,101,32,98,97,108,108,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,116,105,109,101,114,67,97,108,108,98,97,99,107,40,41,13,10,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,105,102,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46, + 110,101,120,116,66,111,111,108,40,41,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40, + 103,101,116,78,117,109,67,104,105,108,100,67,111,109,112,111,110,101,110,116,115,40,41,32,60,61,32,49,48,41,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,97,100,100,65,66,97,108,108,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32, + 101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,103,101,116,78,117,109,67, + 104,105,108,100,67,111,109,112,111,110,101,110,116,115,40,41,32,62,32,51,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114, + 101,109,111,118,101,65,66,97,108,108,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118, + 111,105,100,32,98,117,116,116,111,110,67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,109,59,13,10,32,32,32,32,32,32,32,32,109,46,97,100,100,73,116, + 101,109,32,40,49,44,32,84,40,34,85,115,101,32,111,110,101,32,116,104,114,101,97,100,32,112,101,114,32,98,97,108,108,34,41,44,32,116,114,117, + 101,44,32,33,32,105,115,85,115,105,110,103,80,111,111,108,41,59,13,10,32,32,32,32,32,32,32,32,109,46,97,100,100,73,116,101,109,32,40,50, + 44,32,84,40,34,85,115,101,32,97,32,116,104,114,101,97,100,32,112,111,111,108,34,41,44,32,116,114,117,101,44,32,105,115,85,115,105,110,103,80, + 111,111,108,41,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,114,101,115,32,61,32,109,46,115,104,111,119,65, + 116,32,40,98,117,116,116,111,110,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,114,101,115,32,33,61,32,48,41,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,115,101,116,85,115,105,110,103,80,111,111,108,32,40,114,101,115,32,61,61,32,50,41,59,13,10,32,32,32,32, + 125,13,10,125,59,13,10,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,84,104,114,101,97,100,105,110, + 103,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,84,104,114,101,97,100,105,110,103,68,101,109,111, + 40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::threadingdemo_cpp = (const char*) temp14; + +static const unsigned char temp15[] = {60,116,114,101,101,62,13,10,32,32,32,32,60,105,116,101,109,49,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,32,99,111, + 108,111,117,114,61,34,102,102,102,102,48,48,48,48,34,32,119,105,100,116,104,61,34,56,48,48,34,32,47,62,13,10,32,32,32,32,32,32,32,32, + 60,115,117,98,110,111,100,101,32,99,111,108,111,117,114,61,34,102,102,51,51,98,98,48,48,34,32,119,105,100,116,104,61,34,53,48,34,32,47,62, + 13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,32,99,111,108,111,117,114,61,34,51,51,48,48,48,48,48,48,34,32,47,62,13, + 10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,32,119,105,100,116,104,61,34,49,48,48,34,32,47,62,13,10,32,32,32,32,32,32, + 32,32,60,115,117,98,110,111,100,101,32,99,111,108,111,117,114,61,34,102,102,56,56,54,54,101,101,34,32,47,62,13,10,32,32,32,32,32,32,32, + 32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,32,99,111,108,111,117,114,61,34,51,51, + 48,48,48,48,48,48,34,32,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32, + 60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,60,47,105,116,101,109,49,62,13,10,13,10,32,32,32,32,60,105,116,101,109,50,32,99, + 111,108,111,117,114,61,34,102,102,55,55,55,55,55,55,34,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32, + 32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32, + 32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,32,119,105,100,116, + 104,61,34,56,48,48,34,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,32,119,105,100,116,104,61,34,56,48,48,34,47, + 62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47, + 62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,105,116,101,109,51,62,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, + 115,117,98,110,111,100,101,32,119,105,100,116,104,61,34,53,48,34,47,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,115,117,98,110, + 111,100,101,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111, + 100,101,47,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32, + 32,32,32,32,32,32,60,47,105,116,101,109,51,62,13,10,32,32,32,32,60,47,105,116,101,109,50,62,13,10,13,10,32,32,32,32,60,105,116,101, + 109,52,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100, + 101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100, + 101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100, + 101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100, + 101,47,62,13,10,32,32,32,32,32,32,32,32,60,115,117,98,110,111,100,101,47,62,13,10,32,32,32,32,60,47,105,116,101,109,52,62,13,10,60, + 47,116,114,101,101,62,0,0}; +const char* BinaryData::treedemo_xml = (const char*) temp15; + +static const unsigned char temp16[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,99,108,97,115,115,32,84,114,101,101,86,105,101,119,68,101,109,111,73,116,101,109,32,32,58,32,112,117,98,108,105,99,32,84,114,101, + 101,86,105,101,119,73,116,101,109,13,10,123,13,10,32,32,32,32,88,109,108,69,108,101,109,101,110,116,42,32,120,109,108,59,13,10,13,10,112,117, + 98,108,105,99,58,13,10,32,32,32,32,84,114,101,101,86,105,101,119,68,101,109,111,73,116,101,109,32,40,88,109,108,69,108,101,109,101,110,116,42, + 32,99,111,110,115,116,32,120,109,108,95,41,13,10,32,32,32,32,32,32,32,32,58,32,120,109,108,32,40,120,109,108,95,41,13,10,32,32,32,32, + 123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,84,114,101,101,86,105,101,119,68,101,109,111,73,116,101,109,40,41,13,10,32,32,32, + 32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,105,110,116,32,103,101,116,73,116,101,109,87,105,100,116,104,40,41,32,99,111,110,115, + 116,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,120,109,108,45,62,103,101,116,73,110,116,65,116,116,114, + 105,98,117,116,101,32,40,84,40,34,119,105,100,116,104,34,41,44,32,45,49,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,99,111, + 110,115,116,32,83,116,114,105,110,103,32,103,101,116,85,110,105,113,117,101,78,97,109,101,40,41,32,99,111,110,115,116,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,105,102,32,40,120,109,108,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117, + 114,110,32,120,109,108,45,62,103,101,116,84,97,103,78,97,109,101,40,41,59,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,114,105,110,103,58,58,101,109,112,116,121,59,13,10,32,32,32,32,125,13,10,13, + 10,32,32,32,32,98,111,111,108,32,109,105,103,104,116,67,111,110,116,97,105,110,83,117,98,73,116,101,109,115,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,120,109,108,32,33,61,32,48,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,38,38,32,120,109,108,45,62,103,101,116,70,105,114,115,116,67,104,105,108,100,69,108,101,109,101,110,116,40,41,32,33,61,32,48,59,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,73,116,101,109,32,40,71,114,97,112,104,105,99,115,38,32,103, + 44,32,105,110,116,32,119,105,100,116,104,44,32,105,110,116,32,104,101,105,103,104,116,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32, + 32,105,102,32,40,120,109,108,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47, + 47,32,105,102,32,116,104,105,115,32,105,116,101,109,32,105,115,32,115,101,108,101,99,116,101,100,44,32,102,105,108,108,32,105,116,32,119,105,116,104, + 32,97,32,98,97,99,107,103,114,111,117,110,100,32,99,111,108,111,117,114,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40, + 105,115,83,101,108,101,99,116,101,100,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108, + 32,40,67,111,108,111,117,114,115,58,58,98,108,117,101,46,119,105,116,104,65,108,112,104,97,32,40,48,46,51,102,41,41,59,13,10,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,47,47,32,117,115,101,32,97,32,34,99,111,108,111,117,114,34,32,97,116,116,114,105,98,117,116,101,32,105,110, + 32,116,104,101,32,120,109,108,32,116,97,103,32,102,111,114,32,116,104,105,115,32,110,111,100,101,32,116,111,32,115,101,116,32,116,104,101,32,116,101, + 120,116,32,99,111,108,111,117,114,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111, + 108,111,117,114,32,40,120,109,108,45,62,103,101,116,83,116,114,105,110,103,65,116,116,114,105,98,117,116,101,32,40,84,40,34,99,111,108,111,117,114, + 34,41,44,32,84,40,34,102,102,48,48,48,48,48,48,34,41,41,46,103,101,116,72,101,120,86,97,108,117,101,51,50,40,41,41,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40,104,101,105,103,104,116,32,42,32,48,46,55,102,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,100,114,97,119,32,116,104,101,32,120,109,108,32,101,108,101,109,101,110,116,39,115, + 32,116,97,103,32,110,97,109,101,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,100,114,97,119,84,101,120,116,32,40,120,109,108, + 45,62,103,101,116,84,97,103,78,97,109,101,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,52,44,32,48,44,32,119,105,100,116,104,32,45,32,52,44,32,104,101,105,103,104,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,99,101,110,116,114,101,100,76,101,102,116,44,32,116, + 114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,105,116,101,109, + 79,112,101,110,110,101,115,115,67,104,97,110,103,101,100,32,40,98,111,111,108,32,105,115,78,111,119,79,112,101,110,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,105,102,32,40,105,115,78,111,119,79,112,101,110,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,47,47,32,105,102,32,119,101,39,118,101,32,110,111,116,32,97,108,114,101,97,100,121,32,100,111,110,101,32,115,111,44, + 32,119,101,39,108,108,32,110,111,119,32,97,100,100,32,116,104,101,32,116,114,101,101,39,115,32,115,117,98,45,105,116,101,109,115,46,32,89,111,117, + 32,99,111,117,108,100,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,108,115,111,32,99,104,111,111,115,101,32,116,111,32,100,101, + 108,101,116,101,32,116,104,101,32,101,120,105,115,116,105,110,103,32,111,110,101,115,32,97,110,100,32,114,101,102,114,101,115,104,32,116,104,101,109,32, + 105,102,32,116,104,97,116,39,115,32,109,111,114,101,32,115,117,105,116,97,98,108,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32, + 105,110,32,121,111,117,114,32,97,112,112,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,103,101,116,78,117,109,83,117,98,73, + 116,101,109,115,40,41,32,61,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,47,47,32,99,114,101,97,116,101,32,97,110,100,32,97,100,100,32,115,117,98,45,105,116,101,109,115,32,116,111,32,116,104,105,115, + 32,110,111,100,101,32,111,102,32,116,104,101,32,116,114,101,101,44,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,101,97,99,104,32,115,117,98,45,101,108,101,109,101,110,116,32,105,110,32,116,104,101,32, + 88,77,76,46,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,120,109,108,32,33,61,32,48,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102, + 111,114,69,97,99,104,88,109,108,67,104,105,108,100,69,108,101,109,101,110,116,32,40,42,120,109,108,44,32,99,104,105,108,100,41,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,97,100,100,83,117,98,73,116,101,109,32,40,110,101,119,32,84,114,101,101,86,105,101,119,68,101,109,111,73,116,101,109,32,40,99,104, + 105,108,100,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32, + 32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,105,110,32,116, + 104,105,115,32,99,97,115,101,44,32,119,101,39,108,108,32,108,101,97,118,101,32,97,110,121,32,115,117,98,45,105,116,101,109,115,32,105,110,32,116, + 104,101,32,116,114,101,101,32,119,104,101,110,32,116,104,101,32,110,111,100,101,32,103,101,116,115,32,99,108,111,115,101,100,44,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,47,47,32,116,104,111,117,103,104,32,121,111,117,32,99,111,117,108,100,32,99,104,111,111,115,101,32,116,111,32,100,101, + 108,101,116,101,32,116,104,101,109,32,105,102,32,116,104,97,116,39,115,32,109,111,114,101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,111,114, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,121,111,117,114,32,97,112,112,108,105,99,97,116,105,111,110,46,13,10,32,32,32,32, + 32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,99,111,110,115,116,32,83,116,114,105,110,103,32,103,101,116,68,114,97,103, + 83,111,117,114,99,101,68,101,115,99,114,105,112,116,105,111,110,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117, + 114,110,32,84,40,34,84,114,101,101,86,105,101,119,32,73,116,101,109,115,34,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10, + 99,108,97,115,115,32,84,114,101,101,86,105,101,119,68,101,109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,68,114,97,103,65,110,100,68,114,111, + 112,67,111,110,116,97,105,110,101,114,13,10,123,13,10,32,32,32,32,88,109,108,69,108,101,109,101,110,116,42,32,116,114,101,101,88,109,108,59,13, + 10,13,10,32,32,32,32,84,114,101,101,86,105,101,119,73,116,101,109,42,32,114,111,111,116,73,116,101,109,59,13,10,32,32,32,32,84,114,101,101, + 86,105,101,119,42,32,116,114,101,101,86,105,101,119,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,47,47,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,84,114, + 101,101,86,105,101,119,68,101,109,111,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40, + 34,84,114,101,101,32,86,105,101,119,115,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,83,116,114,105,110,103,32, + 116,114,101,101,88,109,108,83,116,114,105,110,103,32,40,66,105,110,97,114,121,68,97,116,97,58,58,116,114,101,101,100,101,109,111,95,120,109,108,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,88,109,108,68,111,99,117,109,101,110,116,32,112,97,114,115,101,114,32,40,116,114,101,101,88,109,108, + 83,116,114,105,110,103,41,59,13,10,13,10,32,32,32,32,32,32,32,32,116,114,101,101,88,109,108,32,61,32,112,97,114,115,101,114,46,103,101,116, + 68,111,99,117,109,101,110,116,69,108,101,109,101,110,116,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,114,111,111,116,73,116,101,109,32,61, + 32,110,101,119,32,84,114,101,101,86,105,101,119,68,101,109,111,73,116,101,109,32,40,116,114,101,101,88,109,108,41,59,13,10,32,32,32,32,32,32, + 32,32,114,111,111,116,73,116,101,109,45,62,115,101,116,79,112,101,110,32,40,116,114,117,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97, + 100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116,114,101,101,86,105,101,119,32,61,32,110,101,119,32,84,114,101,101,86,105,101, + 119,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,116,114,101,101,86,105,101,119,45,62,115,101,116,82,111,111,116,73,116,101,109,32,40, + 114,111,111,116,73,116,101,109,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,84,114,101,101,86,105,101,119,68,101,109,111,40,41, + 13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,105,102,32,40,114,111,111,116,73,116,101,109,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,100,101,108,101,116,101,32,114,111,111,116,73,116,101,109,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,116,114,101,101,88,109,108, + 32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,116,114,101,101,88,109,108,59,13,10,32,32,32, + 32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115,38,32,103,41,13,10,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,103,114,101,121,41,59,13, + 10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,82,101,99,116,32,40,116,114,101,101,86,105,101,119,45,62,103,101,116,88,40,41,44,32,116, + 114,101,101,86,105,101,119,45,62,103,101,116,89,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114, + 101,101,86,105,101,119,45,62,103,101,116,87,105,100,116,104,40,41,44,32,116,114,101,101,86,105,101,119,45,62,103,101,116,72,101,105,103,104,116,40, + 41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,116,114,101,101,86,105,101,119,45,62,115,101,116,66,111,117,110,100,115,82,101,108,97,116,105,118,101,32,40,48,46, + 48,53,102,44,32,48,46,48,53,102,44,32,48,46,57,102,44,32,48,46,57,102,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,106, + 117,99,101,95,85,115,101,68,101,98,117,103,103,105,110,103,78,101,119,79,112,101,114,97,116,111,114,13,10,125,59,13,10,13,10,13,10,47,47,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67, + 111,109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,84,114,101,101,86,105,101,119,68,101,109,111,40,41,13,10,123,13,10,32,32,32,32,114, + 101,116,117,114,110,32,110,101,119,32,84,114,101,101,86,105,101,119,68,101,109,111,40,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::treeviewdemo_cpp = (const char*) temp16; + +static const unsigned char temp17[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,13,10,13,10,32,32,32,84,104,105,115,32,102,105,108,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,74,85,67,69, + 32,108,105,98,114,97,114,121,32,45,32,34,74,117,108,101,115,39,32,85,116,105,108,105,116,121,32,67,108,97,115,115,32,69,120,116,101,110,115,105, + 111,110,115,34,13,10,32,32,32,67,111,112,121,114,105,103,104,116,32,50,48,48,52,45,55,32,98,121,32,82,97,119,32,77,97,116,101,114,105,97, + 108,32,83,111,102,116,119,97,114,101,32,108,116,100,46,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,74,85,67,69,32,99,97,110,32,98,101,32,114,101, + 100,105,115,116,114,105,98,117,116,101,100,32,97,110,100,47,111,114,32,109,111,100,105,102,105,101,100,32,117,110,100,101,114,32,116,104,101,32,116,101, + 114,109,115,32,111,102,32,116,104,101,13,10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115, + 101,44,32,97,115,32,112,117,98,108,105,115,104,101,100,32,98,121,32,116,104,101,32,70,114,101,101,32,83,111,102,116,119,97,114,101,32,70,111,117, + 110,100,97,116,105,111,110,59,13,10,32,32,32,101,105,116,104,101,114,32,118,101,114,115,105,111,110,32,50,32,111,102,32,116,104,101,32,76,105,99, + 101,110,115,101,44,32,111,114,32,40,97,116,32,121,111,117,114,32,111,112,116,105,111,110,41,32,97,110,121,32,108,97,116,101,114,32,118,101,114,115, + 105,111,110,46,13,10,13,10,32,32,32,74,85,67,69,32,105,115,32,100,105,115,116,114,105,98,117,116,101,100,32,105,110,32,116,104,101,32,104,111, + 112,101,32,116,104,97,116,32,105,116,32,119,105,108,108,32,98,101,32,117,115,101,102,117,108,44,13,10,32,32,32,98,117,116,32,87,73,84,72,79, + 85,84,32,65,78,89,32,87,65,82,82,65,78,84,89,59,32,119,105,116,104,111,117,116,32,101,118,101,110,32,116,104,101,32,105,109,112,108,105,101, + 100,32,119,97,114,114,97,110,116,121,32,111,102,13,10,32,32,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,32,111,114,32,70,73,84, + 78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,46,32,32,83,101,101,32,116,104,101,13, + 10,32,32,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,32,102,111,114,32,109,111,114,101,32, + 100,101,116,97,105,108,115,46,13,10,13,10,32,32,32,89,111,117,32,115,104,111,117,108,100,32,104,97,118,101,32,114,101,99,101,105,118,101,100,32, + 97,32,99,111,112,121,32,111,102,32,116,104,101,32,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101, + 13,10,32,32,32,97,108,111,110,103,32,119,105,116,104,32,74,85,67,69,59,32,105,102,32,110,111,116,44,32,118,105,115,105,116,32,119,119,119,46, + 103,110,117,46,111,114,103,47,108,105,99,101,110,115,101,115,32,111,114,32,119,114,105,116,101,32,116,111,32,116,104,101,13,10,32,32,32,70,114,101, + 101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,110,44,32,73,110,99,46,44,32,53,57,32,84,101,109,112,108,101,32,80, + 108,97,99,101,44,32,83,117,105,116,101,32,51,51,48,44,32,13,10,32,32,32,66,111,115,116,111,110,44,32,77,65,32,48,50,49,49,49,45,49, + 51,48,55,32,85,83,65,13,10,13,10,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,13,10,13,10,32,32,32,73,102,32,121,111,117,39,100,32,108,105,107,101,32,116,111,32,114,101,108,101,97, + 115,101,32,97,32,99,108,111,115,101,100,45,115,111,117,114,99,101,32,112,114,111,100,117,99,116,32,119,104,105,99,104,32,117,115,101,115,32,74,85, + 67,69,44,32,99,111,109,109,101,114,99,105,97,108,13,10,32,32,32,108,105,99,101,110,115,101,115,32,97,114,101,32,97,108,115,111,32,97,118,97, + 105,108,97,98,108,101,58,32,118,105,115,105,116,32,119,119,119,46,114,97,119,109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111, + 109,47,106,117,99,101,32,102,111,114,13,10,32,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,13,10,13,10,32,32,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,42,47, + 13,10,13,10,35,105,110,99,108,117,100,101,32,34,46,46,47,106,117,99,101,100,101,109,111,95,104,101,97,100,101,114,115,46,104,34,13,10,13,10, + 13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,99,108,97,115,115,32,66,111,117,110,99,105,110,103,66,97,108,108,67,111,109,112,111,110,101,110,116,32,58,32,112,117,98,108,105,99, + 32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,112,117,98,108,105,99,32,84,105,109,101,114,13,10,123,13,10,32,32,32,32,67,111,108,111,117,114,32,99,111,108,111,117,114,59,13,10, + 32,32,32,32,102,108,111,97,116,32,120,44,32,121,44,32,100,120,44,32,100,121,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32, + 66,111,117,110,99,105,110,103,66,97,108,108,67,111,109,112,111,110,101,110,116,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 120,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111,97,116,40, + 41,32,42,32,49,48,48,46,48,102,59,13,10,32,32,32,32,32,32,32,32,121,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116, + 101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111,97,116,40,41,32,42,32,49,48,48,46,48,102,59,13,10,13,10,32,32,32,32, + 32,32,32,32,100,120,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70, + 108,111,97,116,40,41,32,42,32,56,46,48,102,32,45,32,52,46,48,102,59,13,10,32,32,32,32,32,32,32,32,100,121,32,61,32,82,97,110,100, + 111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111,97,116,40,41,32,42,32,56,46,48,102, + 32,45,32,52,46,48,102,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111,108,111,117,114,32,61,32,67,111,108,111,117,114,32,40,82,97,110, + 100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,40,41,41,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,119,105,116,104,65,108,112,104,97,32,40,48,46,53,102,41,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,119,105,116,104,66,114,105,103,104,116,110,101,115,115,32,40,48,46,55,102,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,105,110,116,32,115,105,122,101,32,61,32,49,48,32,43,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116, + 101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,51,48,41,59,13,10,32,32,32,32,32,32,32,32,115,101,116,83,105,122, + 101,32,40,115,105,122,101,44,32,115,105,122,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,116,97,114,116,84,105,109,101,114,32,40,54, + 48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,66,111,117,110,99,105,110,103,66,97,108,108,67,111,109,112,111,110,101,110,116, + 40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112, + 104,105,99,115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,99,111, + 108,111,117,114,41,59,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,69,108,108,105,112,115,101,32,40,120,32,45,32,103,101,116,88,40, + 41,44,32,121,32,45,32,103,101,116,89,40,41,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,50,46,48,102,44,32,103,101,116,72,101,105, + 103,104,116,40,41,32,45,32,50,46,48,102,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,116,105,109,101,114,67, + 97,108,108,98,97,99,107,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,120,32,43,61,32,100,120,59,13,10,32,32,32,32, + 32,32,32,32,121,32,43,61,32,100,121,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,120,32,60,32,48,41,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,100,120,32,61,32,102,97,98,115,102,32,40,100,120,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40, + 120,32,62,32,103,101,116,80,97,114,101,110,116,87,105,100,116,104,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,120,32,61,32, + 45,102,97,98,115,102,32,40,100,120,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,121,32,60,32,48,41,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,100,121,32,61,32,102,97,98,115,102,32,40,100,121,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40, + 121,32,62,32,103,101,116,80,97,114,101,110,116,72,101,105,103,104,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,121,32,61, + 32,45,102,97,98,115,102,32,40,100,121,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,101,116,84,111,112,76,101,102,116,80,111,115,105,116, + 105,111,110,32,40,40,105,110,116,41,32,120,44,32,40,105,110,116,41,32,121,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,98,111, + 111,108,32,104,105,116,84,101,115,116,32,40,105,110,116,32,120,44,32,105,110,116,32,121,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,68,114, + 97,103,79,110,116,111,68,101,115,107,116,111,112,68,101,109,111,67,111,109,112,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116, + 13,10,123,13,10,32,32,32,32,67,111,109,112,111,110,101,110,116,42,32,112,97,114,101,110,116,59,13,10,32,32,32,32,67,111,109,112,111,110,101, + 110,116,68,114,97,103,103,101,114,32,100,114,97,103,103,101,114,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,68,114,97,103,79, + 110,116,111,68,101,115,107,116,111,112,68,101,109,111,67,111,109,112,32,40,67,111,109,112,111,110,101,110,116,42,32,112,41,13,10,32,32,32,32,32, + 32,32,32,58,32,112,97,114,101,110,116,32,40,112,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,115,104,111,119,32, + 111,102,102,32,115,101,109,105,45,116,114,97,110,115,112,97,114,101,110,99,121,32,105,102,32,105,116,39,115,32,115,117,112,112,111,114,116,101,100,32, + 98,121,32,116,104,101,32,99,117,114,114,101,110,116,32,79,83,46,13,10,32,32,32,32,32,32,32,32,115,101,116,79,112,97,113,117,101,32,40,33, + 32,68,101,115,107,116,111,112,58,58,99,97,110,85,115,101,83,101,109,105,84,114,97,110,115,112,97,114,101,110,116,87,105,110,100,111,119,115,40,41, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,51,59,32,45,45,105,32,62,61,32,48,59,41, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,110,101,119,32,66,111,117, + 110,99,105,110,103,66,97,108,108,67,111,109,112,111,110,101,110,116,40,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,114, + 97,103,79,110,116,111,68,101,115,107,116,111,112,68,101,109,111,67,111,109,112,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32, + 100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32, + 109,111,117,115,101,68,111,119,110,32,40,99,111,110,115,116,32,77,111,117,115,101,69,118,101,110,116,38,32,101,41,13,10,32,32,32,32,123,13,10, + 32,32,32,32,32,32,32,32,100,114,97,103,103,101,114,46,115,116,97,114,116,68,114,97,103,103,105,110,103,67,111,109,112,111,110,101,110,116,32,40, + 116,104,105,115,44,32,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,109,111,117,115,101,68,114,97,103,32,40, + 99,111,110,115,116,32,77,111,117,115,101,69,118,101,110,116,38,32,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32, + 40,33,32,112,97,114,101,110,116,45,62,105,115,86,97,108,105,100,67,111,109,112,111,110,101,110,116,40,41,41,13,10,32,32,32,32,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,116,104,105,115,59,13,10,32,32,32,32,32,32,32,32,125,13,10, + 32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,77,111,117, + 115,101,69,118,101,110,116,32,101,50,32,40,101,46,103,101,116,69,118,101,110,116,82,101,108,97,116,105,118,101,84,111,32,40,112,97,114,101,110,116, + 41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,105,102,32,116,104,101,32,109,111,117,115,101,32,105,115,32,105,110, + 115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,32,99,111,109,112,111,110,101,110,116,44,32,119,101,39,108,108,32,109,97,107,101,32,116,104, + 97,116,32,116,104,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,112,97,114,101,110,116,32,45,32,111,116,104,101,114,119,105,115, + 101,44,32,119,101,39,108,108,32,112,117,116,32,116,104,105,115,32,99,111,109,112,32,111,110,32,116,104,101,32,100,101,115,107,116,111,112,46,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,101,50,46,120,32,62,61,32,48,32,38,38,32,101,50,46,121,32,62,61,32,48,32,38, + 38,32,101,50,46,120,32,60,32,112,97,114,101,110,116,45,62,103,101,116,87,105,100,116,104,40,41,32,38,38,32,101,50,46,121,32,60,32,112,97, + 114,101,110,116,45,62,103,101,116,72,101,105,103,104,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,47,47,32,114,101,45,97,100,100,32,116,104,105,115,32,99,111,109,112,111,110,101,110,116,32,116,111,32,97, + 32,112,97,114,101,110,116,32,99,111,109,112,111,110,101,110,116,44,32,119,104,105,99,104,32,119,105,108,108,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,47,47,32,114,101,109,111,118,101,32,105,116,32,102,114,111,109,32,116,104,101,32,100,101,115,107,116,111,112,46,46,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,101,110,116,45,62,97,100,100,67,104,105,108,100,67,111,109,112,111,110,101,110, + 116,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108, + 115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,97,100, + 100,32,116,104,101,32,99,111,109,112,111,110,101,110,116,32,116,111,32,116,104,101,32,100,101,115,107,116,111,112,44,32,119,104,105,99,104,32,119,105, + 108,108,32,114,101,109,111,118,101,32,105,116,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,102,114,111,109,32,105,116, + 115,32,99,117,114,114,101,110,116,32,112,97,114,101,110,116,32,99,111,109,112,111,110,101,110,116,46,46,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,97,100,100,84,111,68,101,115,107,116,111,112,32,40,67,111,109,112,111,110,101,110,116,80,101,101,114,58,58,119,105,110,100,111, + 119,73,115,84,101,109,112,111,114,97,114,121,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,100,114,97,103,103,101,114,46,100,114,97,103,67,111,109,112,111,110,101,110,116,32,40,116,104,105,115,44,32,101,41,59,13,10,32, + 32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,112,97,105,110,116,32,40,71,114,97,112,104, + 105,99,115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,115,79,112,97,113,117,101,40,41,41,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58,58,119,104,105,116,101,41,59, + 13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,102,105,108,108,65,108,108,32,40,67, + 111,108,111,117,114,115,58,58,98,108,117,101,46,119,105,116,104,65,108,112,104,97,32,40,48,46,50,102,41,41,59,13,10,13,10,32,32,32,32,32, + 32,32,32,83,116,114,105,110,103,32,100,101,115,99,32,40,84,40,34,100,114,97,103,32,116,104,105,115,32,98,111,120,32,111,110,116,111,32,116,104, + 101,32,100,101,115,107,116,111,112,32,116,111,32,115,104,111,119,32,104,111,119,32,116,104,101,32,115,97,109,101,32,99,111,109,112,111,110,101,110,116, + 32,99,97,110,32,109,111,118,101,32,102,114,111,109,32,98,101,105,110,103,32,108,105,103,104,116,119,101,105,103,104,116,32,116,111,32,98,101,105,110, + 103,32,97,32,115,101,112,97,114,97,116,101,32,119,105,110,100,111,119,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116, + 70,111,110,116,32,40,49,53,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111, + 117,114,115,58,58,98,108,97,99,107,41,59,13,10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,70,105,116,116,101,100,84,101,120,116,32,40, + 100,101,115,99,44,32,52,44,32,48,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,56,44,32,103,101,116,72,101,105,103,104,116,40,41,44, + 32,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,104,111,114,105,122,111,110,116,97,108,108,121,74,117,115,116,105,102,105,101,100,44,32,53, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,46,100,114,97,119,82,101,99,116,32,40,48,44,32,48,44,32,103,101,116,87,105,100,116,104, + 40,41,44,32,103,101,116,72,101,105,103,104,116,40,41,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32, + 67,117,115,116,111,109,77,101,110,117,67,111,109,112,111,110,101,110,116,32,32,58,32,112,117,98,108,105,99,32,80,111,112,117,112,77,101,110,117,67, + 117,115,116,111,109,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,112,117,98,108,105,99,32,84,105,109,101,114,13,10,123,13,10,32,32,32,32,105,110,116,32,98,108,111,98,88,44,32,98,108, + 111,98,89,59,13,10,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,67,117,115,116,111,109,77,101,110,117,67,111,109,112,111,110,101,110,116, + 40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,115,101,116,32,111,102,102,32,97,32,116,105,109,101,114,32,116,111, + 32,109,111,118,101,32,97,32,98,108,111,98,32,97,114,111,117,110,100,32,111,110,32,116,104,105,115,32,99,111,109,112,111,110,101,110,116,32,101,118, + 101,114,121,13,10,32,32,32,32,32,32,32,32,47,47,32,51,48,48,32,109,105,108,108,105,115,101,99,111,110,100,115,32,45,32,115,101,101,32,116, + 104,101,32,116,105,109,101,114,67,97,108,108,98,97,99,107,40,41,32,109,101,116,104,111,100,46,13,10,32,32,32,32,32,32,32,32,115,116,97,114, + 116,84,105,109,101,114,32,40,51,48,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,67,117,115,116,111,109,77,101,110,117,67, + 111,109,112,111,110,101,110,116,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,103,101,116, + 73,100,101,97,108,83,105,122,101,32,40,105,110,116,38,32,105,100,101,97,108,87,105,100,116,104,44,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,38,32,105,100,101,97,108,72,101,105,103,104,116,41,13,10,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,47,47,32,116,101,108,108,115,32,116,104,101,32,109,101,110,117,32,104,111,119,32,98,105,103,32,119,101,39,100,32,108,105,107, + 101,32,116,111,32,98,101,46,46,13,10,32,32,32,32,32,32,32,32,105,100,101,97,108,87,105,100,116,104,32,61,32,50,48,48,59,13,10,32,32, + 32,32,32,32,32,32,105,100,101,97,108,72,101,105,103,104,116,32,61,32,54,48,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111, + 105,100,32,112,97,105,110,116,32,40,71,114,97,112,104,105,99,115,38,32,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,103, + 46,102,105,108,108,65,108,108,32,40,67,111,108,111,117,114,115,58,58,121,101,108,108,111,119,46,119,105,116,104,65,108,112,104,97,32,40,48,46,51, + 102,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,112,105, + 110,107,41,59,13,10,32,32,32,32,32,32,32,32,103,46,102,105,108,108,69,108,108,105,112,115,101,32,40,40,102,108,111,97,116,41,32,98,108,111, + 98,88,44,32,40,102,108,111,97,116,41,32,98,108,111,98,89,44,32,51,48,46,48,102,44,32,52,48,46,48,102,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,103,46,115,101,116,70,111,110,116,32,40,49,52,46,48,102,44,32,70,111,110,116,58,58,105,116,97,108,105,99,41,59,13,10,32, + 32,32,32,32,32,32,32,103,46,115,101,116,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,103,46,100,114,97,119,70,105,116,116,101,100,84,101,120,116,32,40,84,40,34,116,104,105,115,32,105,115,32,97,32,99, + 117,115,116,111,109,105,115,101,100,32,109,101,110,117,32,105,116,101,109,32,40,97,108,115,111,32,100,101,109,111,110,115,116,114,97,116,105,110,103,32, + 116,104,101,32,84,105,109,101,114,32,99,108,97,115,115,41,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,52,44,32,48,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32,56,44,32,103,101,116,72,101,105,103,104, + 116,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,74,117,115,116,105,102,105,99, + 97,116,105,111,110,58,58,99,101,110,116,114,101,100,44,32,51,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,116, + 105,109,101,114,67,97,108,108,98,97,99,107,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,98,108,111,98,88,32,61,32,82, + 97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,103,101,116,87,105,100, + 116,104,40,41,41,59,13,10,32,32,32,32,32,32,32,32,98,108,111,98,89,32,61,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101, + 109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,103,101,116,72,101,105,103,104,116,40,41,41,59,13,10,32,32,32,32,32,32, + 32,32,114,101,112,97,105,110,116,40,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,47,42,42,32,84,111,32,100,101,109,111, + 110,115,116,114,97,116,101,32,104,111,119,32,115,108,105,100,101,114,115,32,99,97,110,32,104,97,118,101,32,99,117,115,116,111,109,32,115,110,97,112, + 112,105,110,103,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,105,114,32,118,97,108,117,101,115,44,13,10,32,32,32,32,116,104,105,115,32, + 115,105,109,112,108,101,32,99,108,97,115,115,32,115,110,97,112,115,32,116,104,101,32,118,97,108,117,101,32,116,111,32,53,48,32,105,102,32,105,116, + 32,99,111,109,101,115,32,110,101,97,114,46,13,10,42,47,13,10,99,108,97,115,115,32,83,110,97,112,112,105,110,103,83,108,105,100,101,114,32,32, + 58,32,112,117,98,108,105,99,32,83,108,105,100,101,114,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,83,110,97,112,112,105,110, + 103,83,108,105,100,101,114,32,40,99,111,110,115,116,32,83,116,114,105,110,103,38,32,110,97,109,101,41,13,10,32,32,32,32,32,32,32,32,58,32, + 83,108,105,100,101,114,32,40,110,97,109,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,100,111,117,98,108, + 101,32,115,110,97,112,86,97,108,117,101,32,40,100,111,117,98,108,101,32,97,116,116,101,109,112,116,101,100,86,97,108,117,101,44,32,99,111,110,115, + 116,32,98,111,111,108,32,117,115,101,114,73,115,68,114,97,103,103,105,110,103,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105, + 102,32,40,33,32,117,115,101,114,73,115,68,114,97,103,103,105,110,103,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110, + 32,97,116,116,101,109,112,116,101,100,86,97,108,117,101,59,32,32,47,47,32,105,102,32,116,104,101,121,39,114,101,32,101,110,116,101,114,105,110,103, + 32,116,104,101,32,118,97,108,117,101,32,105,110,32,116,104,101,32,116,101,120,116,45,98,111,120,44,32,100,111,110,39,116,32,109,101,115,115,32,119, + 105,116,104,32,105,116,46,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,97,116,116,101,109,112,116,101,100,86,97,108,117,101,32,62,32, + 52,48,32,38,38,32,97,116,116,101,109,112,116,101,100,86,97,108,117,101,32,60,32,54,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 114,101,116,117,114,110,32,53,48,46,48,59,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 114,101,116,117,114,110,32,97,116,116,101,109,112,116,101,100,86,97,108,117,101,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,42,42, + 32,65,32,84,101,120,116,66,117,116,116,111,110,32,116,104,97,116,32,112,111,112,115,32,117,112,32,97,32,99,111,108,111,117,114,32,99,104,111,111, + 115,101,114,32,116,111,32,99,104,97,110,103,101,32,105,116,115,32,99,111,108,111,117,114,115,46,32,42,47,13,10,99,108,97,115,115,32,67,111,108, + 111,117,114,67,104,97,110,103,101,66,117,116,116,111,110,32,32,58,32,112,117,98,108,105,99,32,84,101,120,116,66,117,116,116,111,110,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,67,104,97,110,103,101, + 76,105,115,116,101,110,101,114,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,67,111,108,111,117,114,67,104,97,110,103,101,66,117, + 116,116,111,110,40,41,13,10,32,32,32,32,32,32,32,32,58,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,99,108,105,99,107,32,116, + 111,32,99,104,97,110,103,101,32,99,111,108,111,117,114,46,46,46,34,41,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101, + 116,83,105,122,101,32,40,49,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,99,104,97,110,103,101,87,105,100,116,104,84,111,70,105, + 116,84,101,120,116,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,67,111,108,111,117,114,67,104,97,110,103,101,66,117,116,116, + 111,110,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,99,108,105,99,107,101,100,40,41, + 13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,99,114,101,97,116,101,32,116,119,111,32,99,111,108,111,117,114,32,115,101, + 108,101,99,116,111,114,32,99,111,109,112,111,110,101,110,116,115,32,102,111,114,32,111,117,114,32,98,97,99,107,103,114,111,117,110,100,32,97,110,100, + 13,10,32,32,32,32,32,32,32,32,47,47,32,116,101,120,116,32,99,111,108,111,117,114,46,46,13,10,32,32,32,32,32,32,32,32,67,111,108,111, + 117,114,83,101,108,101,99,116,111,114,32,99,111,108,111,117,114,83,101,108,101,99,116,111,114,49,59,13,10,32,32,32,32,32,32,32,32,99,111,108, + 111,117,114,83,101,108,101,99,116,111,114,49,46,115,101,116,78,97,109,101,32,40,84,40,34,98,97,99,107,103,114,111,117,110,100,34,41,41,59,13, + 10,32,32,32,32,32,32,32,32,99,111,108,111,117,114,83,101,108,101,99,116,111,114,49,46,115,101,116,67,117,114,114,101,110,116,67,111,108,111,117, + 114,32,40,102,105,110,100,67,111,108,111,117,114,32,40,84,101,120,116,66,117,116,116,111,110,58,58,98,117,116,116,111,110,67,111,108,111,117,114,73, + 100,41,41,59,13,10,32,32,32,32,32,32,32,32,99,111,108,111,117,114,83,101,108,101,99,116,111,114,49,46,97,100,100,67,104,97,110,103,101,76, + 105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,67,111,108,111,117,114,83,101,108,101,99,116,111, + 114,32,99,111,108,111,117,114,83,101,108,101,99,116,111,114,50,59,13,10,32,32,32,32,32,32,32,32,99,111,108,111,117,114,83,101,108,101,99,116, + 111,114,50,46,115,101,116,78,97,109,101,32,40,84,40,34,116,101,120,116,34,41,41,59,13,10,32,32,32,32,32,32,32,32,99,111,108,111,117,114, + 83,101,108,101,99,116,111,114,50,46,115,101,116,67,117,114,114,101,110,116,67,111,108,111,117,114,32,40,102,105,110,100,67,111,108,111,117,114,32,40, + 84,101,120,116,66,117,116,116,111,110,58,58,116,101,120,116,67,111,108,111,117,114,73,100,41,41,59,13,10,32,32,32,32,32,32,32,32,99,111,108, + 111,117,114,83,101,108,101,99,116,111,114,50,46,97,100,100,67,104,97,110,103,101,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,47,47,32,97,110,100,32,97,100,100,32,116,104,101,32,115,101,108,101,99,116,111,114,115,32,97,115,32,99,117, + 115,116,111,109,32,109,101,110,117,32,105,116,101,109,115,32,116,111,32,97,32,80,111,112,117,112,77,101,110,117,44,32,112,117,116,116,105,110,103,13, + 10,32,32,32,32,32,32,32,32,47,47,32,116,104,101,109,32,105,110,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,115,117,98,45,109,101, + 110,117,115,46,46,13,10,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,109,44,32,115,117,98,49,44,32,115,117,98,50,59,13, + 10,13,10,32,32,32,32,32,32,32,32,115,117,98,49,46,97,100,100,67,117,115,116,111,109,73,116,101,109,32,40,49,50,51,52,44,32,38,99,111, + 108,111,117,114,83,101,108,101,99,116,111,114,49,44,32,51,48,48,44,32,51,48,48,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32, + 32,32,109,46,97,100,100,83,117,98,77,101,110,117,32,40,84,40,34,98,97,99,107,103,114,111,117,110,100,32,99,111,108,111,117,114,34,41,44,32, + 115,117,98,49,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,117,98,50,46,97,100,100,67,117,115,116,111,109,73,116,101,109,32,40,49,50, + 51,52,44,32,38,99,111,108,111,117,114,83,101,108,101,99,116,111,114,50,44,32,51,48,48,44,32,51,48,48,44,32,102,97,108,115,101,41,59,13, + 10,32,32,32,32,32,32,32,32,109,46,97,100,100,83,117,98,77,101,110,117,32,40,84,40,34,116,101,120,116,32,99,111,108,111,117,114,34,41,44, + 32,115,117,98,50,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,97,110,100,32,115,104,111,119,32,116,104,101,32,109,101,110,117,32, + 40,109,111,100,97,108,108,121,41,46,46,13,10,32,32,32,32,32,32,32,32,109,46,115,104,111,119,65,116,32,40,116,104,105,115,41,59,13,10,32, + 32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,99,104,97,110,103,101,76,105,115,116,101,110,101,114,67,97,108,108,98,97,99,107,32, + 40,118,111,105,100,42,32,115,111,117,114,99,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,67,111,108,111,117,114,83,101,108, + 101,99,116,111,114,42,32,99,115,32,61,32,40,67,111,108,111,117,114,83,101,108,101,99,116,111,114,42,41,32,115,111,117,114,99,101,59,13,10,13, + 10,32,32,32,32,32,32,32,32,105,102,32,40,99,115,45,62,103,101,116,78,97,109,101,40,41,32,61,61,32,84,40,34,116,101,120,116,34,41,41, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,101,116,67,111,108,111,117,114,32,40,84,101,120,116,66,117,116,116,111,110,58,58,116,101,120, + 116,67,111,108,111,117,114,73,100,44,32,99,115,45,62,103,101,116,67,117,114,114,101,110,116,67,111,108,111,117,114,40,41,41,59,13,10,32,32,32, + 32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,101,116,67,111,108,111,117,114,32,40,84,101,120,116,66,117, + 116,116,111,110,58,58,98,117,116,116,111,110,67,111,108,111,117,114,73,100,44,32,99,115,45,62,103,101,116,67,117,114,114,101,110,116,67,111,108,111, + 117,114,40,41,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,47,47,32,106,117,115,116,32,97,32,99,111,109,112,111,110,101, + 110,116,32,116,104,97,116,32,100,101,108,101,116,101,115,32,97,108,108,32,105,116,115,32,99,104,105,108,100,114,101,110,44,32,116,111,32,117,115,101, + 32,102,111,114,32,116,104,101,32,116,97,98,98,101,100,32,112,97,103,101,115,32,116,111,32,97,118,111,105,100,13,10,47,47,32,109,101,109,111,114, + 121,32,108,101,97,107,115,32,119,104,101,110,32,116,104,101,121,39,114,101,32,100,101,108,101,116,101,100,13,10,99,108,97,115,115,32,68,101,109,111, + 80,97,103,101,67,111,109,112,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,13,10,123,13,10,112,117,98,108,105,99,58, + 13,10,32,32,32,32,68,101,109,111,80,97,103,101,67,111,109,112,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32, + 32,32,126,68,101,109,111,80,97,103,101,67,111,109,112,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101, + 65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,115,116,97,116,105,99,32,67,111, + 109,112,111,110,101,110,116,42,32,99,114,101,97,116,101,83,108,105,100,101,114,115,80,97,103,101,40,41,13,10,123,13,10,32,32,32,32,68,101,109, + 111,80,97,103,101,67,111,109,112,42,32,112,97,103,101,32,61,32,110,101,119,32,68,101,109,111,80,97,103,101,67,111,109,112,40,41,59,13,10,13, + 10,32,32,32,32,99,111,110,115,116,32,105,110,116,32,110,117,109,83,108,105,100,101,114,115,32,61,32,49,49,59,13,10,32,32,32,32,83,108,105, + 100,101,114,42,32,115,108,105,100,101,114,115,32,91,110,117,109,83,108,105,100,101,114,115,93,59,13,10,13,10,32,32,32,32,105,110,116,32,105,59, + 13,10,32,32,32,32,102,111,114,32,40,105,32,61,32,48,59,32,105,32,60,32,110,117,109,83,108,105,100,101,114,115,59,32,43,43,105,41,13,10, + 32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,32,61,61,32,50,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,115,108,105,100,101,114,115,91,105,93,32,61,32,110,101, + 119,32,83,110,97,112,112,105,110,103,83,108,105,100,101,114,32,40,84,40,34,115,108,105,100,101,114,34,41,41,41,59,13,10,32,32,32,32,32,32, + 32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105, + 98,108,101,32,40,115,108,105,100,101,114,115,91,105,93,32,61,32,110,101,119,32,83,108,105,100,101,114,32,40,84,40,34,115,108,105,100,101,114,34, + 41,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,115,108,105,100,101,114,115,91,105,93,45,62,115,101,116,82,97,110,103,101,32,40,48,46, + 48,44,32,49,48,48,46,48,44,32,48,46,49,41,59,13,10,32,32,32,32,32,32,32,32,115,108,105,100,101,114,115,91,105,93,45,62,115,101,116, + 80,111,112,117,112,77,101,110,117,69,110,97,98,108,101,100,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,115,108,105,100,101,114, + 115,91,105,93,45,62,115,101,116,86,97,108,117,101,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40, + 41,46,110,101,120,116,68,111,117,98,108,101,40,41,32,42,32,49,48,48,46,48,44,32,102,97,108,115,101,44,32,102,97,108,115,101,41,59,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,48,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32, + 40,83,108,105,100,101,114,58,58,76,105,110,101,97,114,86,101,114,116,105,99,97,108,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,48, + 93,45,62,115,101,116,84,101,120,116,66,111,120,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,84,101,120,116,66,111,120,66,101,108,111,119, + 44,32,102,97,108,115,101,44,32,49,48,48,44,32,50,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,48,93,45,62,115,101,116,66, + 111,117,110,100,115,32,40,49,48,44,32,50,53,44,32,55,48,44,32,50,48,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,48,93, + 45,62,115,101,116,68,111,117,98,108,101,67,108,105,99,107,82,101,116,117,114,110,86,97,108,117,101,32,40,116,114,117,101,44,32,53,48,46,48,41, + 59,32,47,47,32,100,111,117,98,108,101,45,99,108,105,99,107,105,110,103,32,116,104,105,115,32,115,108,105,100,101,114,32,119,105,108,108,32,115,101, + 116,32,105,116,32,116,111,32,53,48,46,48,13,10,32,32,32,32,115,108,105,100,101,114,115,91,48,93,45,62,115,101,116,84,101,120,116,86,97,108, + 117,101,83,117,102,102,105,120,32,40,84,40,34,32,117,110,105,116,115,34,41,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,49, + 93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,76,105,110,101,97,114,86,101,114,116,105,99,97, + 108,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,49,93,45,62,115,101,116,86,101,108,111,99,105,116,121,66,97,115,101,100,77,111,100, + 101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,49,93,45,62,115,101,116,83,107,101,119,70,97,99,116,111,114, + 32,40,48,46,53,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,49,93,45,62,115,101,116,84,101,120,116,66,111,120,83,116,121,108,101, + 32,40,83,108,105,100,101,114,58,58,84,101,120,116,66,111,120,65,98,111,118,101,44,32,116,114,117,101,44,32,49,48,48,44,32,50,48,41,59,13, + 10,32,32,32,32,115,108,105,100,101,114,115,91,49,93,45,62,115,101,116,66,111,117,110,100,115,32,40,56,53,44,32,50,53,44,32,55,48,44,32, + 50,48,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,49,93,45,62,115,101,116,84,101,120,116,86,97,108,117,101,83,117,102,102,105, + 120,32,40,84,40,34,32,114,101,108,115,34,41,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,50,93,45,62,115,101,116,83,108, + 105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,76,105,110,101,97,114,72,111,114,105,122,111,110,116,97,108,41,59,13,10,32, + 32,32,32,115,108,105,100,101,114,115,91,50,93,45,62,115,101,116,84,101,120,116,66,111,120,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58, + 84,101,120,116,66,111,120,76,101,102,116,44,32,102,97,108,115,101,44,32,56,48,44,32,50,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114, + 115,91,50,93,45,62,115,101,116,66,111,117,110,100,115,32,40,49,56,48,44,32,51,53,44,32,49,53,48,44,32,50,48,41,59,13,10,13,10,32, + 32,32,32,115,108,105,100,101,114,115,91,51,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,76, + 105,110,101,97,114,72,111,114,105,122,111,110,116,97,108,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,51,93,45,62,115,101,116,84,101, + 120,116,66,111,120,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,78,111,84,101,120,116,66,111,120,44,32,102,97,108,115,101,44,32,48,44, + 32,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,51,93,45,62,115,101,116,66,111,117,110,100,115,32,40,49,56,48,44,32,54,53, + 44,32,49,53,48,44,32,50,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,51,93,45,62,115,101,116,80,111,112,117,112,68,105,115, + 112,108,97,121,69,110,97,98,108,101,100,32,40,116,114,117,101,44,32,112,97,103,101,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,51, + 93,45,62,115,101,116,84,101,120,116,86,97,108,117,101,83,117,102,102,105,120,32,40,84,40,34,32,110,117,110,115,32,114,101,113,117,105,114,101,100, + 32,116,111,32,99,104,97,110,103,101,32,97,32,108,105,103,104,116,98,117,108,98,34,41,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114, + 115,91,52,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,73,110,99,68,101,99,66,117,116,116, + 111,110,115,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,52,93,45,62,115,101,116,84,101,120,116,66,111,120,83,116,121,108,101,32,40, + 83,108,105,100,101,114,58,58,84,101,120,116,66,111,120,76,101,102,116,44,32,102,97,108,115,101,44,32,53,48,44,32,50,48,41,59,13,10,32,32, + 32,32,115,108,105,100,101,114,115,91,52,93,45,62,115,101,116,66,111,117,110,100,115,32,40,49,56,48,44,32,49,48,53,44,32,49,48,48,44,32, + 50,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,52,93,45,62,115,101,116,73,110,99,68,101,99,66,117,116,116,111,110,115,77,111, + 100,101,32,40,83,108,105,100,101,114,58,58,105,110,99,68,101,99,66,117,116,116,111,110,115,68,114,97,103,103,97,98,108,101,95,86,101,114,116,105, + 99,97,108,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,53,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32, + 40,83,108,105,100,101,114,58,58,82,111,116,97,114,121,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,53,93,45,62,115,101,116,82,111, + 116,97,114,121,80,97,114,97,109,101,116,101,114,115,32,40,102,108,111,97,116,95,80,105,32,42,32,49,46,50,102,44,32,102,108,111,97,116,95,80, + 105,32,42,32,50,46,56,102,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,53,93,45,62,115,101,116,84,101, + 120,116,66,111,120,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,84,101,120,116,66,111,120,82,105,103,104,116,44,32,102,97,108,115,101,44, + 32,55,48,44,32,50,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,53,93,45,62,115,101,116,66,111,117,110,100,115,32,40,49,57, + 48,44,32,49,52,53,44,32,49,50,48,44,32,52,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,53,93,45,62,115,101,116,84,101, + 120,116,86,97,108,117,101,83,117,102,102,105,120,32,40,84,40,34,32,109,109,34,41,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115, + 91,54,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,76,105,110,101,97,114,66,97,114,41,59, + 13,10,32,32,32,32,115,108,105,100,101,114,115,91,54,93,45,62,115,101,116,66,111,117,110,100,115,32,40,49,56,48,44,32,49,57,53,44,32,49, + 48,48,44,32,51,48,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,54,93,45,62,115,101,116,84,101,120,116,86,97,108,117,101,83,117, + 102,102,105,120,32,40,84,40,34,32,103,97,108,108,111,110,115,34,41,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,55,93,45, + 62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,84,119,111,86,97,108,117,101,72,111,114,105,122,111,110, + 116,97,108,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,55,93,45,62,115,101,116,66,111,117,110,100,115,32,40,51,54,48,44,32,50, + 48,44,32,49,54,48,44,32,52,48,41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,56,93,45,62,115,101,116,83,108,105,100,101, + 114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,84,119,111,86,97,108,117,101,86,101,114,116,105,99,97,108,41,59,13,10,32,32,32,32, + 115,108,105,100,101,114,115,91,56,93,45,62,115,101,116,66,111,117,110,100,115,32,40,51,54,48,44,32,49,49,48,44,32,52,48,44,32,49,54,48, + 41,59,13,10,13,10,32,32,32,32,115,108,105,100,101,114,115,91,57,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108, + 105,100,101,114,58,58,84,104,114,101,101,86,97,108,117,101,72,111,114,105,122,111,110,116,97,108,41,59,13,10,32,32,32,32,115,108,105,100,101,114, + 115,91,57,93,45,62,115,101,116,66,111,117,110,100,115,32,40,51,54,48,44,32,55,48,44,32,49,54,48,44,32,52,48,41,59,13,10,13,10,32, + 32,32,32,115,108,105,100,101,114,115,91,49,48,93,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58, + 84,104,114,101,101,86,97,108,117,101,86,101,114,116,105,99,97,108,41,59,13,10,32,32,32,32,115,108,105,100,101,114,115,91,49,48,93,45,62,115, + 101,116,66,111,117,110,100,115,32,40,52,52,48,44,32,49,49,48,44,32,52,48,44,32,49,54,48,41,59,13,10,13,10,32,32,32,32,102,111,114, + 32,40,105,32,61,32,55,59,32,105,32,60,61,32,49,48,59,32,43,43,105,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115, + 108,105,100,101,114,115,91,105,93,45,62,115,101,116,84,101,120,116,66,111,120,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,78,111,84,101, + 120,116,66,111,120,44,32,102,97,108,115,101,44,32,48,44,32,48,41,59,13,10,32,32,32,32,32,32,32,32,115,108,105,100,101,114,115,91,105,93, + 45,62,115,101,116,77,105,110,86,97,108,117,101,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41, + 46,110,101,120,116,68,111,117,98,108,101,40,41,32,42,32,49,48,48,46,48,44,32,102,97,108,115,101,44,32,102,97,108,115,101,41,59,13,10,32, + 32,32,32,32,32,32,32,115,108,105,100,101,114,115,91,105,93,45,62,115,101,116,77,97,120,86,97,108,117,101,32,40,82,97,110,100,111,109,58,58, + 103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,68,111,117,98,108,101,40,41,32,42,32,49,48,48,46,48,44,32, + 102,97,108,115,101,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,115,108,105,100,101,114,115,91,105,93,45,62,115,101,116,80, + 111,112,117,112,68,105,115,112,108,97,121,69,110,97,98,108,101,100,32,40,116,114,117,101,44,32,112,97,103,101,41,59,13,10,32,32,32,32,125,13, + 10,13,10,32,32,32,32,76,97,98,101,108,42,32,108,97,98,101,108,32,61,32,110,101,119,32,76,97,98,101,108,32,40,84,40,34,104,105,110,116, + 34,41,44,32,84,40,34,84,114,121,32,114,105,103,104,116,45,99,108,105,99,107,105,110,103,32,111,110,32,97,32,115,108,105,100,101,114,32,102,111, + 114,32,97,110,32,111,112,116,105,111,110,115,32,109,101,110,117,46,32,92,110,92,110,65,108,115,111,44,32,104,111,108,100,105,110,103,32,100,111,119, + 110,32,67,84,82,76,32,119,104,105,108,101,32,100,114,97,103,103,105,110,103,32,119,105,108,108,32,116,117,114,110,32,111,110,32,97,32,115,108,105, + 100,101,114,39,115,32,118,101,108,111,99,105,116,121,45,115,101,110,115,105,116,105,118,101,32,109,111,100,101,34,41,41,59,13,10,32,32,32,32,108, + 97,98,101,108,45,62,115,101,116,66,111,117,110,100,115,32,40,50,48,44,32,50,52,53,44,32,51,53,48,44,32,49,53,48,41,59,13,10,32,32, + 32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,108,97,98,101,108,41,59,13,10,13,10,32,32, + 32,32,114,101,116,117,114,110,32,112,97,103,101,59,13,10,125,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,115,116,97,116,105,99,32,67,111,109,112,111,110,101,110,116,42, + 32,99,114,101,97,116,101,82,97,100,105,111,66,117,116,116,111,110,80,97,103,101,40,41,13,10,123,13,10,32,32,32,32,68,101,109,111,80,97,103, + 101,67,111,109,112,42,32,112,97,103,101,32,61,32,110,101,119,32,68,101,109,111,80,97,103,101,67,111,109,112,40,41,59,13,10,13,10,32,32,32, + 32,71,114,111,117,112,67,111,109,112,111,110,101,110,116,42,32,103,114,111,117,112,32,61,32,110,101,119,32,71,114,111,117,112,67,111,109,112,111,110, + 101,110,116,32,40,84,40,34,103,114,111,117,112,34,41,44,32,84,40,34,114,97,100,105,111,32,98,117,116,116,111,110,115,34,41,41,59,13,10,32, + 32,32,32,103,114,111,117,112,45,62,115,101,116,66,111,117,110,100,115,32,40,50,48,44,32,50,48,44,32,50,50,48,44,32,49,52,48,41,59,13, + 10,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,103,114,111,117,112,41,59,13,10,13, + 10,32,32,32,32,105,110,116,32,105,59,13,10,32,32,32,32,102,111,114,32,40,105,32,61,32,48,59,32,105,32,60,32,52,59,32,43,43,105,41, + 13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,84,111,103,103,108,101,66,117,116,116,111,110,42,32,116,98,32,61,32,110,101,119,32, + 84,111,103,103,108,101,66,117,116,116,111,110,32,40,84,40,34,114,97,100,105,111,32,98,117,116,116,111,110,32,35,34,41,32,43,32,83,116,114,105, + 110,103,32,40,105,32,43,32,49,41,41,59,13,10,32,32,32,32,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105, + 115,105,98,108,101,32,40,116,98,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,82,97,100,105,111,71,114,111,117,112,73,100, + 32,40,49,50,51,52,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,66,111,117,110,100,115,32,40,52,53,44,32,52,54,32, + 43,32,105,32,42,32,50,50,44,32,49,56,48,44,32,50,50,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,84,111,111,108, + 116,105,112,32,40,84,40,34,97,32,115,101,116,32,111,102,32,109,117,116,117,97,108,108,121,45,101,120,99,108,117,115,105,118,101,32,114,97,100,105, + 111,32,98,117,116,116,111,110,115,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,32,61,61,32,48,41,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,84,111,103,103,108,101,83,116,97,116,101,32,40,116,114,117,101,44,32,102,97,108,115, + 101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,102,111,114,32,40,105,32,61,32,48,59,32,105,32,60,32,52,59,32,43,43,105, + 41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,80,97,116,104,32,110,111,114,109,97,108,44,32,111, + 118,101,114,59,13,10,13,10,32,32,32,32,32,32,32,32,80,97,116,104,32,112,59,13,10,32,32,32,32,32,32,32,32,112,46,97,100,100,83,116, + 97,114,32,40,48,46,48,102,44,32,48,46,48,102,44,32,105,32,43,32,53,44,32,50,48,46,48,102,44,32,53,48,46,48,102,44,32,45,48,46, + 50,102,41,59,13,10,32,32,32,32,32,32,32,32,110,111,114,109,97,108,46,115,101,116,80,97,116,104,32,40,112,41,59,13,10,32,32,32,32,32, + 32,32,32,110,111,114,109,97,108,46,115,101,116,83,111,108,105,100,70,105,108,108,32,40,67,111,108,111,117,114,115,58,58,108,105,103,104,116,98,108, + 117,101,41,59,13,10,32,32,32,32,32,32,32,32,110,111,114,109,97,108,46,115,101,116,79,117,116,108,105,110,101,32,40,52,46,48,102,44,32,67, + 111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,13,10,32,32,32,32,32,32,32,32,111,118,101,114,46,115,101,116,80,97,116,104,32, + 40,112,41,59,13,10,32,32,32,32,32,32,32,32,111,118,101,114,46,115,101,116,83,111,108,105,100,70,105,108,108,32,40,67,111,108,111,117,114,115, + 58,58,98,108,117,101,41,59,13,10,32,32,32,32,32,32,32,32,111,118,101,114,46,115,101,116,79,117,116,108,105,110,101,32,40,52,46,48,102,44, + 32,67,111,108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,66,117,116, + 116,111,110,42,32,100,98,32,61,32,110,101,119,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,40,83,116,114,105,110,103,32,40,105,32, + 43,32,53,41,32,43,32,84,40,34,32,112,111,105,110,116,115,34,41,44,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,58,58,73,109,97, + 103,101,65,98,111,118,101,84,101,120,116,76,97,98,101,108,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,73,109,97,103,101, + 115,32,40,38,110,111,114,109,97,108,44,32,38,111,118,101,114,44,32,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,112,97,103,101,45,62, + 97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,100,98,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116, + 67,108,105,99,107,105,110,103,84,111,103,103,108,101,115,83,116,97,116,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,100,98, + 45,62,115,101,116,82,97,100,105,111,71,114,111,117,112,73,100,32,40,50,51,52,53,54,41,59,13,10,13,10,32,32,32,32,32,32,32,32,99,111, + 110,115,116,32,105,110,116,32,98,117,116,116,111,110,83,105,122,101,32,61,32,53,48,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101, + 116,66,111,117,110,100,115,32,40,50,53,32,43,32,105,32,42,32,98,117,116,116,111,110,83,105,122,101,44,32,49,56,48,44,32,98,117,116,116,111, + 110,83,105,122,101,44,32,98,117,116,116,111,110,83,105,122,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,32,61,61,32, + 48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,84,111,103,103,108,101,83,116,97,116,101,32,40,116,114,117,101, + 44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,102,111,114,32,40,105,32,61,32,48,59,32,105,32,60,32, + 52,59,32,43,43,105,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,116,98,32,61, + 32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,98,117,116,116,111,110,32,34,41,32,43,32,83,116,114,105,110,103,32,40, + 105,32,43,32,49,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105, + 98,108,101,32,40,116,98,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,67,108,105,99,107,105,110,103,84,111,103,103,108,101, + 115,83,116,97,116,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,82,97,100,105,111,71,114,111,117, + 112,73,100,32,40,51,52,53,54,55,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,67,111,108,111,117,114,32,40,84,101,120, + 116,66,117,116,116,111,110,58,58,98,117,116,116,111,110,67,111,108,111,117,114,73,100,44,32,67,111,108,111,117,114,115,58,58,119,104,105,116,101,41, + 59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,67,111,108,111,117,114,32,40,84,101,120,116,66,117,116,116,111,110,58,58,98,117, + 116,116,111,110,79,110,67,111,108,111,117,114,73,100,44,32,67,111,108,111,117,114,115,58,58,98,108,117,101,118,105,111,108,101,116,46,98,114,105,103, + 104,116,101,114,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,66,111,117,110,100,115,32,40,50,48,32,43,32, + 105,32,42,32,53,53,44,32,50,54,48,44,32,53,53,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,67,111, + 110,110,101,99,116,101,100,69,100,103,101,115,32,40,40,40,105,32,33,61,32,48,41,32,63,32,66,117,116,116,111,110,58,58,67,111,110,110,101,99, + 116,101,100,79,110,76,101,102,116,32,58,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,124,32,40,40,105,32,33,61,32,51,41,32,63,32,66,117,116,116,111,110,58,58,67,111,110,110,101,99,116,101,100,79, + 110,82,105,103,104,116,32,58,32,48,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,105,32,61,61,32,48,41,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,116,98,45,62,115,101,116,84,111,103,103,108,101,83,116,97,116,101,32,40,116,114,117,101,44,32,102,97,108,115, + 101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,114,101,116,117,114,110,32,112,97,103,101,59,13,10,125,13,10,13,10,47,47,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99, + 108,97,115,115,32,66,117,116,116,111,110,115,80,97,103,101,32,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,66,117,116,116,111,110,76,105,115,116,101, + 110,101,114,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,66,117,116,116,111,110,115,80,97,103,101,32,40,66,117,116,116,111,110, + 76,105,115,116,101,110,101,114,42,32,98,117,116,116,111,110,76,105,115,116,101,110,101,114,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,13,10,32,32,32,32,32,32,32,32,47,47,32,99,114,101,97,116,101,32,115,111,109,101,32,100,114,97,119,97,98,108,101,115,32,116,111,32, + 117,115,101,32,102,111,114,32,111,117,114,32,100,114,97,119,97,98,108,101,32,98,117,116,116,111,110,115,46,46,46,13,10,32,32,32,32,32,32,32, + 32,68,114,97,119,97,98,108,101,80,97,116,104,32,110,111,114,109,97,108,44,32,111,118,101,114,59,13,10,13,10,32,32,32,32,32,32,32,32,80, + 97,116,104,32,112,59,13,10,32,32,32,32,32,32,32,32,112,46,97,100,100,83,116,97,114,32,40,48,46,48,102,44,32,48,46,48,102,44,32,53, + 44,32,50,48,46,48,102,44,32,53,48,46,48,102,44,32,48,46,50,102,41,59,13,10,32,32,32,32,32,32,32,32,110,111,114,109,97,108,46,115, + 101,116,80,97,116,104,32,40,112,41,59,13,10,32,32,32,32,32,32,32,32,110,111,114,109,97,108,46,115,101,116,83,111,108,105,100,70,105,108,108, + 32,40,67,111,108,111,117,114,115,58,58,114,101,100,41,59,13,10,13,10,32,32,32,32,32,32,32,32,112,46,99,108,101,97,114,40,41,59,13,10, + 32,32,32,32,32,32,32,32,112,46,97,100,100,83,116,97,114,32,40,48,46,48,102,44,32,48,46,48,102,44,32,55,44,32,51,48,46,48,102,44, + 32,53,48,46,48,102,44,32,48,46,48,102,41,59,13,10,32,32,32,32,32,32,32,32,111,118,101,114,46,115,101,116,80,97,116,104,32,40,112,41, + 59,13,10,32,32,32,32,32,32,32,32,111,118,101,114,46,115,101,116,83,111,108,105,100,70,105,108,108,32,40,67,111,108,111,117,114,115,58,58,112, + 105,110,107,41,59,13,10,32,32,32,32,32,32,32,32,111,118,101,114,46,115,101,116,79,117,116,108,105,110,101,32,40,53,46,48,102,44,32,67,111, + 108,111,117,114,115,58,58,98,108,97,99,107,41,59,13,10,13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,73,109,97,103,101,32, + 100,111,119,110,59,13,10,32,32,32,32,32,32,32,32,100,111,119,110,46,115,101,116,73,109,97,103,101,32,40,73,109,97,103,101,67,97,99,104,101, + 58,58,103,101,116,70,114,111,109,77,101,109,111,114,121,32,40,66,105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,44,32,66, + 105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,83,105,122,101,41,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32, + 32,32,100,111,119,110,46,115,101,116,79,118,101,114,108,97,121,67,111,108,111,117,114,32,40,67,111,108,111,117,114,115,58,58,98,108,97,99,107,46, + 119,105,116,104,65,108,112,104,97,32,40,48,46,51,102,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32, + 47,47,32,99,114,101,97,116,101,32,97,110,32,105,109,97,103,101,45,97,98,111,118,101,45,116,101,120,116,32,98,117,116,116,111,110,32,102,114,111, + 109,32,116,104,101,115,101,32,100,114,97,119,97,98,108,101,115,46,46,13,10,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,66,117,116, + 116,111,110,42,32,100,98,32,61,32,110,101,119,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,40,84,40,34,66,117,116,116,111,110,32, + 49,34,41,44,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,58,58,73,109,97,103,101,65,98,111,118,101,84,101,120,116,76,97,98,101,108, + 41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,73,109,97,103,101,115,32,40,38,110,111,114,109,97,108,44,32,38,111,118,101, + 114,44,32,38,100,111,119,110,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32, + 40,100,98,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,51,48,44,32,56,48, + 44,32,56,48,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,84,111,111,108,116,105,112,32,40,84,40,34,116,104,105,115,32, + 105,115,32,97,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,119,105,116,104,32,97,32,108,97,98,101,108,34,41,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32,47,47,32,99,114,101,97,116,101,32,97,110,32,105,109,97,103,101,45,111,110,108, + 121,32,98,117,116,116,111,110,32,102,114,111,109,32,116,104,101,115,101,32,100,114,97,119,97,98,108,101,115,46,46,13,10,32,32,32,32,32,32,32, + 32,100,98,32,61,32,110,101,119,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,40,84,40,34,66,117,116,116,111,110,32,50,34,41,44, + 32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,58,58,73,109,97,103,101,70,105,116,116,101,100,41,59,13,10,32,32,32,32,32,32,32,32, + 100,98,45,62,115,101,116,73,109,97,103,101,115,32,40,38,110,111,114,109,97,108,44,32,38,111,118,101,114,44,32,38,100,111,119,110,41,59,13,10, + 32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,67,108,105,99,107,105,110,103,84,111,103,103,108,101,115,83,116,97,116,101,32,40,116,114,117, + 101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,100,98,41,59,13,10, + 32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,66,111,117,110,100,115,32,40,57,48,44,32,51,48,44,32,56,48,44,32,56,48,41,59,13, + 10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,84,111,111,108,116,105,112,32,40,84,40,34,116,104,105,115,32,105,115,32,97,110,32,105, + 109,97,103,101,45,111,110,108,121,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,34,41,41,59,13,10,32,32,32,32,32,32,32,32,100,98, + 45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,98,117,116,116,111,110,76,105,115,116,101,110,101,114,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32,47,47,32,99,114,101,97,116,101,32,97,110,32,105,109,97,103,101,45,111,110, + 45,98,117,116,116,111,110,45,115,104,97,112,101,32,98,117,116,116,111,110,32,102,114,111,109,32,116,104,101,32,115,97,109,101,32,100,114,97,119,97, + 98,108,101,115,46,46,13,10,32,32,32,32,32,32,32,32,100,98,32,61,32,110,101,119,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32, + 40,84,40,34,66,117,116,116,111,110,32,51,34,41,44,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,58,58,73,109,97,103,101,79,110,66, + 117,116,116,111,110,66,97,99,107,103,114,111,117,110,100,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,73,109,97,103,101,115, + 32,40,38,110,111,114,109,97,108,44,32,48,44,32,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86, + 105,115,105,98,108,101,32,40,100,98,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,66,111,117,110,100,115,32,40,50,48,48, + 44,32,51,48,44,32,49,49,48,44,32,50,53,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,84,111,111,108,116,105,112,32, + 40,84,40,34,116,104,105,115,32,105,115,32,97,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,111,110,32,97,32,115,116,97,110,100,97, + 114,100,32,98,117,116,116,111,110,32,98,97,99,107,103,114,111,117,110,100,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32, + 32,32,32,32,32,32,100,98,32,61,32,110,101,119,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,40,84,40,34,66,117,116,116,111,110, + 32,52,34,41,44,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,58,58,73,109,97,103,101,79,110,66,117,116,116,111,110,66,97,99,107,103, + 114,111,117,110,100,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,73,109,97,103,101,115,32,40,38,110,111,114,109,97,108,44, + 32,38,111,118,101,114,44,32,38,100,111,119,110,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,67,108,105,99,107,105,110,103, + 84,111,103,103,108,101,115,83,116,97,116,101,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,66,97,99, + 107,103,114,111,117,110,100,67,111,108,111,117,114,115,32,40,67,111,108,111,117,114,115,58,58,119,104,105,116,101,44,32,67,111,108,111,117,114,115,58, + 58,121,101,108,108,111,119,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 100,98,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,66,111,117,110,100,115,32,40,50,48,48,44,32,55,48,44,32,53,48, + 44,32,53,48,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,115,101,116,84,111,111,108,116,105,112,32,40,84,40,34,116,104,105,115,32, + 105,115,32,97,32,68,114,97,119,97,98,108,101,66,117,116,116,111,110,32,111,110,32,97,32,115,116,97,110,100,97,114,100,32,98,117,116,116,111,110, + 32,98,97,99,107,103,114,111,117,110,100,34,41,41,59,13,10,32,32,32,32,32,32,32,32,100,98,45,62,97,100,100,66,117,116,116,111,110,76,105, + 115,116,101,110,101,114,32,40,98,117,116,116,111,110,76,105,115,116,101,110,101,114,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32, + 32,32,32,32,32,32,72,121,112,101,114,108,105,110,107,66,117,116,116,111,110,42,32,104,121,112,101,114,108,105,110,107,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,61,32,110,101,119,32,72,121,112,101,114,108,105,110,107,66,117,116,116,111,110,32,40,84,40,34,116,104,105,115,32,105,115,32, + 97,32,72,121,112,101,114,108,105,110,107,66,117,116,116,111,110,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,85,82,76,32,40,84,40,34,104,116,116,112,58,47,47,119,119,119,46,114,97,119, + 109,97,116,101,114,105,97,108,115,111,102,116,119,97,114,101,46,99,111,109,47,106,117,99,101,34,41,41,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,104,121,112,101,114,108,105,110,107,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,49,51,48,44,32,50,48,48,44,32,50,52, + 41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,104,121,112,101,114,108,105,110,107, + 41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32,73,109,97,103,101,66,117,116,116,111,110,42,32,105,109,97, + 103,101,66,117,116,116,111,110,32,61,32,110,101,119,32,73,109,97,103,101,66,117,116,116,111,110,32,40,84,40,34,105,109,97,103,101,98,117,116,116, + 111,110,34,41,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,105,109,97,103,101, + 66,117,116,116,111,110,41,59,13,10,13,10,32,32,32,32,32,32,32,32,73,109,97,103,101,42,32,106,117,99,101,73,109,97,103,101,32,61,32,73, + 109,97,103,101,67,97,99,104,101,58,58,103,101,116,70,114,111,109,77,101,109,111,114,121,32,40,66,105,110,97,114,121,68,97,116,97,58,58,106,117, + 99,101,95,112,110,103,44,32,66,105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,83,105,122,101,41,59,13,10,32,32,32,32, + 32,32,32,32,73,109,97,103,101,67,97,99,104,101,58,58,105,110,99,82,101,102,101,114,101,110,99,101,67,111,117,110,116,32,40,106,117,99,101,73, + 109,97,103,101,41,59,13,10,32,32,32,32,32,32,32,32,73,109,97,103,101,67,97,99,104,101,58,58,105,110,99,82,101,102,101,114,101,110,99,101, + 67,111,117,110,116,32,40,106,117,99,101,73,109,97,103,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,109,97,103,101,66,117,116,116,111, + 110,45,62,115,101,116,73,109,97,103,101,115,32,40,116,114,117,101,44,32,116,114,117,101,44,32,116,114,117,101,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,73,109,97,103,101,44,32,48,46,55,102, + 44,32,67,111,108,111,117,114,115,58,58,116,114,97,110,115,112,97,114,101,110,116,66,108,97,99,107,44,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,73,109,97,103,101,44,32,49,46,48,102,44,32,67, + 111,108,111,117,114,115,58,58,116,114,97,110,115,112,97,114,101,110,116,66,108,97,99,107,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,73,109,97,103,101,44,32,49,46,48,102,44,32,67,111,108,111, + 117,114,115,58,58,112,105,110,107,46,119,105,116,104,65,108,112,104,97,32,40,48,46,56,102,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,48,46,53,102,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105, + 109,97,103,101,66,117,116,116,111,110,45,62,115,101,116,84,111,112,76,101,102,116,80,111,115,105,116,105,111,110,32,40,49,48,44,32,49,54,48,41, + 59,13,10,32,32,32,32,32,32,32,32,105,109,97,103,101,66,117,116,116,111,110,45,62,115,101,116,84,111,111,108,116,105,112,32,40,84,40,34,105, + 109,97,103,101,32,98,117,116,116,111,110,32,45,32,115,104,111,119,105,110,103,32,97,108,112,104,97,45,99,104,97,110,110,101,108,32,104,105,116,45, + 116,101,115,116,105,110,103,32,97,110,100,32,99,111,108,111,117,114,32,111,118,101,114,108,97,121,32,119,104,101,110,32,99,108,105,99,107,101,100,34, + 41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32,67,111,108,111,117,114,67,104,97,110,103,101,66,117,116, + 116,111,110,42,32,99,111,108,111,117,114,67,104,97,110,103,101,66,117,116,116,111,110,32,61,32,110,101,119,32,67,111,108,111,117,114,67,104,97,110, + 103,101,66,117,116,116,111,110,40,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 99,111,108,111,117,114,67,104,97,110,103,101,66,117,116,116,111,110,41,59,13,10,32,32,32,32,32,32,32,32,99,111,108,111,117,114,67,104,97,110, + 103,101,66,117,116,116,111,110,45,62,115,101,116,84,111,112,76,101,102,116,80,111,115,105,116,105,111,110,32,40,51,53,48,44,32,51,48,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32,97,110,105,109,97,116,101,66,117,116,116,111,110,32,61,32,110,101,119, + 32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,99,108,105,99,107,32,116,111,32,97,110,105,109,97,116,101,46,46,46,34,41,41,59,13, + 10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,97,110,105,109,97,116,101,66,117,116,116,111, + 110,41,59,13,10,32,32,32,32,32,32,32,32,97,110,105,109,97,116,101,66,117,116,116,111,110,45,62,99,104,97,110,103,101,87,105,100,116,104,84, + 111,70,105,116,84,101,120,116,32,40,50,52,41,59,13,10,32,32,32,32,32,32,32,32,97,110,105,109,97,116,101,66,117,116,116,111,110,45,62,115, + 101,116,84,111,112,76,101,102,116,80,111,115,105,116,105,111,110,32,40,51,53,48,44,32,55,48,41,59,13,10,32,32,32,32,32,32,32,32,97,110, + 105,109,97,116,101,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10, + 32,32,32,32,125,13,10,13,10,32,32,32,32,126,66,117,116,116,111,110,115,80,97,103,101,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118, + 111,105,100,32,98,117,116,116,111,110,67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,41,13,10,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,103,101,116,78,117,109,67,104,105,108,100,67,111,109,112,111,110,101,110,116,115,40,41, + 59,32,45,45,105,32,62,61,32,48,59,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32, + 40,103,101,116,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,105,41,32,33,61,32,97,110,105,109,97,116,101,66,117,116,116,111,110,41, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,110,105,109,97,116,111, + 114,46,97,110,105,109,97,116,101,67,111,109,112,111,110,101,110,116,32,40,103,101,116,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,105, + 41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,82,101,99,116,97,110,103,108,101,32,40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111, + 109,40,41,46,110,101,120,116,73,110,116,32,40,103,101,116,87,105,100,116,104,40,41,32,47,32,50,41,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40, + 103,101,116,72,101,105,103,104,116,40,41,32,47,32,50,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,54,48,32,43,32,82,97, + 110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,103,101,116,87,105,100,116, + 104,40,41,32,47,32,51,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,49,54,32,43,32,82,97,110,100,111,109,58,58,103,101, + 116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,73,110,116,32,40,103,101,116,72,101,105,103,104,116,40,41,32,47,32,54, + 41,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,53,48,48,32,43,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46, + 110,101,120,116,73,110,116,32,40,50,48,48,48,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110, + 100,111,109,40,41,46,110,101,120,116,68,111,117,98,108,101,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101, + 109,82,97,110,100,111,109,40,41,46,110,101,120,116,68,111,117,98,108,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13, + 10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,112,114,105,118,97,116,101,58,13,10,32,32,32,32,84,101,120,116,66, + 117,116,116,111,110,42,32,97,110,105,109,97,116,101,66,117,116,116,111,110,59,13,10,32,32,32,32,67,111,109,112,111,110,101,110,116,65,110,105,109, + 97,116,111,114,32,97,110,105,109,97,116,111,114,59,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,115,116,97,116,105,99,32,67,111,109,112,111,110,101, + 110,116,42,32,99,114,101,97,116,101,77,105,115,99,80,97,103,101,40,41,13,10,123,13,10,32,32,32,32,68,101,109,111,80,97,103,101,67,111,109, + 112,42,32,112,97,103,101,32,61,32,110,101,119,32,68,101,109,111,80,97,103,101,67,111,109,112,40,41,59,13,10,13,10,32,32,32,32,84,101,120, + 116,69,100,105,116,111,114,42,32,116,101,120,116,69,100,105,116,111,114,32,61,32,110,101,119,32,84,101,120,116,69,100,105,116,111,114,40,41,59,13, + 10,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116,101,120,116,69,100,105,116,111,114, + 41,59,13,10,32,32,32,32,116,101,120,116,69,100,105,116,111,114,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,50,53,44,32,50, + 48,48,44,32,50,52,41,59,13,10,32,32,32,32,116,101,120,116,69,100,105,116,111,114,45,62,115,101,116,84,101,120,116,32,40,84,40,34,115,105, + 110,103,108,101,45,108,105,110,101,32,116,101,120,116,32,98,111,120,34,41,41,59,13,10,13,10,32,32,32,32,116,101,120,116,69,100,105,116,111,114, + 32,61,32,110,101,119,32,84,101,120,116,69,100,105,116,111,114,32,40,84,40,34,112,97,115,115,119,111,114,100,34,41,44,32,40,116,99,104,97,114, + 41,32,48,120,50,48,50,50,41,59,13,10,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32, + 40,116,101,120,116,69,100,105,116,111,114,41,59,13,10,32,32,32,32,116,101,120,116,69,100,105,116,111,114,45,62,115,101,116,66,111,117,110,100,115, + 32,40,49,48,44,32,53,53,44,32,50,48,48,44,32,50,52,41,59,13,10,32,32,32,32,116,101,120,116,69,100,105,116,111,114,45,62,115,101,116, + 84,101,120,116,32,40,84,40,34,112,97,115,115,119,111,114,100,34,41,41,59,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,67,111,109,98,111, + 66,111,120,42,32,99,111,109,98,111,66,111,120,32,61,32,110,101,119,32,67,111,109,98,111,66,111,120,32,40,84,40,34,99,111,109,98,111,34,41, + 41,59,13,10,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,99,111,109,98,111,66,111, + 120,41,59,13,10,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115,101,116,66,111,117,110,100,115,32,40,51,48,48,44,32,50,53,44,32,50, + 48,48,44,32,50,52,41,59,13,10,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115,101,116,69,100,105,116,97,98,108,101,84,101,120,116,32, + 40,116,114,117,101,41,59,13,10,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115,101,116,74,117,115,116,105,102,105,99,97,116,105,111,110,84, + 121,112,101,32,40,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,99,101,110,116,114,101,100,41,59,13,10,13,10,32,32,32,32,105,110,116, + 32,105,59,13,10,32,32,32,32,102,111,114,32,40,105,32,61,32,49,59,32,105,32,60,32,49,48,48,59,32,43,43,105,41,13,10,32,32,32,32, + 32,32,32,32,99,111,109,98,111,66,111,120,45,62,97,100,100,73,116,101,109,32,40,84,40,34,99,111,109,98,111,32,98,111,120,32,105,116,101,109, + 32,34,41,32,43,32,83,116,114,105,110,103,32,40,105,41,44,32,105,41,59,13,10,13,10,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115, + 101,116,83,101,108,101,99,116,101,100,73,100,32,40,49,41,59,13,10,13,10,32,32,32,32,68,114,97,103,79,110,116,111,68,101,115,107,116,111,112, + 68,101,109,111,67,111,109,112,42,32,100,32,61,32,110,101,119,32,68,114,97,103,79,110,116,111,68,101,115,107,116,111,112,68,101,109,111,67,111,109, + 112,32,40,112,97,103,101,41,59,13,10,32,32,32,32,112,97,103,101,45,62,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 100,41,59,13,10,32,32,32,32,100,45,62,115,101,116,66,111,117,110,100,115,32,40,50,48,44,32,49,48,48,44,32,50,48,48,44,32,56,48,41, + 59,13,10,13,10,32,32,32,32,114,101,116,117,114,110,32,112,97,103,101,59,13,10,125,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,84,111,111,108, + 98,97,114,68,101,109,111,67,111,109,112,32,32,32,58,32,112,117,98,108,105,99,32,67,111,109,112,111,110,101,110,116,44,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,83,108,105,100,101,114,76,105,115,116,101,110, + 101,114,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,66,117, + 116,116,111,110,76,105,115,116,101,110,101,114,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,84,111,111,108,98,97,114,68,101,109, + 111,67,111,109,112,32,40,65,112,112,108,105,99,97,116,105,111,110,67,111,109,109,97,110,100,77,97,110,97,103,101,114,42,32,99,111,109,109,97,110, + 100,77,97,110,97,103,101,114,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47,47,32,67,114,101,97,116,101,32,97,110,100,32, + 97,100,100,32,116,104,101,32,116,111,111,108,98,97,114,46,46,46,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105, + 115,105,98,108,101,32,40,116,111,111,108,98,97,114,32,61,32,110,101,119,32,84,111,111,108,98,97,114,40,41,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,47,47,32,65,110,100,32,117,115,101,32,111,117,114,32,105,116,101,109,32,102,97,99,116,111,114,121,32,116,111,32,97,100,100,32,97, + 32,115,101,116,32,111,102,32,100,101,102,97,117,108,116,32,105,99,111,110,115,32,116,111,32,105,116,46,46,46,13,10,32,32,32,32,32,32,32,32, + 116,111,111,108,98,97,114,45,62,97,100,100,68,101,102,97,117,108,116,73,116,101,109,115,32,40,102,97,99,116,111,114,121,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,47,47,32,78,111,119,32,119,101,39,108,108,32,106,117,115,116,32,99,114,101,97,116,101,32,116,104,101,32,111,116,104,101, + 114,32,115,108,105,100,101,114,115,32,97,110,100,32,98,117,116,116,111,110,115,32,111,110,32,116,104,101,32,100,101,109,111,32,112,97,103,101,44,32, + 119,104,105,99,104,32,97,100,106,117,115,116,13,10,32,32,32,32,32,32,32,32,47,47,32,116,104,101,32,116,111,111,108,98,97,114,39,115,32,112, + 114,111,112,101,114,116,105,101,115,46,46,46,13,10,32,32,32,32,32,32,32,32,76,97,98,101,108,42,32,105,110,102,111,32,61,32,110,101,119,32, + 76,97,98,101,108,32,40,83,116,114,105,110,103,58,58,101,109,112,116,121,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,65,115,32,119, + 101,108,108,32,97,115,32,115,104,111,119,105,110,103,32,111,102,102,32,116,111,111,108,98,97,114,115,44,32,116,104,105,115,32,100,101,109,111,32,105, + 108,108,117,115,116,114,97,116,101,115,32,104,111,119,32,116,111,32,115,116,111,114,101,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34, + 97,32,115,101,116,32,111,102,32,83,86,71,32,102,105,108,101,115,32,105,110,32,97,32,90,105,112,32,102,105,108,101,44,32,101,109,98,101,100,32, + 116,104,97,116,32,105,110,32,121,111,117,114,32,97,112,112,108,105,99,97,116,105,111,110,44,32,97,110,100,32,114,101,97,100,32,34,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,34,116,104,101,109,32,98,97,99,107,32,105,110,32,97,116,32,114,117,110,116,105,109,101,46,92,110,92,110,84, + 104,101,32,105,99,111,110,32,105,109,97,103,101,115,32,104,101,114,101,32,97,114,101,32,116,97,107,101,110,32,102,114,111,109,32,116,104,101,32,111, + 112,101,110,45,115,111,117,114,99,101,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,84,97,110,103,111,32,105,99,111,110,32,112,114, + 111,106,101,99,116,46,34,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 105,110,102,111,41,59,13,10,32,32,32,32,32,32,32,32,105,110,102,111,45,62,115,101,116,74,117,115,116,105,102,105,99,97,116,105,111,110,84,121, + 112,101,32,40,74,117,115,116,105,102,105,99,97,116,105,111,110,58,58,116,111,112,76,101,102,116,41,59,13,10,32,32,32,32,32,32,32,32,105,110, + 102,111,45,62,115,101,116,66,111,117,110,100,115,32,40,56,48,44,32,56,48,44,32,52,53,48,44,32,49,48,48,41,59,13,10,32,32,32,32,32, + 32,32,32,105,110,102,111,45,62,115,101,116,73,110,116,101,114,99,101,112,116,115,77,111,117,115,101,67,108,105,99,107,115,32,40,102,97,108,115,101, + 44,32,102,97,108,115,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 100,101,112,116,104,83,108,105,100,101,114,32,61,32,110,101,119,32,83,108,105,100,101,114,32,40,84,40,34,116,111,111,108,98,97,114,32,100,101,112, + 116,104,58,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,100,101,112,116,104,83,108,105,100,101,114,45,62,115,101,116,82,97,110,103,101,32, + 40,49,48,46,48,44,32,50,48,48,46,48,44,32,49,46,48,41,59,13,10,32,32,32,32,32,32,32,32,100,101,112,116,104,83,108,105,100,101,114, + 45,62,115,101,116,86,97,108,117,101,32,40,53,48,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32,32,32,100,101,112,116,104,83,108, + 105,100,101,114,45,62,115,101,116,83,108,105,100,101,114,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,76,105,110,101,97,114,72,111,114,105, + 122,111,110,116,97,108,41,59,13,10,32,32,32,32,32,32,32,32,100,101,112,116,104,83,108,105,100,101,114,45,62,115,101,116,84,101,120,116,66,111, + 120,83,116,121,108,101,32,40,83,108,105,100,101,114,58,58,84,101,120,116,66,111,120,76,101,102,116,44,32,102,97,108,115,101,44,32,56,48,44,32, + 50,48,41,59,13,10,32,32,32,32,32,32,32,32,100,101,112,116,104,83,108,105,100,101,114,45,62,97,100,100,76,105,115,116,101,110,101,114,32,40, + 116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,100,101,112,116,104,83,108,105,100,101,114,45,62,115,101,116,66,111,117,110,100,115,32,40, + 56,48,44,32,50,49,48,44,32,51,48,48,44,32,50,50,41,59,13,10,32,32,32,32,32,32,32,32,40,110,101,119,32,76,97,98,101,108,32,40, + 100,101,112,116,104,83,108,105,100,101,114,45,62,103,101,116,78,97,109,101,40,41,44,32,100,101,112,116,104,83,108,105,100,101,114,45,62,103,101,116, + 78,97,109,101,40,41,41,41,45,62,97,116,116,97,99,104,84,111,67,111,109,112,111,110,101,110,116,32,40,100,101,112,116,104,83,108,105,100,101,114, + 44,32,102,97,108,115,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40, + 111,114,105,101,110,116,97,116,105,111,110,66,117,116,116,111,110,32,61,32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,118, + 101,114,116,105,99,97,108,47,104,111,114,105,122,111,110,116,97,108,34,41,41,41,59,13,10,32,32,32,32,32,32,32,32,111,114,105,101,110,116,97, + 116,105,111,110,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,32, + 32,32,32,32,32,32,32,111,114,105,101,110,116,97,116,105,111,110,66,117,116,116,111,110,45,62,99,104,97,110,103,101,87,105,100,116,104,84,111,70, + 105,116,84,101,120,116,32,40,50,50,41,59,13,10,32,32,32,32,32,32,32,32,111,114,105,101,110,116,97,116,105,111,110,66,117,116,116,111,110,45, + 62,115,101,116,84,111,112,76,101,102,116,80,111,115,105,116,105,111,110,32,40,100,101,112,116,104,83,108,105,100,101,114,45,62,103,101,116,88,40,41, + 44,32,100,101,112,116,104,83,108,105,100,101,114,45,62,103,101,116,66,111,116,116,111,109,40,41,32,43,32,50,48,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,99,117,115,116,111,109,105,115,101,66,117,116,116,111,110,32, + 61,32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84,40,34,99,117,115,116,111,109,105,115,101,46,46,46,34,41,41,41,59,13,10, + 32,32,32,32,32,32,32,32,99,117,115,116,111,109,105,115,101,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110, + 101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,99,117,115,116,111,109,105,115,101,66,117,116,116,111,110,45,62,99,104,97, + 110,103,101,87,105,100,116,104,84,111,70,105,116,84,101,120,116,32,40,50,50,41,59,13,10,32,32,32,32,32,32,32,32,99,117,115,116,111,109,105, + 115,101,66,117,116,116,111,110,45,62,115,101,116,84,111,112,76,101,102,116,80,111,115,105,116,105,111,110,32,40,111,114,105,101,110,116,97,116,105,111, + 110,66,117,116,116,111,110,45,62,103,101,116,82,105,103,104,116,40,41,32,43,32,50,48,44,32,111,114,105,101,110,116,97,116,105,111,110,66,117,116, + 116,111,110,45,62,103,101,116,89,40,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,84,111,111,108,98,97,114,68,101,109,111, + 67,111,109,112,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110, + 40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,105,102,32,40,116,111,111,108,98,97,114,45,62,105,115,86,101,114,116,105,99,97,108,40,41,41,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,116,111,111,108,98,97,114,45,62,115,101,116,66,111,117,110,100,115,32,40,48,44,32,48,44,32,40,105,110,116,41, + 32,100,101,112,116,104,83,108,105,100,101,114,45,62,103,101,116,86,97,108,117,101,40,41,44,32,103,101,116,72,101,105,103,104,116,40,41,41,59,13, + 10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,111,108,98,97,114,45,62,115,101,116,66, + 111,117,110,100,115,32,40,48,44,32,48,44,32,103,101,116,87,105,100,116,104,40,41,44,32,40,105,110,116,41,32,100,101,112,116,104,83,108,105,100, + 101,114,45,62,103,101,116,86,97,108,117,101,40,41,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,115,108,105,100, + 101,114,86,97,108,117,101,67,104,97,110,103,101,100,32,40,83,108,105,100,101,114,42,32,115,108,105,100,101,114,41,13,10,32,32,32,32,123,13,10, + 32,32,32,32,32,32,32,32,114,101,115,105,122,101,100,40,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,98,117, + 116,116,111,110,67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10,32,32,32,32,123,13,10,32,32,32, + 32,32,32,32,32,105,102,32,40,98,117,116,116,111,110,32,61,61,32,111,114,105,101,110,116,97,116,105,111,110,66,117,116,116,111,110,41,13,10,32, + 32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,111,108,98,97,114,45,62,115,101,116,86,101,114,116,105,99, + 97,108,32,40,33,32,116,111,111,108,98,97,114,45,62,105,115,86,101,114,116,105,99,97,108,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,114,101,115,105,122,101,100,40,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105, + 102,32,40,98,117,116,116,111,110,32,61,61,32,99,117,115,116,111,109,105,115,101,66,117,116,116,111,110,41,13,10,32,32,32,32,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,111,108,98,97,114,45,62,115,104,111,119,67,117,115,116,111,109,105,115,97,116,105,111,110, + 68,105,97,108,111,103,32,40,102,97,99,116,111,114,121,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,13,10,112, + 114,105,118,97,116,101,58,13,10,32,32,32,32,84,111,111,108,98,97,114,42,32,116,111,111,108,98,97,114,59,13,10,32,32,32,32,83,108,105,100, + 101,114,42,32,100,101,112,116,104,83,108,105,100,101,114,59,13,10,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,111,114,105,101,110,116, + 97,116,105,111,110,66,117,116,116,111,110,59,13,10,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,99,117,115,116,111,109,105,115,101,66, + 117,116,116,111,110,59,13,10,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,99,108,97,115,115,32,68,101,109,111,84,111,111,108,98,97,114,73,116,101, + 109,70,97,99,116,111,114,121,32,32,32,58,32,112,117,98,108,105,99,32,84,111,111,108,98,97,114,73,116,101,109,70,97,99,116,111,114,121,13,10, + 32,32,32,32,123,13,10,32,32,32,32,112,117,98,108,105,99,58,13,10,32,32,32,32,32,32,32,32,68,101,109,111,84,111,111,108,98,97,114,73, + 116,101,109,70,97,99,116,111,114,121,40,41,32,123,125,13,10,32,32,32,32,32,32,32,32,126,68,101,109,111,84,111,111,108,98,97,114,73,116,101, + 109,70,97,99,116,111,114,121,40,41,32,123,125,13,10,13,10,32,32,32,32,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32,32,32,32,32,32,32,32,47,47,32,69,97, + 99,104,32,116,121,112,101,32,111,102,32,105,116,101,109,32,97,32,116,111,111,108,98,97,114,32,99,97,110,32,99,111,110,116,97,105,110,32,109,117, + 115,116,32,98,101,32,103,105,118,101,110,32,97,32,117,110,105,113,117,101,32,73,68,46,32,84,104,101,115,101,13,10,32,32,32,32,32,32,32,32, + 47,47,32,97,114,101,32,116,104,101,32,111,110,101,115,32,119,101,39,108,108,32,117,115,101,32,105,110,32,116,104,105,115,32,100,101,109,111,46,13, + 10,32,32,32,32,32,32,32,32,101,110,117,109,32,68,101,109,111,84,111,111,108,98,97,114,73,116,101,109,73,100,115,13,10,32,32,32,32,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,111,99,95,110,101,119,32,32,32,32,32,32,32,32,32,61,32,49,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,100,111,99,95,111,112,101,110,32,32,32,32,32,32,32,32,61,32,50,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,100,111,99,95,115,97,118,101,32,32,32,32,32,32,32,32,61,32,51,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100, + 111,99,95,115,97,118,101,65,115,32,32,32,32,32,32,61,32,52,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,100,105,116,95,99,111, + 112,121,32,32,32,32,32,32,32,61,32,53,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,100,105,116,95,99,117,116,32,32,32,32,32, + 32,32,32,61,32,54,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,100,105,116,95,112,97,115,116,101,32,32,32,32,32,32,61,32,55, + 44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,76,111,103,111,66,117,116,116,111,110,32,32,61,32,56,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,99,117,115,116,111,109,67,111,109,98,111,66,111,120,32,32,61,32,57,13,10,32,32,32,32,32,32,32,32,125,59, + 13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,103,101,116,65,108,108,84,111,111,108,98,97,114,73,116,101,109,73,100,115,32,40,65, + 114,114,97,121,32,60,105,110,116,62,38,32,105,100,115,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,47,47,32,84,104,105,115,32,114,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,108,101,116,101,32,108,105,115,116,32,111,102,32,97,108, + 108,32,105,116,101,109,32,73,68,115,32,116,104,97,116,32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,47,47,32,103,111,32,105,110,32,111,117,114,32,116,111,111,108,98,97,114,46,32,65,110,121,32,105,116,101,109,115,32,121,111,117,32, + 109,105,103,104,116,32,119,97,110,116,32,116,111,32,97,100,100,32,109,117,115,116,32,98,101,32,108,105,115,116,101,100,32,104,101,114,101,46,32,84, + 104,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,111,114,100,101,114,32,105,110,32,119,104,105,99,104,32,116,104,101,121,32,97, + 114,101,32,108,105,115,116,101,100,32,119,105,108,108,32,98,101,32,117,115,101,100,32,98,121,32,116,104,101,32,116,111,111,108,98,97,114,32,99,117, + 115,116,111,109,105,115,97,116,105,111,110,32,112,97,110,101,108,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100, + 100,32,40,100,111,99,95,110,101,119,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,100,111,99,95,111, + 112,101,110,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,100,111,99,95,115,97,118,101,41,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,100,111,99,95,115,97,118,101,65,115,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,101,100,105,116,95,99,111,112,121,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,105,100,115,46,97,100,100,32,40,101,100,105,116,95,99,117,116,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100, + 100,32,40,101,100,105,116,95,112,97,115,116,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,106,117, + 99,101,76,111,103,111,66,117,116,116,111,110,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,99,117,115, + 116,111,109,67,111,109,98,111,66,111,120,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,73,102,32,121,111,117,39,114, + 101,32,103,111,105,110,103,32,116,111,32,117,115,101,32,115,101,112,97,114,97,116,111,114,115,44,32,116,104,101,110,32,116,104,101,121,32,109,117,115, + 116,32,97,108,115,111,32,98,101,32,97,100,100,101,100,32,101,120,112,108,105,99,105,116,108,121,13,10,32,32,32,32,32,32,32,32,32,32,32,32, + 47,47,32,116,111,32,116,104,101,32,108,105,115,116,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,115,101, + 112,97,114,97,116,111,114,66,97,114,73,100,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,115,112,97, + 99,101,114,73,100,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,102,108,101,120,105,98,108,101,83,112, + 97,99,101,114,73,100,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,118,111,105,100,32,103,101,116,68, + 101,102,97,117,108,116,73,116,101,109,83,101,116,32,40,65,114,114,97,121,32,60,105,110,116,62,38,32,105,100,115,41,13,10,32,32,32,32,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,84,104,105,115,32,114,101,116,117,114,110,115,32,97,110,32,111,114,100,101, + 114,101,100,32,108,105,115,116,32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,105,116,101,109,115,32,116,104,97,116,32,109,97,107,101,32,117, + 112,32,97,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,111,111,108,98,97,114,39,115,32,100,101,102,97,117,108,116,32,115,101, + 116,46,32,78,111,116,32,97,108,108,32,105,116,101,109,115,32,110,101,101,100,32,116,111,32,98,101,32,111,110,32,116,104,105,115,32,108,105,115,116, + 44,32,97,110,100,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,105,116,101,109,115,32,99,97,110,32,97,112,112,101,97,114,32,109, + 117,108,116,105,112,108,101,32,116,105,109,101,115,32,40,101,46,103,46,32,116,104,101,32,115,101,112,97,114,97,116,111,114,115,32,117,115,101,100,32, + 104,101,114,101,41,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,100,111,99,95,110,101,119,41,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,100,111,99,95,111,112,101,110,41,59,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,105,100,115,46,97,100,100,32,40,100,111,99,95,115,97,118,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100, + 115,46,97,100,100,32,40,100,111,99,95,115,97,118,101,65,115,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100, + 32,40,115,112,97,99,101,114,73,100,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,115,101,112,97,114, + 97,116,111,114,66,97,114,73,100,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,101,100,105,116,95,99, + 111,112,121,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,101,100,105,116,95,99,117,116,41,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,101,100,105,116,95,112,97,115,116,101,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,115,101,112,97,114,97,116,111,114,66,97,114,73,100,41,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,102,108,101,120,105,98,108,101,83,112,97,99,101,114,73,100,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,99,117,115,116,111,109,67,111,109,98,111,66,111,120,41,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,102,108,101,120,105,98,108,101,83,112,97,99,101,114,73,100,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,115,101,112,97,114,97,116,111,114,66,97,114,73,100,41,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,105,100,115,46,97,100,100,32,40,106,117,99,101,76,111,103,111,66,117,116,116,111,110,41,59,13,10,32,32,32,32,32,32,32, + 32,125,13,10,13,10,32,32,32,32,32,32,32,32,84,111,111,108,98,97,114,73,116,101,109,67,111,109,112,111,110,101,110,116,42,32,99,114,101,97, + 116,101,73,116,101,109,32,40,99,111,110,115,116,32,105,110,116,32,105,116,101,109,73,100,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,105,116,101,109,73,100,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,100,111,99,95,110,101,119,58,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,114,101,116,117,114,110,32,99,114,101,97,116,101,66,117,116,116,111,110,70,114,111,109,90,105,112,70,105,108,101,83,86,71,32,40, + 105,116,101,109,73,100,44,32,84,40,34,110,101,119,34,41,44,32,84,40,34,100,111,99,117,109,101,110,116,45,110,101,119,46,115,118,103,34,41,41, + 59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,100,111,99,95,111,112,101,110,58,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,114,101,97,116,101,66,117,116,116,111,110,70,114,111,109,90,105,112,70,105,108,101,83, + 86,71,32,40,105,116,101,109,73,100,44,32,84,40,34,111,112,101,110,34,41,44,32,84,40,34,100,111,99,117,109,101,110,116,45,111,112,101,110,46, + 115,118,103,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,100,111,99,95,115,97,118,101,58,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,114,101,97,116,101,66,117,116,116,111,110,70,114,111,109,90,105, + 112,70,105,108,101,83,86,71,32,40,105,116,101,109,73,100,44,32,84,40,34,115,97,118,101,34,41,44,32,84,40,34,100,111,99,117,109,101,110,116, + 45,115,97,118,101,46,115,118,103,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,100,111,99,95,115,97, + 118,101,65,115,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,114,101,97,116,101,66,117,116,116, + 111,110,70,114,111,109,90,105,112,70,105,108,101,83,86,71,32,40,105,116,101,109,73,100,44,32,84,40,34,115,97,118,101,32,97,115,34,41,44,32, + 84,40,34,100,111,99,117,109,101,110,116,45,115,97,118,101,45,97,115,46,115,118,103,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,99,97,115,101,32,101,100,105,116,95,99,111,112,121,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117, + 114,110,32,99,114,101,97,116,101,66,117,116,116,111,110,70,114,111,109,90,105,112,70,105,108,101,83,86,71,32,40,105,116,101,109,73,100,44,32,84, + 40,34,99,111,112,121,34,41,44,32,84,40,34,101,100,105,116,45,99,111,112,121,46,115,118,103,34,41,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,99,97,115,101,32,101,100,105,116,95,99,117,116,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101, + 116,117,114,110,32,99,114,101,97,116,101,66,117,116,116,111,110,70,114,111,109,90,105,112,70,105,108,101,83,86,71,32,40,105,116,101,109,73,100,44, + 32,84,40,34,99,117,116,34,41,44,32,84,40,34,101,100,105,116,45,99,117,116,46,115,118,103,34,41,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,99,97,115,101,32,101,100,105,116,95,112,97,115,116,101,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 114,101,116,117,114,110,32,99,114,101,97,116,101,66,117,116,116,111,110,70,114,111,109,90,105,112,70,105,108,101,83,86,71,32,40,105,116,101,109,73, + 100,44,32,84,40,34,112,97,115,116,101,34,41,44,32,84,40,34,101,100,105,116,45,112,97,115,116,101,46,115,118,103,34,41,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,106,117,99,101,76,111,103,111,66,117,116,116,111,110,58,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,84,111,111,108,98,97,114,66,117,116,116,111,110,32,40,105,116,101,109, + 73,100,44,32,84,40,34,106,117,99,101,33,34,41,44,32,68,114,97,119,97,98,108,101,58,58,99,114,101,97,116,101,70,114,111,109,73,109,97,103, + 101,68,97,116,97,32,40,66,105,110,97,114,121,68,97,116,97,58,58,106,117,99,101,95,112,110,103,44,32,66,105,110,97,114,121,68,97,116,97,58, + 58,106,117,99,101,95,112,110,103,83,105,122,101,41,44,32,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32, + 99,117,115,116,111,109,67,111,109,98,111,66,111,120,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32, + 110,101,119,32,67,117,115,116,111,109,84,111,111,108,98,97,114,67,111,109,98,111,66,111,120,32,40,105,116,101,109,73,100,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114,101, + 97,107,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110, + 32,48,59,13,10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,112,114,105,118,97,116,101,58,13,10,32,32,32,32,32,32,32,32, + 83,116,114,105,110,103,65,114,114,97,121,32,105,99,111,110,78,97,109,101,115,59,13,10,32,32,32,32,32,32,32,32,79,119,110,101,100,65,114,114, + 97,121,32,60,68,114,97,119,97,98,108,101,62,32,105,99,111,110,115,70,114,111,109,90,105,112,70,105,108,101,59,13,10,13,10,32,32,32,32,32, + 32,32,32,47,47,32,84,104,105,115,32,105,115,32,97,32,108,105,116,116,108,101,32,117,116,105,108,105,116,121,32,116,111,32,99,114,101,97,116,101, + 32,97,32,98,117,116,116,111,110,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,83,86,71,32,105,109,97,103,101,115,32,105,110,13, + 10,32,32,32,32,32,32,32,32,47,47,32,111,117,114,32,101,109,98,101,100,100,101,100,32,90,73,80,32,102,105,108,101,32,34,105,99,111,110,115, + 46,122,105,112,34,13,10,32,32,32,32,32,32,32,32,84,111,111,108,98,97,114,66,117,116,116,111,110,42,32,99,114,101,97,116,101,66,117,116,116, + 111,110,70,114,111,109,90,105,112,70,105,108,101,83,86,71,32,40,99,111,110,115,116,32,105,110,116,32,105,116,101,109,73,100,44,32,99,111,110,115, + 116,32,83,116,114,105,110,103,38,32,116,101,120,116,44,32,99,111,110,115,116,32,83,116,114,105,110,103,38,32,102,105,108,101,110,97,109,101,41,13, + 10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,105,99,111,110,115,70,114,111,109,90,105,112, + 70,105,108,101,46,115,105,122,101,40,41,32,61,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,47,47,32,73,102,32,119,101,39,118,101,32,110,111,116,32,97,108,114,101,97,100,121,32,100,111,110,101,32,115, + 111,44,32,108,111,97,100,32,97,108,108,32,116,104,101,32,105,109,97,103,101,115,32,102,114,111,109,32,116,104,101,32,122,105,112,32,102,105,108,101, + 46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,77,101,109,111,114,121,73,110,112,117,116,83,116,114,101,97,109,32,105,99, + 111,110,115,70,105,108,101,83,116,114,101,97,109,32,40,66,105,110,97,114,121,68,97,116,97,58,58,105,99,111,110,115,95,122,105,112,44,32,66,105, + 110,97,114,121,68,97,116,97,58,58,105,99,111,110,115,95,122,105,112,83,105,122,101,44,32,102,97,108,115,101,41,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,90,105,112,70,105,108,101,32,105,99,111,110,115,32,40,38,105,99,111,110,115,70,105,108,101,83,116,114,101,97, + 109,44,32,102,97,108,115,101,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105, + 32,61,32,48,59,32,105,32,60,32,105,99,111,110,115,46,103,101,116,78,117,109,69,110,116,114,105,101,115,40,41,59,32,43,43,105,41,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,73,110, + 112,117,116,83,116,114,101,97,109,42,32,115,118,103,70,105,108,101,83,116,114,101,97,109,32,61,32,105,99,111,110,115,46,99,114,101,97,116,101,83, + 116,114,101,97,109,70,111,114,69,110,116,114,121,32,40,105,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,105,102,32,40,115,118,103,70,105,108,101,83,116,114,101,97,109,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,99,111,110,78,97, + 109,101,115,46,97,100,100,32,40,105,99,111,110,115,46,103,101,116,69,110,116,114,121,40,105,41,45,62,102,105,108,101,110,97,109,101,41,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,99,111,110,115,70,114,111,109,90,105,112,70,105,108,101, + 46,97,100,100,32,40,68,114,97,119,97,98,108,101,58,58,99,114,101,97,116,101,70,114,111,109,73,109,97,103,101,68,97,116,97,83,116,114,101,97, + 109,32,40,42,115,118,103,70,105,108,101,83,116,114,101,97,109,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,115,118,103,70,105,108,101,83,116,114,101,97,109,59,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,68,114,97,119,97,98,108,101,42,32,105,109,97,103,101,32,61,32, + 105,99,111,110,115,70,114,111,109,90,105,112,70,105,108,101,32,91,105,99,111,110,78,97,109,101,115,46,105,110,100,101,120,79,102,32,40,102,105,108, + 101,110,97,109,101,41,93,45,62,99,114,101,97,116,101,67,111,112,121,40,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117, + 114,110,32,110,101,119,32,84,111,111,108,98,97,114,66,117,116,116,111,110,32,40,105,116,101,109,73,100,44,32,116,101,120,116,44,32,105,109,97,103, + 101,44,32,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,13,10,32,32,32,32,32,32,32, + 32,125,13,10,13,10,32,32,32,32,32,32,32,32,47,47,32,68,101,109,111,110,115,116,114,97,116,101,115,32,104,111,119,32,116,111,32,112,117,116, + 32,97,32,99,117,115,116,111,109,32,99,111,109,112,111,110,101,110,116,32,105,110,116,111,32,97,32,116,111,111,108,98,97,114,32,45,32,116,104,105, + 115,32,111,110,101,32,99,111,110,116,97,105,110,115,13,10,32,32,32,32,32,32,32,32,47,47,32,97,32,67,111,109,98,111,66,111,120,46,13,10, + 32,32,32,32,32,32,32,32,99,108,97,115,115,32,67,117,115,116,111,109,84,111,111,108,98,97,114,67,111,109,98,111,66,111,120,32,58,32,112,117, + 98,108,105,99,32,84,111,111,108,98,97,114,73,116,101,109,67,111,109,112,111,110,101,110,116,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32, + 32,32,32,32,32,32,112,117,98,108,105,99,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,67,117,115,116,111,109,84,111,111,108,98,97,114, + 67,111,109,98,111,66,111,120,32,40,99,111,110,115,116,32,105,110,116,32,116,111,111,108,98,97,114,73,116,101,109,73,100,41,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,58,32,84,111,111,108,98,97,114,73,116,101,109,67,111,109,112,111,110,101,110,116,32,40,116,111,111,108, + 98,97,114,73,116,101,109,73,100,44,32,84,40,34,67,117,115,116,111,109,32,84,111,111,108,98,97,114,32,73,116,101,109,34,41,44,32,102,97,108, + 115,101,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100,65, + 110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,99,111,109,98,111,66,111,120,32,61,32,110,101,119,32,67,111,109,98,111,66,111,120,32,40, + 84,40,34,100,101,109,111,32,116,111,111,108,98,97,114,32,99,111,109,98,111,32,98,111,120,34,41,41,41,59,13,10,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,49,59,32,105,32,60,32,50,48,59,32,43,43,105,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,97,100,100,73,116,101,109,32,40,84, + 40,34,84,111,111,108,98,97,114,32,67,111,109,98,111,66,111,120,32,105,116,101,109,32,34,41,32,43,32,83,116,114,105,110,103,32,40,105,41,44, + 32,105,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115,101,116,83,101,108, + 101,99,116,101,100,73,100,32,40,49,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62, + 115,101,116,69,100,105,116,97,98,108,101,84,101,120,116,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,126,67,117,115,116,111,109,84,111,111,108,98,97,114,67,111,109,98,111,66,111,120,40,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,99,111, + 109,98,111,66,111,120,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,98,111, + 111,108,32,103,101,116,84,111,111,108,98,97,114,73,116,101,109,83,105,122,101,115,32,40,105,110,116,32,116,111,111,108,98,97,114,68,101,112,116,104, + 44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,98,111,111,108,32,105,115,84,111,111,108,98,97,114,86,101,114,116,105,99,97,108,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,38,32,112,114,101,102,101,114,114,101,100,83,105, + 122,101,44,32,105,110,116,38,32,109,105,110,83,105,122,101,44,32,105,110,116,38,32,109,97,120,83,105,122,101,41,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,105,115,84,111,111,108,98,97,114,86,101,114, + 116,105,99,97,108,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101, + 59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,114,101,102,101,114,114,101,100,83,105,122,101,32,61,32,50,53,48, + 59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,105,110,83,105,122,101,32,61,32,56,48,59,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,109,97,120,83,105,122,101,32,61,32,51,48,48,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,114,101,116,117,114,110,32,116,114,117,101,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,118,111,105,100,32,112,97,105,110,116,66,117,116,116,111,110,65,114,101,97,32,40,71,114,97,112,104,105,99,115,38,44,32,105,110, + 116,44,32,105,110,116,44,32,98,111,111,108,44,32,98,111,111,108,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,118,111,105,100,32,99,111,110,116,101,110,116,65,114,101, + 97,67,104,97,110,103,101,100,32,40,99,111,110,115,116,32,82,101,99,116,97,110,103,108,101,38,32,99,111,110,116,101,110,116,65,114,101,97,41,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120, + 45,62,115,101,116,83,105,122,101,32,40,99,111,110,116,101,110,116,65,114,101,97,46,103,101,116,87,105,100,116,104,40,41,32,45,32,50,44,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,106,109,105,110,32, + 40,99,111,110,116,101,110,116,65,114,101,97,46,103,101,116,72,101,105,103,104,116,40,41,32,45,32,50,44,32,50,50,41,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,109,98,111,66,111,120,45,62,115,101,116,67,101,110,116,114,101,80,111,115,105,116,105, + 111,110,32,40,99,111,110,116,101,110,116,65,114,101,97,46,103,101,116,67,101,110,116,114,101,88,40,41,44,32,99,111,110,116,101,110,116,65,114,101, + 97,46,103,101,116,67,101,110,116,114,101,89,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32, + 32,32,32,112,114,105,118,97,116,101,58,13,10,32,32,32,32,32,32,32,32,32,32,32,32,67,111,109,98,111,66,111,120,42,32,99,111,109,98,111, + 66,111,120,59,13,10,32,32,32,32,32,32,32,32,125,59,13,10,32,32,32,32,125,59,13,10,13,10,32,32,32,32,68,101,109,111,84,111,111,108, + 98,97,114,73,116,101,109,70,97,99,116,111,114,121,32,102,97,99,116,111,114,121,59,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108,97,115,115,32,68, + 101,109,111,84,97,98,98,101,100,67,111,109,112,111,110,101,110,116,32,32,58,32,112,117,98,108,105,99,32,84,97,98,98,101,100,67,111,109,112,111, + 110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108, + 105,99,32,66,117,116,116,111,110,76,105,115,116,101,110,101,114,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,68,101,109,111,84, + 97,98,98,101,100,67,111,109,112,111,110,101,110,116,32,40,65,112,112,108,105,99,97,116,105,111,110,67,111,109,109,97,110,100,77,97,110,97,103,101, + 114,42,32,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,13,10,32,32,32,32,32,32,32,32,58,32,84,97,98,98,101,100,67,111,109,112, + 111,110,101,110,116,32,40,84,97,98,98,101,100,66,117,116,116,111,110,66,97,114,58,58,84,97,98,115,65,116,84,111,112,41,13,10,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,97,100,100,84,97,98,32,40,84,40,34,115,108,105,100,101,114,115,34,41,44,32,32,32,32,32,32,32,103, + 101,116,82,97,110,100,111,109,66,114,105,103,104,116,67,111,108,111,117,114,40,41,44,32,99,114,101,97,116,101,83,108,105,100,101,114,115,80,97,103, + 101,40,41,44,32,32,32,32,32,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,84,97,98,32,40,84,40,34,116,111,111, + 108,98,97,114,115,34,41,44,32,32,32,32,32,32,103,101,116,82,97,110,100,111,109,66,114,105,103,104,116,67,111,108,111,117,114,40,41,44,32,110, + 101,119,32,84,111,111,108,98,97,114,68,101,109,111,67,111,109,112,32,40,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,44,32,32,32,32, + 116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,84,97,98,32,40,84,40,34,98,117,116,116,111,110,115,34,41,44,32,32,32, + 32,32,32,32,103,101,116,82,97,110,100,111,109,66,114,105,103,104,116,67,111,108,111,117,114,40,41,44,32,110,101,119,32,66,117,116,116,111,110,115, + 80,97,103,101,32,40,116,104,105,115,41,44,32,32,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,97,100,100,84,97,98,32,40,84, + 40,34,114,97,100,105,111,32,98,117,116,116,111,110,115,34,41,44,32,103,101,116,82,97,110,100,111,109,66,114,105,103,104,116,67,111,108,111,117,114, + 40,41,44,32,99,114,101,97,116,101,82,97,100,105,111,66,117,116,116,111,110,80,97,103,101,40,41,44,32,32,116,114,117,101,41,59,13,10,32,32, + 32,32,32,32,32,32,97,100,100,84,97,98,32,40,84,40,34,109,105,115,99,32,119,105,100,103,101,116,115,34,41,44,32,32,103,101,116,82,97,110, + 100,111,109,66,114,105,103,104,116,67,111,108,111,117,114,40,41,44,32,99,114,101,97,116,101,77,105,115,99,80,97,103,101,40,41,44,32,32,32,32, + 32,32,32,32,32,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,101,109,111,84,97,98,98,101,100,67,111,109, + 112,111,110,101,110,116,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,98,117,116,116,111, + 110,67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,66,117,98,98,108,101,77,101,115,115,97,103,101,67,111,109,112,111,110,101,110,116,42,32,98,109,99,32,61,32,110,101,119,32,66,117,98,98, + 108,101,77,101,115,115,97,103,101,67,111,109,112,111,110,101,110,116,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,105,102,32,40,68,101,115, + 107,116,111,112,58,58,99,97,110,85,115,101,83,101,109,105,84,114,97,110,115,112,97,114,101,110,116,87,105,110,100,111,119,115,40,41,41,13,10,32, + 32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,98,109,99,45,62,115,101,116,65,108,119,97,121,115,79,110,84,111, + 112,32,40,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,98,109,99,45,62,97,100,100,84,111,68,101,115,107,116,111,112, + 32,40,48,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,32,32, + 123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,97,100,100,67,104,105,108,100,67,111,109,112,111,110,101,110,116,32,40,98,109,99,41,59,13, + 10,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,98,109,99,45,62,115,104,111,119,65,116,32,40,98,117,116,116,111, + 110,44,32,84,40,34,84,104,105,115,32,105,115,32,97,32,100,101,109,111,32,111,102,32,116,104,101,32,66,117,98,98,108,101,77,101,115,115,97,103, + 101,67,111,109,112,111,110,101,110,116,44,32,119,104,105,99,104,32,108,101,116,115,32,121,111,117,32,112,111,112,32,117,112,32,97,32,109,101,115,115, + 97,103,101,32,112,111,105,110,116,105,110,103,32,97,116,32,97,32,99,111,109,112,111,110,101,110,116,32,111,114,32,115,111,109,101,119,104,101,114,101, + 32,111,110,32,116,104,101,32,115,99,114,101,101,110,46,92,110,92,110,84,104,101,32,109,101,115,115,97,103,101,32,98,117,98,98,108,101,115,32,119, + 105,108,108,32,100,105,115,97,112,112,101,97,114,32,97,102,116,101,114,32,97,32,116,105,109,101,111,117,116,32,112,101,114,105,111,100,44,32,111,114, + 32,119,104,101,110,32,116,104,101,32,109,111,117,115,101,32,105,115,32,99,108,105,99,107,101,100,46,34,41,44,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,50,48,48,48,44,32,116,114,117,101,44,32,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10, + 13,10,32,32,32,32,115,116,97,116,105,99,32,99,111,110,115,116,32,67,111,108,111,117,114,32,103,101,116,82,97,110,100,111,109,66,114,105,103,104, + 116,67,111,108,111,117,114,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,67,111,108,111,117,114,32, + 40,82,97,110,100,111,109,58,58,103,101,116,83,121,115,116,101,109,82,97,110,100,111,109,40,41,46,110,101,120,116,70,108,111,97,116,40,41,44,32, + 48,46,49,102,44,32,48,46,57,55,102,44,32,49,46,48,102,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,13,10,47,47,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,108, + 97,115,115,32,68,101,109,111,66,97,99,107,103,114,111,117,110,100,84,104,114,101,97,100,32,32,58,32,112,117,98,108,105,99,32,84,104,114,101,97, + 100,87,105,116,104,80,114,111,103,114,101,115,115,87,105,110,100,111,119,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32,32,32,32,68,101,109, + 111,66,97,99,107,103,114,111,117,110,100,84,104,114,101,97,100,40,41,13,10,32,32,32,32,32,32,32,32,58,32,84,104,114,101,97,100,87,105,116, + 104,80,114,111,103,114,101,115,115,87,105,110,100,111,119,32,40,84,40,34,98,117,115,121,32,100,111,105,110,103,32,115,111,109,101,32,105,109,112,111, + 114,116,97,110,116,32,116,104,105,110,103,115,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32, + 32,115,101,116,83,116,97,116,117,115,77,101,115,115,97,103,101,32,40,84,40,34,71,101,116,116,105,110,103,32,114,101,97,100,121,46,46,46,34,41, + 41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,68,101,109,111,66,97,99,107,103,114,111,117,110,100,84,104,114,101,97,100,40,41, + 13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,117,110,40,41,13,10,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,32,116,104,105,110,103,115,84,111,68,111,32,61,32,49,48,59,13,10,13,10,32, + 32,32,32,32,32,32,32,102,111,114,32,40,105,110,116,32,105,32,61,32,48,59,32,105,32,60,32,116,104,105,110,103,115,84,111,68,111,59,32,43, + 43,105,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,109,117,115,116,32,99,104,101,99, + 107,32,116,104,105,115,32,97,115,32,111,102,116,101,110,32,97,115,32,112,111,115,115,105,98,108,101,44,32,98,101,99,97,117,115,101,32,116,104,105, + 115,32,105,115,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,104,111,119,32,119,101,32,107,110,111,119,32,105,102,32,116,104,101,32, + 117,115,101,114,39,115,32,112,114,101,115,115,101,100,32,39,99,97,110,99,101,108,39,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32, + 40,116,104,114,101,97,100,83,104,111,117,108,100,69,120,105,116,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114, + 101,97,107,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115,32,119,105,108,108,32,117,112,100,97,116,101,32, + 116,104,101,32,112,114,111,103,114,101,115,115,32,98,97,114,32,111,110,32,116,104,101,32,100,105,97,108,111,103,32,98,111,120,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,115,101,116,80,114,111,103,114,101,115,115,32,40,105,32,47,32,40,100,111,117,98,108,101,41,32,116,104,105,110,103,115, + 84,111,68,111,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,119,97,105,116,32,40,53,48,48,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,115,101,116,83,116,97,116,117,115,77,101,115,115,97,103,101,32,40,83,116,114,105,110,103,32,40,116,104,105,110,103, + 115,84,111,68,111,32,45,32,105,41,32,43,32,84,40,34,32,116,104,105,110,103,115,32,108,101,102,116,32,116,111,32,100,111,46,46,46,34,41,41, + 59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,47,42,42,32,65,32,68,105,97,108,111, + 103,87,105,110,100,111,119,32,99,111,110,116,97,105,110,105,110,103,32,97,32,67,111,108,111,117,114,83,101,108,101,99,116,111,114,32,99,111,109,112, + 111,110,101,110,116,32,42,47,13,10,99,108,97,115,115,32,67,111,108,111,117,114,83,101,108,101,99,116,111,114,68,105,97,108,111,103,87,105,110,100, + 111,119,32,32,58,32,112,117,98,108,105,99,32,68,105,97,108,111,103,87,105,110,100,111,119,13,10,123,13,10,112,117,98,108,105,99,58,13,10,32, + 32,32,32,67,111,108,111,117,114,83,101,108,101,99,116,111,114,68,105,97,108,111,103,87,105,110,100,111,119,40,41,13,10,32,32,32,32,32,32,32, + 32,58,32,68,105,97,108,111,103,87,105,110,100,111,119,32,40,84,40,34,67,111,108,111,117,114,32,115,101,108,101,99,116,111,114,32,100,101,109,111, + 34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,111,108,111,117,114,115,58,58,108,105, + 103,104,116,103,114,101,121,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,117,101,41,13, + 10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,115,101,116,67,111,110,116,101,110,116,67,111,109,112,111,110,101,110,116,32,40,110,101,119, + 32,67,111,108,111,117,114,83,101,108,101,99,116,111,114,40,41,41,59,13,10,32,32,32,32,32,32,32,32,99,101,110,116,114,101,87,105,116,104,83, + 105,122,101,32,40,52,48,48,44,32,52,48,48,41,59,13,10,32,32,32,32,32,32,32,32,115,101,116,82,101,115,105,122,97,98,108,101,32,40,116, + 114,117,101,44,32,116,114,117,101,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,67,111,108,111,117,114,83,101,108,101,99,116,111, + 114,68,105,97,108,111,103,87,105,110,100,111,119,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,118,111,105, + 100,32,99,108,111,115,101,66,117,116,116,111,110,80,114,101,115,115,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,47, + 47,32,119,101,32,101,120,112,101,99,116,32,116,104,105,115,32,99,111,109,112,111,110,101,110,116,32,116,111,32,98,101,32,114,117,110,32,119,105,116, + 104,105,110,32,97,32,109,111,100,97,108,32,108,111,111,112,44,32,115,111,32,119,104,101,110,32,116,104,101,32,99,108,111,115,101,13,10,32,32,32, + 32,32,32,32,32,47,47,32,98,117,116,116,111,110,32,105,115,32,99,108,105,99,107,101,100,44,32,119,101,32,99,97,110,32,109,97,107,101,32,105, + 116,32,105,110,118,105,115,105,98,108,101,32,116,111,32,99,97,117,115,101,32,116,104,101,32,108,111,111,112,32,116,111,32,101,120,105,116,32,97,110, + 100,32,116,104,101,13,10,32,32,32,32,32,32,32,32,47,47,32,99,97,108,108,105,110,103,32,99,111,100,101,32,119,105,108,108,32,100,101,108,101, + 116,101,32,116,104,105,115,32,111,98,106,101,99,116,46,13,10,32,32,32,32,32,32,32,32,115,101,116,86,105,115,105,98,108,101,32,40,102,97,108, + 115,101,41,59,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,99,111,110,115,116,32,105,110,116,32,110,117,109,71,114,111,117,112,115, + 32,61,32,52,59,13,10,13,10,99,108,97,115,115,32,87,105,100,103,101,116,115,68,101,109,111,32,32,58,32,112,117,98,108,105,99,32,67,111,109, + 112,111,110,101,110,116,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,117,98,108,105,99,32,66,117,116, + 116,111,110,76,105,115,116,101,110,101,114,13,10,123,13,10,32,32,32,32,84,101,120,116,66,117,116,116,111,110,42,32,109,101,110,117,66,117,116,116, + 111,110,59,13,10,32,32,32,32,84,111,103,103,108,101,66,117,116,116,111,110,42,32,101,110,97,98,108,101,66,117,116,116,111,110,59,13,10,13,10, + 32,32,32,32,68,101,109,111,84,97,98,98,101,100,67,111,109,112,111,110,101,110,116,42,32,116,97,98,115,59,13,10,13,10,112,117,98,108,105,99, + 58,13,10,32,32,32,32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,13,10,32,32,32,32,87,105,100,103,101,116,115,68,101,109,111,32,40,65,112,112,108,105,99,97,116,105,111,110,67,111,109, + 109,97,110,100,77,97,110,97,103,101,114,42,32,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,13,10,32,32,32,32,123,13,10,32,32,32, + 32,32,32,32,32,115,101,116,78,97,109,101,32,40,84,40,34,87,105,100,103,101,116,115,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32, + 97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,116,97,98,115,32,61,32,110,101,119,32,68,101,109,111,84,97,98,98,101,100, + 67,111,109,112,111,110,101,110,116,32,40,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32, + 47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 13,10,32,32,32,32,32,32,32,32,109,101,110,117,66,117,116,116,111,110,32,61,32,110,101,119,32,84,101,120,116,66,117,116,116,111,110,32,40,84, + 40,34,99,108,105,99,107,32,102,111,114,32,97,32,112,111,112,117,112,32,109,101,110,117,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,99,108,105,99,107,32,102,111,114, + 32,97,32,100,101,109,111,32,111,102,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,105,116,101,109,32,121, + 111,117,32,99,97,110,32,112,117,116,32,105,110,116,111,32,97,32,112,111,112,117,112,32,109,101,110,117,46,46,46,34,41,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,109,101,110,117,66,117,116,116,111,110,41,59,13,10, + 32,32,32,32,32,32,32,32,109,101,110,117,66,117,116,116,111,110,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,49,48,44,32,50, + 48,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,109,101,110,117,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76, + 105,115,116,101,110,101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,32,32,32,32,109,101,110,117,66,117,116,116,111,110,45,62,115,101,116, + 84,114,105,103,103,101,114,101,100,79,110,77,111,117,115,101,68,111,119,110,32,40,116,114,117,101,41,59,32,47,47,32,98,101,99,97,117,115,101,32, + 116,104,105,115,32,98,117,116,116,111,110,32,112,111,112,115,32,117,112,32,97,32,109,101,110,117,44,32,116,104,105,115,32,108,101,116,115,32,117,115, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,104,111,108,100,32,100,111,119,110,32,116,104,101,32,98,117,116,116,111,110,32,97,110, + 100,32,100,114,97,103,32,115,116,114,97,105,103,104,116,32,111,110,116,111,32,116,104,101,32,109,101,110,117,13,10,13,10,32,32,32,32,32,32,32, + 32,47,47,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,13,10,32,32,32,32,32,32,32,32,101,110,97,98,108,101,66,117,116,116,111,110,32,61,32,110,101,119,32,84,111,103,103,108,101,66,117,116,116, + 111,110,32,40,84,40,34,101,110,97,98,108,101,47,100,105,115,97,98,108,101,32,99,111,109,112,111,110,101,110,116,115,34,41,41,59,13,10,32,32, + 32,32,32,32,32,32,97,100,100,65,110,100,77,97,107,101,86,105,115,105,98,108,101,32,40,101,110,97,98,108,101,66,117,116,116,111,110,41,59,13, + 10,32,32,32,32,32,32,32,32,101,110,97,98,108,101,66,117,116,116,111,110,45,62,115,101,116,66,111,117,110,100,115,32,40,50,51,48,44,32,49, + 48,44,32,49,56,48,44,32,50,52,41,59,13,10,32,32,32,32,32,32,32,32,101,110,97,98,108,101,66,117,116,116,111,110,45,62,115,101,116,84, + 111,111,108,116,105,112,32,40,84,40,34,116,111,103,103,108,101,32,98,117,116,116,111,110,34,41,41,59,13,10,32,32,32,32,32,32,32,32,101,110, + 97,98,108,101,66,117,116,116,111,110,45,62,115,101,116,84,111,103,103,108,101,83,116,97,116,101,32,40,116,114,117,101,44,32,102,97,108,115,101,41, + 59,13,10,32,32,32,32,32,32,32,32,101,110,97,98,108,101,66,117,116,116,111,110,45,62,97,100,100,66,117,116,116,111,110,76,105,115,116,101,110, + 101,114,32,40,116,104,105,115,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,126,87,105,100,103,101,116,115,68,101,109,111,40,41,13, + 10,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,65,108,108,67,104,105,108,100,114,101,110,40,41,59,13,10,32,32, + 32,32,125,13,10,13,10,32,32,32,32,118,111,105,100,32,114,101,115,105,122,101,100,40,41,13,10,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,116,97,98,115,45,62,115,101,116,66,111,117,110,100,115,32,40,49,48,44,32,52,48,44,32,103,101,116,87,105,100,116,104,40,41,32,45,32, + 50,48,44,32,103,101,116,72,101,105,103,104,116,40,41,32,45,32,53,48,41,59,13,10,32,32,32,32,125,13,10,13,10,32,32,32,32,47,47,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,32, + 32,32,32,118,111,105,100,32,98,117,116,116,111,110,67,108,105,99,107,101,100,32,40,66,117,116,116,111,110,42,32,98,117,116,116,111,110,41,13,10, + 32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,105,102,32,40,98,117,116,116,111,110,32,61,61,32,101,110,97,98,108,101,66,117,116,116,111, + 110,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,98,111,111,108,32,101,110, + 97,98,108,101,100,32,61,32,101,110,97,98,108,101,66,117,116,116,111,110,45,62,103,101,116,84,111,103,103,108,101,83,116,97,116,101,40,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,101,110,117,66,117,116,116,111,110,45,62,115,101,116,69,110,97,98,108,101,100,32,40,101, + 110,97,98,108,101,100,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,97,98,115,45,62,115,101,116,69,110,97,98,108,101,100,32,40, + 101,110,97,98,108,101,100,41,59,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,98, + 117,116,116,111,110,32,61,61,32,109,101,110,117,66,117,116,116,111,110,41,13,10,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,109,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,73,116,101,109, + 32,40,49,44,32,84,40,34,110,111,114,109,97,108,32,105,116,101,109,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97, + 100,100,73,116,101,109,32,40,50,44,32,84,40,34,100,105,115,97,98,108,101,100,32,105,116,101,109,34,41,44,32,102,97,108,115,101,41,59,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,73,116,101,109,32,40,51,44,32,84,40,34,116,105,99,107,101,100,32,105,116,101,109, + 34,41,44,32,116,114,117,101,44,32,116,114,117,101,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,67,111,108,111,117, + 114,101,100,73,116,101,109,32,40,52,44,32,84,40,34,99,111,108,111,117,114,101,100,32,105,116,101,109,34,41,44,32,67,111,108,111,117,114,115,58, + 58,103,114,101,101,110,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,67,117,115,116,111,109,73,116,101,109,32,40,53,44,32,110,101,119,32,67,117,115, + 116,111,109,77,101,110,117,67,111,109,112,111,110,101,110,116,40,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100, + 100,83,101,112,97,114,97,116,111,114,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,116, + 97,98,115,77,101,110,117,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,97,98,115,77,101,110,117,46,97,100,100,73,116,101,109,32,40, + 49,48,48,49,44,32,84,40,34,115,104,111,119,32,116,97,98,115,32,97,116,32,116,104,101,32,116,111,112,34,41,44,32,116,114,117,101,44,32,116, + 97,98,115,45,62,103,101,116,79,114,105,101,110,116,97,116,105,111,110,40,41,32,61,61,32,84,97,98,98,101,100,66,117,116,116,111,110,66,97,114, + 58,58,84,97,98,115,65,116,84,111,112,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,97,98,115,77,101,110,117,46,97,100,100,73, + 116,101,109,32,40,49,48,48,50,44,32,84,40,34,115,104,111,119,32,116,97,98,115,32,97,116,32,116,104,101,32,98,111,116,116,111,109,34,41,44, + 32,116,114,117,101,44,32,116,97,98,115,45,62,103,101,116,79,114,105,101,110,116,97,116,105,111,110,40,41,32,61,61,32,84,97,98,98,101,100,66, + 117,116,116,111,110,66,97,114,58,58,84,97,98,115,65,116,66,111,116,116,111,109,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,116,97, + 98,115,77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,48,48,51,44,32,84,40,34,115,104,111,119,32,116,97,98,115,32,97,116,32,116,104, + 101,32,108,101,102,116,34,41,44,32,116,114,117,101,44,32,116,97,98,115,45,62,103,101,116,79,114,105,101,110,116,97,116,105,111,110,40,41,32,61, + 61,32,84,97,98,98,101,100,66,117,116,116,111,110,66,97,114,58,58,84,97,98,115,65,116,76,101,102,116,41,59,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,116,97,98,115,77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,48,48,52,44,32,84,40,34,115,104,111,119,32,116,97,98, + 115,32,97,116,32,116,104,101,32,114,105,103,104,116,34,41,44,32,116,114,117,101,44,32,116,97,98,115,45,62,103,101,116,79,114,105,101,110,116,97, + 116,105,111,110,40,41,32,61,61,32,84,97,98,98,101,100,66,117,116,116,111,110,66,97,114,58,58,84,97,98,115,65,116,82,105,103,104,116,41,59, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,83,117,98,77,101,110,117,32,40,84,40,34,116,97,98,32,112,111,115,105,116, + 105,111,110,34,41,44,32,116,97,98,115,77,101,110,117,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100,100,83,101, + 112,97,114,97,116,111,114,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,100,105,97,108, + 111,103,77,101,110,117,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100,73,116,101,109,32, + 40,49,48,48,44,32,84,40,34,115,104,111,119,32,97,32,112,108,97,105,110,32,97,108,101,114,116,45,119,105,110,100,111,119,46,46,46,34,41,41, + 59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,48,49,44,32, + 84,40,34,115,104,111,119,32,97,110,32,97,108,101,114,116,45,119,105,110,100,111,119,32,119,105,116,104,32,97,32,39,119,97,114,110,105,110,103,39, + 32,105,99,111,110,46,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100, + 73,116,101,109,32,40,49,48,50,44,32,84,40,34,115,104,111,119,32,97,110,32,97,108,101,114,116,45,119,105,110,100,111,119,32,119,105,116,104,32, + 97,110,32,39,105,110,102,111,39,32,105,99,111,110,46,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111, + 103,77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,48,51,44,32,84,40,34,115,104,111,119,32,97,110,32,97,108,101,114,116,45,119,105,110, + 100,111,119,32,119,105,116,104,32,97,32,39,113,117,101,115,116,105,111,110,39,32,105,99,111,110,46,46,46,34,41,41,59,13,10,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59,13,10,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,49,48,44,32,84,40,34,115, + 104,111,119,32,97,110,32,111,107,47,99,97,110,99,101,108,32,97,108,101,114,116,45,119,105,110,100,111,119,46,46,46,34,41,41,59,13,10,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,49,49,44,32,84, + 40,34,115,104,111,119,32,97,110,32,97,108,101,114,116,45,119,105,110,100,111,119,32,119,105,116,104,32,115,111,109,101,32,101,120,116,114,97,32,99, + 111,109,112,111,110,101,110,116,115,46,46,46,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101, + 110,117,46,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103, + 77,101,110,117,46,97,100,100,73,116,101,109,32,40,49,49,50,44,32,84,40,34,115,104,111,119,32,97,32,84,104,114,101,97,100,87,105,116,104,80, + 114,111,103,114,101,115,115,87,105,110,100,111,119,32,100,101,109,111,46,46,46,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,109,46,97,100,100,83,117,98,77,101,110,117,32,40,84,40,34,65,108,101,114,116,87,105,110,100,111,119,32,100,101,109,111,110,115,116,114,97,116, + 105,111,110,115,34,41,44,32,100,105,97,108,111,103,77,101,110,117,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108, + 111,103,77,101,110,117,46,97,100,100,83,101,112,97,114,97,116,111,114,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46, + 97,100,100,73,116,101,109,32,40,49,50,48,44,32,84,40,34,115,104,111,119,32,97,32,99,111,108,111,117,114,32,115,101,108,101,99,116,111,114,32, + 100,101,109,111,46,46,46,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,100,105,97,108,111,103,77,101,110,117,46,97,100, + 100,83,101,112,97,114,97,116,111,114,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,110, + 97,116,105,118,101,70,105,108,101,67,104,111,111,115,101,114,115,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,116,105,118,101,70,105, + 108,101,67,104,111,111,115,101,114,115,46,97,100,100,73,116,101,109,32,40,49,50,49,44,32,84,40,34,39,108,111,97,100,39,32,102,105,108,101,32, + 98,114,111,119,115,101,114,46,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,116,105,118,101,70,105,108,101,67,104, + 111,111,115,101,114,115,46,97,100,100,73,116,101,109,32,40,49,50,52,44,32,84,40,34,39,108,111,97,100,39,32,102,105,108,101,32,98,114,111,119, + 115,101,114,32,119,105,116,104,32,97,110,32,105,109,97,103,101,32,102,105,108,101,32,112,114,101,118,105,101,119,46,46,46,34,41,41,59,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,110,97,116,105,118,101,70,105,108,101,67,104,111,111,115,101,114,115,46,97,100,100,73,116,101,109,32,40,49, + 50,50,44,32,84,40,34,39,115,97,118,101,39,32,102,105,108,101,32,98,114,111,119,115,101,114,46,46,46,34,41,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,110,97,116,105,118,101,70,105,108,101,67,104,111,111,115,101,114,115,46,97,100,100,73,116,101,109,32,40,49,50,51,44,32, + 84,40,34,99,104,111,111,115,101,32,100,105,114,101,99,116,111,114,121,32,102,105,108,101,32,98,114,111,119,115,101,114,46,46,46,34,41,41,59,13, + 10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117,32,106,117,99,101,70,105,108,101,67,104,111,111,115,101,114, + 115,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,70,105,108,101,67,104,111,111,115,101,114,115,46,97,100,100,73,116,101,109, + 32,40,49,51,49,44,32,84,40,34,39,108,111,97,100,39,32,102,105,108,101,32,98,114,111,119,115,101,114,46,46,46,34,41,41,59,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,106,117,99,101,70,105,108,101,67,104,111,111,115,101,114,115,46,97,100,100,73,116,101,109,32,40,49,51,52,44, + 32,84,40,34,39,108,111,97,100,39,32,102,105,108,101,32,98,114,111,119,115,101,114,32,119,105,116,104,32,97,110,32,105,109,97,103,101,32,102,105, + 108,101,32,112,114,101,118,105,101,119,46,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,70,105,108,101,67, + 104,111,111,115,101,114,115,46,97,100,100,73,116,101,109,32,40,49,51,50,44,32,84,40,34,39,115,97,118,101,39,32,102,105,108,101,32,98,114,111, + 119,115,101,114,46,46,46,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,106,117,99,101,70,105,108,101,67,104,111,111,115,101,114, + 115,46,97,100,100,73,116,101,109,32,40,49,51,51,44,32,84,40,34,99,104,111,111,115,101,32,100,105,114,101,99,116,111,114,121,32,102,105,108,101, + 32,98,114,111,119,115,101,114,46,46,46,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,80,111,112,117,112,77,101,110,117, + 32,102,105,108,101,67,104,111,111,115,101,114,115,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,105,108,101,67,104,111,111,115,101,114,115, + 46,97,100,100,83,117,98,77,101,110,117,32,40,84,40,34,79,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,100,105,97,108,111,103,115, + 34,41,44,32,110,97,116,105,118,101,70,105,108,101,67,104,111,111,115,101,114,115,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,105, + 108,101,67,104,111,111,115,101,114,115,46,97,100,100,83,117,98,77,101,110,117,32,40,84,40,34,74,117,99,101,32,100,105,97,108,111,103,115,34,41, + 44,32,106,117,99,101,70,105,108,101,67,104,111,111,115,101,114,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,109,46,97,100, + 100,83,117,98,77,101,110,117,32,40,84,40,34,102,105,108,101,32,99,104,111,111,115,101,114,32,100,105,97,108,111,103,115,34,41,44,32,102,105,108, + 101,67,104,111,111,115,101,114,115,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,110,116,32,114,101,115,117,108,116,32,61,32, + 109,46,115,104,111,119,65,116,32,40,109,101,110,117,66,117,116,116,111,110,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102, + 32,40,114,101,115,117,108,116,32,33,61,32,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,47,47,32,117,115,101,114,32,99,104,111,115,101,32,115,111,109,101,116,104,105,110,103,32,102,114,111,109,32,116,104,101,32, + 109,101,110,117,46,46,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,114,101,115,117,108,116,32,62,61,32, + 49,48,48,32,38,38,32,114,101,115,117,108,116,32,60,32,49,48,53,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,65,108,101,114,116,73, + 99,111,110,84,121,112,101,32,105,99,111,110,32,61,32,65,108,101,114,116,87,105,110,100,111,119,58,58,78,111,73,99,111,110,59,13,10,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,48,49,41,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,99,111,110,32,61,32,65,108,101,114,116,87,105,110,100,111, + 119,58,58,87,97,114,110,105,110,103,73,99,111,110,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115, + 101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,48,50,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,105,99,111,110,32,61,32,65,108,101,114,116,87,105,110,100,111,119,58,58,73,110,102,111,73,99,111,110,59,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,48,51,41, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,99,111,110,32,61,32,65,108,101,114,116,87,105, + 110,100,111,119,58,58,81,117,101,115,116,105,111,110,73,99,111,110,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111,119,77,101,115,115,97,103,101,66,111,120,32,40,105,99,111,110,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,84,40,34,84,104,105,115,32,105,115,32,97,110,32,65,108,101,114,116,87,105,110,100,111,119,34,41,44,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,84,40,34,65,110,100,32,116,104,105,115,32,105,115,32,116,104,101,32,65,108,101,114,116,87,105,110,100,111,119,39,115,32, + 109,101,115,115,97,103,101,46,32,66,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98, + 108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,46,34,41,44,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,84,40,34,111,107,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,49,48,41,13,10,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,111, + 111,108,32,117,115,101,114,80,105,99,107,101,100,79,107,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,61,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111,119,79,107,67,97,110,99,101,108,66,111,120,32,40,65,108,101,114,116,87,105, + 110,100,111,119,58,58,81,117,101,115,116,105,111,110,73,99,111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34, + 84,104,105,115,32,105,115,32,97,110,32,111,107,47,99,97,110,99,101,108,32,65,108,101,114,116,87,105,110,100,111,119,34,41,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,65,110,100,32,116,104,105,115,32,105,115,32,116,104,101,32,65,108,101,114,116,87,105,110, + 100,111,119,39,115,32,109,101,115,115,97,103,101,46,32,66,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32, + 98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,32,98,108,97,104,46, + 34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,49,49,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,32,119,32,40, + 84,40,34,65,108,101,114,116,87,105,110,100,111,119,32,100,101,109,111,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,84,104,105,115,32,65,108,101,114,116,87,105,110,100,111,119, + 32,104,97,115,32,97,32,99,111,117,112,108,101,32,111,102,32,101,120,116,114,97,32,99,111,109,112,111,110,101,110,116,115,32,97,100,100,101,100,32, + 116,111,32,115,104,111,119,32,104,111,119,32,116,111,32,97,100,100,32,100,114,111,112,45,100,111,119,110,32,108,105,115,116,115,32,97,110,100,32,116, + 101,120,116,32,101,110,116,114,121,32,98,111,120,101,115,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,81,117,101,115,116,105,111,110,73,99,111, + 110,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,119,46,97,100,100,84,101,120,116,69,100,105,116, + 111,114,32,40,84,40,34,116,101,120,116,34,41,44,32,84,40,34,101,110,116,101,114,32,115,111,109,101,32,116,101,120,116,32,104,101,114,101,34,41, + 44,32,84,40,34,116,101,120,116,32,102,105,101,108,100,58,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,83,116,114,105,110,103,65,114,114,97,121,32,111,112,116,105,111,110,115,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,111,112,116,105,111,110,115,46,97,100,100,32,40,84,40,34,111,112,116,105,111,110,32,49,34,41,41,59,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,112,116,105,111,110,115,46,97,100,100,32,40,84,40,34,111,112,116,105,111,110,32,50, + 34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,112,116,105,111,110,115,46,97,100,100,32,40,84, + 40,34,111,112,116,105,111,110,32,51,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,112,116,105, + 111,110,115,46,97,100,100,32,40,84,40,34,111,112,116,105,111,110,32,52,34,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,119,46,97,100,100,67,111,109,98,111,66,111,120,32,40,84,40,34,111,112,116,105,111,110,34,41,44,32,111,112,116,105,111,110, + 115,44,32,84,40,34,115,111,109,101,32,111,112,116,105,111,110,115,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,119,46,97,100,100,66,117,116,116,111,110,32,40,84,40,34,111,107,34,41,44,32,49,44,32,75,101,121,80,114,101,115,115,32, + 40,75,101,121,80,114,101,115,115,58,58,114,101,116,117,114,110,75,101,121,44,32,48,44,32,48,41,41,59,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,119,46,97,100,100,66,117,116,116,111,110,32,40,84,40,34,99,97,110,99,101,108,34,41,44,32,48,44,32, + 75,101,121,80,114,101,115,115,32,40,75,101,121,80,114,101,115,115,58,58,101,115,99,97,112,101,75,101,121,44,32,48,44,32,48,41,41,59,13,10, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,119,46,114,117,110,77,111,100,97,108,76,111,111,112, + 40,41,32,33,61,32,48,41,32,47,47,32,105,115,32,116,104,101,121,32,112,105,99,107,101,100,32,39,111,107,39,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 47,47,32,116,104,105,115,32,105,115,32,116,104,101,32,105,116,101,109,32,116,104,101,121,32,99,104,111,115,101,32,105,110,32,116,104,101,32,100,114, + 111,112,45,100,111,119,110,32,108,105,115,116,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 99,111,110,115,116,32,105,110,116,32,111,112,116,105,111,110,73,110,100,101,120,67,104,111,115,101,110,32,61,32,119,46,103,101,116,67,111,109,98,111, + 66,111,120,67,111,109,112,111,110,101,110,116,32,40,84,40,34,111,112,116,105,111,110,34,41,41,45,62,103,101,116,83,101,108,101,99,116,101,100,73, + 116,101,109,73,110,100,101,120,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47, + 47,32,116,104,105,115,32,105,115,32,116,104,101,32,116,101,120,116,32,116,104,101,121,32,101,110,116,101,114,101,100,46,46,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,116,114,105,110,103,32,116,101,120,116,32,61,32,119,46,103,101,116,84,101, + 120,116,69,100,105,116,111,114,67,111,110,116,101,110,116,115,32,40,84,40,34,116,101,120,116,34,41,41,59,13,10,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,49,50,41,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,68,101,109,111,66, + 97,99,107,103,114,111,117,110,100,84,104,114,101,97,100,32,100,101,109,111,84,104,114,101,97,100,59,13,10,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,100,101,109,111,84,104,114,101,97,100,46,114,117,110,84,104,114,101,97,100,40,41,41,13,10, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,47,47,32,116,104,114,101,97,100,32,102,105,110,105,115,104,101,100,32,110,111,114,109,97,108,108,121,46,46,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111,119,77, + 101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,87,97,114,110,105,110,103,73,99,111,110,44,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,84,40,34,80,114,111,103,114,101,115,115,32,119,105,110,100,111,119,34,41,44,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,84,40,34,84,104,114,101,97,100,32,102,105,110,105,115,104,101,100,32,111,107,33,34,41,41,59,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108, + 115,101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,47,47,32,117,115,101,114,32,112,114,101,115,115,101,100,32,116,104,101,32,99,97,110,99,101,108,32,98,117, + 116,116,111,110,46,46,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110, + 100,111,119,58,58,115,104,111,119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,87,97,114,110,105,110, + 103,73,99,111,110,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,80,114,111,103,114,101,115,115,32,119,105,110,100,111,119,34, + 41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,89,111,117,32,112,114,101,115,115,101,100,32,99,97,110,99,101,108,33,34, + 41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116, + 32,61,61,32,49,50,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,67,111,108,111,117,114,83,101,108,101,99,116,111,114,68,105,97,108,111,103,87,105,110,100,111,119,32,99,111,108,111, + 117,114,68,105,97,108,111,103,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,47,32,116,104,105,115, + 32,119,105,108,108,32,114,117,110,32,97,110,32,101,118,101,110,116,32,108,111,111,112,32,117,110,116,105,108,32,116,104,101,32,100,105,97,108,111,103, + 39,115,32,99,108,111,115,101,66,117,116,116,111,110,80,114,101,115,115,101,100,40,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,47,47,32,109,101,116,104,111,100,32,99,97,117,115,101,115,32,116,104,101,32,108,111,111,112,32,116,111,32,101,120,105,116,46,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,108,111,117,114,68,105,97,108,111,103,46,114,117,110,77,111,100, + 97,108,76,111,111,112,40,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,62,61,32,49,50,49,32,38,38,32,114,101,115,117,108,116,32,60, + 32,49,51,57,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,99,111,110,115,116,32,98,111,111,108,32,117,115,101,78,97,116,105,118,101,86,101,114,115,105,111,110,32,61,32,114,101,115,117, + 108,116,32,60,32,49,51,48,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,114,101,115,117,108, + 116,32,62,32,49,51,48,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,117,108,116, + 32,45,61,32,49,48,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,114,101,115,117,108, + 116,32,61,61,32,49,50,49,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,67,104,111,111,115,101,114,32,102,99,32,40,84,40,34,67,104,111, + 111,115,101,32,97,32,102,105,108,101,32,116,111,32,111,112,101,110,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,58,58,103,101,116,67,117,114,114,101, + 110,116,87,111,114,107,105,110,103,68,105,114,101,99,116,111,114,121,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,42,34,41,44,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,115,101,78,97,116,105,118, + 101,86,101,114,115,105,111,110,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102, + 32,40,102,99,46,98,114,111,119,115,101,70,111,114,70,105,108,101,84,111,79,112,101,110,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,70,105,108,101,32,99,104,111,115,101,110,70,105,108,101,32,61,32,102,99,46,103,101,116,82,101,115,117,108,116,40,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119, + 58,58,115,104,111,119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,73,110,102,111,73,99,111,110,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,70,105,108,101,32,67,104,111,111,115,101,114,46,46,46,34,41,44, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,89,111,117,32,112,105,99,107,101,100,58,32,34,41,32,43,32,99, + 104,111,115,101,110,70,105,108,101,46,103,101,116,70,117,108,108,80,97,116,104,78,97,109,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32, + 49,50,52,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,73,109,97,103,101,80,114,101,118,105,101,119,67,111,109,112,111,110,101,110,116,32,105,109,97,103,101, + 80,114,101,118,105,101,119,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,109,97,103,101,80, + 114,101,118,105,101,119,46,115,101,116,83,105,122,101,32,40,50,48,48,44,32,50,48,48,41,59,13,10,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,67,104,111,111,115,101,114,32,102,99,32,40,84,40,34,67,104,111,111,115,101,32, + 97,110,32,105,109,97,103,101,32,116,111,32,111,112,101,110,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,58,58,103,101,116,67,117,114,114,101,110,116, + 87,111,114,107,105,110,103,68,105,114,101,99,116,111,114,121,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,42,46,106,112,103,59,42,46,106,112,101,103,59,42,46,112, + 110,103,59,42,46,103,105,102,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,117,115,101,78,97,116,105,118,101,86,101,114,115,105,111,110,41,59,13,10,13,10,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,102,99,46,98,114,111,119,115,101,70,111,114,70,105,108,101,84, + 111,79,112,101,110,32,40,38,105,109,97,103,101,80,114,101,118,105,101,119,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70, + 105,108,101,32,99,104,111,115,101,110,70,105,108,101,32,61,32,102,99,46,103,101,116,82,101,115,117,108,116,40,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111, + 119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,73,110,102,111,73,99,111,110,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,70,105,108,101,32,67,104,111,111,115,101,114,46,46,46,34,41,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,89,111,117,32,112,105,99,107,101,100,58,32,34,41,32,43,32,99,104,111,115,101,110, + 70,105,108,101,46,103,101,116,70,117,108,108,80,97,116,104,78,97,109,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,50,50,41,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,70,105,108,101,67,104,111,111,115,101,114,32,102,99,32,40,84,40,34,67,104,111,111,115,101,32,97,32,102,105,108,101, + 32,116,111,32,115,97,118,101,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,58,58,103,101,116,67,117,114,114,101,110,116,87,111,114,107,105,110,103,68, + 105,114,101,99,116,111,114,121,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,42,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,115,101,78,97,116,105,118,101,86,101,114,115,105,111,110,41,59, + 13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,102,99,46,98,114,111,119,115, + 101,70,111,114,70,105,108,101,84,111,83,97,118,101,32,40,116,114,117,101,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70, + 105,108,101,32,99,104,111,115,101,110,70,105,108,101,32,61,32,102,99,46,103,101,116,82,101,115,117,108,116,40,41,59,13,10,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111, + 119,77,101,115,115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,73,110,102,111,73,99,111,110,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,70,105,108,101,32,67,104,111,111,115,101,114,46,46,46,34,41,44,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,84,40,34,89,111,117,32,112,105,99,107,101,100,58,32,34,41,32,43,32,99,104,111,115,101,110, + 70,105,108,101,46,103,101,116,70,117,108,108,80,97,116,104,78,97,109,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,50,51,41,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,70,105,108,101,67,104,111,111,115,101,114,32,102,99,32,40,84,40,34,67,104,111,111,115,101,32,97,32,100,105,114,101, + 99,116,111,114,121,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,58,58,103,101,116,67,117,114,114,101,110,116,87,111,114,107,105,110,103,68,105,114,101, + 99,116,111,114,121,40,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,84,40,34,42,34,41,44,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,115,101,78,97,116,105,118,101,86,101,114,115,105,111,110,41,59,13,10,13, + 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,102,99,46,98,114,111,119,115,101,70,111, + 114,68,105,114,101,99,116,111,114,121,40,41,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123, + 13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,105,108,101,32,99,104,111,115,101, + 110,68,105,114,101,99,116,111,114,121,32,61,32,102,99,46,103,101,116,82,101,115,117,108,116,40,41,59,13,10,13,10,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,101,114,116,87,105,110,100,111,119,58,58,115,104,111,119,77,101,115, + 115,97,103,101,66,111,120,32,40,65,108,101,114,116,87,105,110,100,111,119,58,58,73,110,102,111,73,99,111,110,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,84,40,34,70,105,108,101,32,67,104,111,111,115,101,114,46,46,46,34,41,44,13,10,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,84,40,34,89,111,117,32,112,105,99,107,101,100,58,32,34,41,32,43,32,99,104,111,115,101,110,68,105,114,101, + 99,116,111,114,121,46,103,101,116,70,117,108,108,80,97,116,104,78,97,109,101,40,41,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32, + 40,114,101,115,117,108,116,32,61,61,32,49,48,48,49,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,97,98,115,45,62,115,101,116,79,114,105,101,110,116,97,116,105,111,110,32,40,84, + 97,98,98,101,100,66,117,116,116,111,110,66,97,114,58,58,84,97,98,115,65,116,84,111,112,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32, + 61,61,32,49,48,48,50,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,116,97,98,115,45,62,115,101,116,79,114,105,101,110,116,97,116,105,111,110,32,40,84,97,98,98,101,100,66,117,116, + 116,111,110,66,97,114,58,58,84,97,98,115,65,116,66,111,116,116,111,109,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 125,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,48, + 48,51,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,116,97,98,115,45,62,115,101,116,79,114,105,101,110,116,97,116,105,111,110,32,40,84,97,98,98,101,100,66,117,116,116,111,110,66,97, + 114,58,58,84,97,98,115,65,116,76,101,102,116,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,114,101,115,117,108,116,32,61,61,32,49,48,48,52,41,13,10,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,97,98, + 115,45,62,115,101,116,79,114,105,101,110,116,97,116,105,111,110,32,40,84,97,98,98,101,100,66,117,116,116,111,110,66,97,114,58,58,84,97,98,115, + 65,116,82,105,103,104,116,41,59,13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,32,32,32,32,32,32, + 32,32,125,13,10,32,32,32,32,32,32,32,32,125,13,10,32,32,32,32,125,13,10,125,59,13,10,13,10,13,10,47,47,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,10,67,111,109,112,111,110,101, + 110,116,42,32,99,114,101,97,116,101,87,105,100,103,101,116,115,68,101,109,111,32,40,65,112,112,108,105,99,97,116,105,111,110,67,111,109,109,97,110, + 100,77,97,110,97,103,101,114,42,32,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110, + 32,110,101,119,32,87,105,100,103,101,116,115,68,101,109,111,32,40,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,59,13,10,125,13,10,0,0}; +const char* BinaryData::widgetsdemo_cpp = (const char*) temp17; + diff --git a/extras/juce demo/src/BinaryData.h b/extras/juce demo/src/BinaryData.h new file mode 100644 index 0000000000..f7c1a3f9c0 --- /dev/null +++ b/extras/juce demo/src/BinaryData.h @@ -0,0 +1,61 @@ +/* (Auto-generated binary data file). */ + +#ifndef BINARY_BINARYDATA_H +#define BINARY_BINARYDATA_H + +namespace BinaryData +{ + extern const char* audiodemo_cpp; + const int audiodemo_cppSize = 23462; + + extern const char* cello_wav; + const int cello_wavSize = 46348; + + extern const char* demo_table_data_xml; + const int demo_table_data_xmlSize = 5239; + + extern const char* draganddropdemo_cpp; + const int draganddropdemo_cppSize = 7874; + + extern const char* fontsandtextdemo_cpp; + const int fontsandtextdemo_cppSize = 9064; + + extern const char* icons_zip; + const int icons_zipSize = 83876; + + extern const char* interprocesscommsdemo_cpp; + const int interprocesscommsdemo_cppSize = 12632; + + extern const char* juce_png; + const int juce_pngSize = 15290; + + extern const char* opengldemo_cpp; + const int opengldemo_cppSize = 8538; + + extern const char* pathsandtransformsdemo_cpp; + const int pathsandtransformsdemo_cppSize = 14232; + + extern const char* quicktimedemo_cpp; + const int quicktimedemo_cppSize = 4577; + + extern const char* readme__what_this_directory_is_for_txt; + const int readme__what_this_directory_is_for_txtSize = 259; + + extern const char* tabledemo_cpp; + const int tabledemo_cppSize = 12328; + + extern const char* threadingdemo_cpp; + const int threadingdemo_cppSize = 10048; + + extern const char* treedemo_xml; + const int treedemo_xmlSize = 1126; + + extern const char* treeviewdemo_cpp; + const int treeviewdemo_cppSize = 5430; + + extern const char* widgetsdemo_cpp; + const int widgetsdemo_cppSize = 50519; + +}; + +#endif diff --git a/extras/juce demo/src/MainDemoWindow.cpp b/extras/juce demo/src/MainDemoWindow.cpp new file mode 100644 index 0000000000..52add2aa1c --- /dev/null +++ b/extras/juce demo/src/MainDemoWindow.cpp @@ -0,0 +1,607 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "jucedemo_headers.h" +#include "MainDemoWindow.h" + + +//============================================================================== +class SourceCodeWindow; +static SourceCodeWindow* sourceWindow = 0; + + +//============================================================================== +class SourceCodeWindow : public DialogWindow +{ + TextEditor* textBox; + +public: + SourceCodeWindow() + : DialogWindow (T("JUCE Demo Source Code!"), + Colours::floralwhite, + false) + { + setContentComponent (textBox = new TextEditor()); + + textBox->setColour (TextEditor::backgroundColourId, Colours::white); + textBox->setMultiLine (true, false); + textBox->setReturnKeyStartsNewLine (true); + + setResizable (true, true); // we'll choose a corner-resizer component for this window, + // as a contrast to the resizable border on the main window + } + + ~SourceCodeWindow() + { + // the text editor gets deleted automatically because it's the + // window's content component. + + sourceWindow = 0; + } + + void closeButtonPressed() + { + delete this; + } + + void updateSourceCode (const String& text) + { + Font font (14.0f); + font.setTypefaceName (Font::getDefaultMonospacedFontName()); + textBox->setFont (font); + + textBox->setText (text); + + toFront (true); + } +}; + +//============================================================================== +class ContentComp : public Component, + public MenuBarModel, + public ApplicationCommandTarget +{ + //============================================================================== + MainDemoWindow* mainWindow; + + ShinyLookAndFeel shinyLookAndFeel; + + Component* currentDemo; + int currentDemoId; + const char* demoSourceCodeText; + + TooltipWindow tooltipWindow; // to add tooltips to an application, you + // just need to create one of these and leave it + // there to do its work.. + + enum CommandIDs + { + showPathsAndTransforms = 0x2000, + showFontsAndText = 0x2001, + showWidgets = 0x2002, + showThreading = 0x2003, + showTreeView = 0x2004, + showAudio = 0x2005, + showDragAndDrop = 0x2006, + showOpenGL = 0x2007, + showQuicktime = 0x2008, + showInterprocessComms = 0x2009, + showTable = 0x2010, + + showSourceCode = 0x200a, + + setDefaultLookAndFeel = 0x200b, + setShinyLookAndFeel = 0x200c, + useNativeTitleBar = 0x200d, + useNativeMenus = 0x200e + }; + +public: + //============================================================================== + ContentComp (MainDemoWindow* mainWindow_) + : mainWindow (mainWindow_), + currentDemo (0), + currentDemoId (0), + demoSourceCodeText (0) + { + LookAndFeel::setDefaultLookAndFeel (&shinyLookAndFeel); + + invokeDirectly (showWidgets, true); + } + + ~ContentComp() + { + // (need to do this because the default look-and-feel object is one of our members, + // so will be deleted with us, and would leave a dangling pointer) + LookAndFeel::setDefaultLookAndFeel (0); + + deleteAllChildren(); + + deleteAndZero (sourceWindow); + } + + //============================================================================== + void resized() + { + if (currentDemo != 0) + currentDemo->setBounds (0, 0, getWidth(), getHeight()); + } + + //============================================================================== + void showDemo (Component* demoComp, const char* sourceCodeText) + { + delete currentDemo; + currentDemo = demoComp; + + addAndMakeVisible (currentDemo); + resized(); + + demoSourceCodeText = sourceCodeText; + } + + void showSource() + { + if (sourceWindow == 0) + { + sourceWindow = new SourceCodeWindow(); + sourceWindow->centreAroundComponent (this, 750, 600); + sourceWindow->setVisible (true); + } + + sourceWindow->updateSourceCode (demoSourceCodeText); + } + + //============================================================================== + const StringArray getMenuBarNames() + { + const tchar* const names[] = { T("Demo"), T("Source Code"), T("Look-and-feel"), 0 }; + + return StringArray ((const tchar**) names); + } + + const PopupMenu getMenuForIndex (int menuIndex, + const String& menuName) + { + ApplicationCommandManager* const commandManager = mainWindow->commandManager; + + PopupMenu menu; + + if (menuIndex == 0) + { + menu.addCommandItem (commandManager, showPathsAndTransforms); + menu.addCommandItem (commandManager, showFontsAndText); + menu.addCommandItem (commandManager, showWidgets); + menu.addCommandItem (commandManager, showThreading); + menu.addCommandItem (commandManager, showTreeView); + menu.addCommandItem (commandManager, showTable); + menu.addCommandItem (commandManager, showAudio); + menu.addCommandItem (commandManager, showDragAndDrop); + menu.addCommandItem (commandManager, showOpenGL); + menu.addCommandItem (commandManager, showQuicktime); + menu.addCommandItem (commandManager, showInterprocessComms); + + menu.addSeparator(); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::quit); + } + else if (menuIndex == 1) + { + menu.addCommandItem (commandManager, showSourceCode); + } + else if (menuIndex == 2) + { + menu.addCommandItem (commandManager, setDefaultLookAndFeel); + menu.addCommandItem (commandManager, setShinyLookAndFeel); + menu.addSeparator(); + menu.addCommandItem (commandManager, useNativeTitleBar); + +#if JUCE_MAC + menu.addCommandItem (commandManager, useNativeMenus); +#endif + } + + return menu; + } + + void menuItemSelected (int menuItemID, + int topLevelMenuIndex) + { + // all our menu items are invoked automatically as commands, so no need to do + // anything in this callback + } + + //============================================================================== + // The following methods implement the ApplicationCommandTarget interface, allowing + // this window to publish a set of actions it can perform, and which can be mapped + // onto menus, keypresses, etc. + + ApplicationCommandTarget* getNextCommandTarget() + { + // this will return the next parent component that is an ApplicationCommandTarget (in this + // case, there probably isn't one, but it's best to use this method in your own apps). + return findFirstTargetParentComponent(); + } + + void getAllCommands (Array & commands) + { + // this returns the set of all commands that this target can perform.. + const CommandID ids[] = { showPathsAndTransforms, + showFontsAndText, + showWidgets, + showThreading, + showTreeView, + showTable, + showAudio, + showDragAndDrop, + showOpenGL, + showQuicktime, + showInterprocessComms, + showSourceCode, + setDefaultLookAndFeel, + setShinyLookAndFeel, + useNativeTitleBar +#if JUCE_MAC + , useNativeMenus +#endif + }; + + commands.addArray (ids, numElementsInArray (ids)); + } + + // This method is used when something needs to find out the details about one of the commands + // that this object can perform.. + void getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result) + { + const String generalCategory (T("General")); + const String demosCategory (T("Demos")); + + switch (commandID) + { + case showPathsAndTransforms: + result.setInfo (T("Paths and Transforms"), T("Shows the paths & transforms demo"), demosCategory, 0); + result.setTicked (currentDemoId == showPathsAndTransforms); + result.addDefaultKeypress (T('1'), ModifierKeys::commandModifier); + break; + + case showFontsAndText: + result.setInfo (T("Fonts and Text"), T("Shows the fonts & text demo"), demosCategory, 0); + result.setTicked (currentDemoId == showFontsAndText); + result.addDefaultKeypress (T('2'), ModifierKeys::commandModifier); + break; + + case showWidgets: + result.setInfo (T("Widgets"), T("Shows the widgets demo"), demosCategory, 0); + result.setTicked (currentDemoId == showWidgets); + result.addDefaultKeypress (T('3'), ModifierKeys::commandModifier); + break; + + case showThreading: + result.setInfo (T("Multithreading"), T("Shows the threading demo"), demosCategory, 0); + result.setTicked (currentDemoId == showThreading); + result.addDefaultKeypress (T('4'), ModifierKeys::commandModifier); + break; + + case showTreeView: + result.setInfo (T("Treeviews"), T("Shows the treeviews demo"), demosCategory, 0); + result.setTicked (currentDemoId == showTreeView); + result.addDefaultKeypress (T('5'), ModifierKeys::commandModifier); + break; + + case showTable: + result.setInfo (T("Table Components"), T("Shows the table component demo"), demosCategory, 0); + result.setTicked (currentDemoId == showTable); + result.addDefaultKeypress (T('6'), ModifierKeys::commandModifier); + break; + + case showAudio: + result.setInfo (T("Audio"), T("Shows the audio demo"), demosCategory, 0); + result.setTicked (currentDemoId == showAudio); + result.addDefaultKeypress (T('7'), ModifierKeys::commandModifier); + break; + + case showDragAndDrop: + result.setInfo (T("Drag-and-drop"), T("Shows the drag & drop demo"), demosCategory, 0); + result.setTicked (currentDemoId == showDragAndDrop); + result.addDefaultKeypress (T('8'), ModifierKeys::commandModifier); + break; + + case showOpenGL: + result.setInfo (T("OpenGL"), T("Shows the OpenGL demo"), demosCategory, 0); + result.addDefaultKeypress (T('9'), ModifierKeys::commandModifier); + result.setTicked (currentDemoId == showOpenGL); +#ifndef JUCE_OPENGL + result.setActive (false); +#endif + break; + + case showQuicktime: + result.setInfo (T("Quicktime"), T("Shows the Quicktime demo"), demosCategory, 0); + result.addDefaultKeypress (T('b'), ModifierKeys::commandModifier); + result.setTicked (currentDemoId == showQuicktime); +#if ! (JUCE_QUICKTIME && ! JUCE_LINUX) + result.setActive (false); +#endif + break; + + case showInterprocessComms: + result.setInfo (T("Interprocess Comms"), T("Shows the interprocess communications demo"), demosCategory, 0); + result.addDefaultKeypress (T('0'), ModifierKeys::commandModifier); + result.setTicked (currentDemoId == showInterprocessComms); + break; + + case showSourceCode: + result.setInfo (T("Show the source code for this demo"), T("Opens a window containing this demo's source code"), generalCategory, 0); + result.addDefaultKeypress (T('s'), ModifierKeys::commandModifier); + break; + + case setDefaultLookAndFeel: + result.setInfo (T("Use default look-and-feel"), String::empty, generalCategory, 0); + result.setTicked ((typeid (LookAndFeel) == typeid (getLookAndFeel())) != 0); + break; + + case setShinyLookAndFeel: + result.setInfo (T("Use shiny look-and-feel"), String::empty, generalCategory, 0); + result.setTicked ((typeid (ShinyLookAndFeel) == typeid (getLookAndFeel())) != 0); + break; + + case useNativeTitleBar: + result.setInfo (T("Use native window title bar"), String::empty, generalCategory, 0); + result.setTicked (mainWindow->isUsingNativeTitleBar()); + break; + +#if JUCE_MAC + case useNativeMenus: + result.setInfo (T("Use the native OSX menu bar"), String::empty, generalCategory, 0); + result.setTicked (MenuBarModel::getMacMainMenu() != 0); + break; +#endif + + default: + break; + }; + } + + // this is the ApplicationCommandTarget method that is used to actually perform one of our commands.. + bool perform (const InvocationInfo& info) + { + switch (info.commandID) + { + case showPathsAndTransforms: + showDemo (createPathsAndTransformsDemo(), BinaryData::pathsandtransformsdemo_cpp); + currentDemoId = showPathsAndTransforms; + break; + + case showFontsAndText: + showDemo (createFontsAndTextDemo(), BinaryData::fontsandtextdemo_cpp); + currentDemoId = showFontsAndText; + break; + + case showWidgets: + showDemo (createWidgetsDemo (mainWindow->commandManager), BinaryData::widgetsdemo_cpp); + currentDemoId = showWidgets; + break; + + case showThreading: + showDemo (createThreadingDemo(), BinaryData::threadingdemo_cpp); + currentDemoId = showThreading; + break; + + case showTreeView: + showDemo (createTreeViewDemo(), BinaryData::treeviewdemo_cpp); + currentDemoId = showTreeView; + break; + + case showTable: + showDemo (createTableDemo(), BinaryData::tabledemo_cpp); + currentDemoId = showTable; + break; + + case showAudio: + showDemo (createAudioDemo(), BinaryData::audiodemo_cpp); + currentDemoId = showAudio; + break; + + case showDragAndDrop: + showDemo (createDragAndDropDemo(), BinaryData::draganddropdemo_cpp); + currentDemoId = showDragAndDrop; + break; + + case showOpenGL: +#ifdef JUCE_OPENGL + showDemo (createOpenGLDemo(), BinaryData::opengldemo_cpp); + currentDemoId = showOpenGL; +#endif + break; + + case showQuicktime: +#if JUCE_QUICKTIME && ! JUCE_LINUX + showDemo (createQuickTimeDemo(), BinaryData::quicktimedemo_cpp); + currentDemoId = showQuicktime; +#endif + break; + + case showInterprocessComms: + showDemo (createInterprocessCommsDemo(), BinaryData::interprocesscommsdemo_cpp); + currentDemoId = showInterprocessComms; + break; + + case showSourceCode: + showSource(); + break; + + case setDefaultLookAndFeel: + LookAndFeel::setDefaultLookAndFeel (0); + break; + + case setShinyLookAndFeel: + LookAndFeel::setDefaultLookAndFeel (&shinyLookAndFeel); + break; + + case useNativeTitleBar: + mainWindow->setUsingNativeTitleBar (! mainWindow->isUsingNativeTitleBar()); + break; + +#if JUCE_MAC + case useNativeMenus: + if (MenuBarModel::getMacMainMenu() != 0) + { + MenuBarModel::setMacMainMenu (0); + mainWindow->setMenuBar ((ContentComp*) mainWindow->getContentComponent()); + } + else + { + MenuBarModel::setMacMainMenu ((ContentComp*) mainWindow->getContentComponent()); + mainWindow->setMenuBar (0); + } + + break; +#endif + + default: + return false; + }; + + return true; + } + + juce_UseDebuggingNewOperator +}; + +//============================================================================== +#if JUCE_WIN32 || JUCE_LINUX + +// Just add a simple icon to the Window system tray area.. +class DemoTaskbarComponent : public SystemTrayIconComponent +{ +public: + DemoTaskbarComponent() + { + // Create an icon which is just a square with a "j" in it.. + Image icon (Image::RGB, 32, 32, true); + Graphics g (icon); + g.fillAll (Colours::lightblue); + g.setColour (Colours::black); + g.setFont ((float) icon.getHeight(), Font::bold); + g.drawText (T("j"), 0, 0, icon.getWidth(), icon.getHeight(), Justification::centred, false); + + setIconImage (icon); + + setIconTooltip (T("Juce Demo App!")); + } + + ~DemoTaskbarComponent() + { + } + + void mouseDown (const MouseEvent& e) + { + PopupMenu m; + m.addItem (1, T("Quit the Juce demo")); + + const int result = m.show(); + + if (result == 1) + JUCEApplication::getInstance()->systemRequestedQuit(); + } +}; + +#endif + +//============================================================================== +MainDemoWindow::MainDemoWindow() + : DocumentWindow (T("JUCE Demo!"), + Colours::azure, + DocumentWindow::allButtons, + true) +{ + commandManager = new ApplicationCommandManager(); + + setResizable (true, false); // resizability is a property of ResizableWindow + + ContentComp* contentComp = new ContentComp (this); + + commandManager->registerAllCommandsForTarget (contentComp); + commandManager->registerAllCommandsForTarget (JUCEApplication::getInstance()); + + // this lets the command manager use keypresses that arrive in our window to send + // out commands + addKeyListener (commandManager->getKeyMappings()); + + // sets the main content component for the window to be this tabbed + // panel. This will be deleted when the window is deleted. + setContentComponent (contentComp); + + // this tells the DocumentWindow to automatically create and manage a MenuBarComponent + // which uses our contentComp as its MenuBarModel + setMenuBar (contentComp); + + // tells our menu bar model that it should watch this command manager for + // changes, and send change messages accordingly. + contentComp->setApplicationCommandManagerToWatch (commandManager); + + setVisible (true); + +#if JUCE_WIN32 || JUCE_LINUX + taskbarIcon = new DemoTaskbarComponent(); +#endif +} + +MainDemoWindow::~MainDemoWindow() +{ +#if JUCE_WIN32 || JUCE_LINUX + deleteAndZero (taskbarIcon); +#endif + + // because we've set the content comp to be used as our menu bar model, we + // have to switch this off before deleting the content comp.. + setMenuBar (0); + + // setting our content component to 0 will delete the current one, and + // that will in turn delete all its child components. You don't always + // have to do this explicitly, because the base class's destructor will + // also delete the content component, but in this case we need to + // make sure our content comp has gone away before deleting our command + // manager. + setContentComponent (0, true); + + delete commandManager; +} + +void MainDemoWindow::closeButtonPressed() +{ + // The correct thing to do when you want the app to quit is to call the + // JUCEApplication::systemRequestedQuit() method. + + // That means that requests to quit that come from your own UI, or from other + // OS-specific sources (e.g. the dock menu on the mac) all get handled in the + // same way. + + JUCEApplication::getInstance()->systemRequestedQuit(); +} diff --git a/extras/juce demo/src/MainDemoWindow.h b/extras/juce demo/src/MainDemoWindow.h new file mode 100644 index 0000000000..86ca746ff4 --- /dev/null +++ b/extras/juce demo/src/MainDemoWindow.h @@ -0,0 +1,56 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __MAINDEMOWINDOW_JUCEHEADER__ +#define __MAINDEMOWINDOW_JUCEHEADER__ + + +//============================================================================== +class MainDemoWindow : public DocumentWindow +{ +public: + //============================================================================== + MainDemoWindow(); + ~MainDemoWindow(); + + //============================================================================== + // called when the close button is pressed or esc is pushed + void closeButtonPressed(); + + // the command manager object used to dispatch command events + ApplicationCommandManager* commandManager; + +private: + Component* taskbarIcon; +}; + + +#endif // __MAINDEMOWINDOW_JUCEHEADER__ diff --git a/extras/juce demo/src/binarydata/AudioDemo.cpp b/extras/juce demo/src/binarydata/AudioDemo.cpp new file mode 100644 index 0000000000..6642c94755 --- /dev/null +++ b/extras/juce demo/src/binarydata/AudioDemo.cpp @@ -0,0 +1,640 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +/** Our demo synth only has one type of sound, and it's very basic.. +*/ +class SineWaveSound : public SynthesiserSound +{ +public: + SineWaveSound (const BitArray& midiNotes_) + : midiNotes (midiNotes_) + { + } + + bool appliesToNote (const int midiNoteNumber) + { + return midiNotes [midiNoteNumber]; + } + + bool appliesToChannel (const int midiChannel) { return true; } + +private: + // this will contain the notes that this sound is attached to. + BitArray midiNotes; +}; + + +//============================================================================== +/** Our demo synth voice just plays a sine wave.. +*/ +class SineWaveVoice : public SynthesiserVoice +{ +public: + SineWaveVoice() + : angleDelta (0.0), + tailOff (0.0) + { + } + + bool canPlaySound (SynthesiserSound* sound) + { + return dynamic_cast (sound) != 0; + } + + void startNote (const int midiNoteNumber, const float velocity, + SynthesiserSound* sound, const int currentPitchWheelPosition) + { + currentAngle = 0.0; + level = velocity * 0.15; + tailOff = 0.0; + + double cyclesPerSecond = MidiMessage::getMidiNoteInHertz (midiNoteNumber); + double cyclesPerSample = cyclesPerSecond / getSampleRate(); + + angleDelta = cyclesPerSample * 2.0 * double_Pi; + } + + void stopNote (const bool allowTailOff) + { + if (allowTailOff) + { + // start a tail-off by setting this flag. The render callback will pick up on + // this and do a fade out, calling clearCurrentNote() when it's finished. + + if (tailOff == 0.0) // we only need to begin a tail-off if it's not already doing so - the + // stopNote method could be called more than once. + tailOff = 1.0; + } + else + { + // we're being told to stop playing immediately, so reset everything.. + + clearCurrentNote(); + angleDelta = 0.0; + } + } + + void pitchWheelMoved (const int newValue) + { + // can't be bothered implementing this for the demo! + } + + void controllerMoved (const int controllerNumber, const int newValue) + { + // not interested in controllers in this case. + } + + void renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples) + { + if (angleDelta != 0.0) + { + if (tailOff > 0) + { + while (--numSamples >= 0) + { + const float currentSample = (float) (sin (currentAngle) * level * tailOff); + + for (int i = outputBuffer.getNumChannels(); --i >= 0;) + *outputBuffer.getSampleData (i, startSample) += currentSample; + + currentAngle += angleDelta; + ++startSample; + + tailOff *= 0.99; + + if (tailOff <= 0.005) + { + clearCurrentNote(); + + angleDelta = 0.0; + break; + } + } + } + else + { + while (--numSamples >= 0) + { + const float currentSample = (float) (sin (currentAngle) * level); + + for (int i = outputBuffer.getNumChannels(); --i >= 0;) + *outputBuffer.getSampleData (i, startSample) += currentSample; + + currentAngle += angleDelta; + ++startSample; + } + } + } + } + +private: + double currentAngle, angleDelta, level, tailOff; +}; + +//============================================================================== +/** This is an audio source that streams the output of our demo synth. +*/ +class SynthAudioSource : public AudioSource +{ +public: + //============================================================================== + // this collects real-time midi messages from the midi input device, and + // turns them into blocks that we can process in our audio callback + MidiMessageCollector midiCollector; + + // this represents the state of which keys on our on-screen keyboard are held + // down. When the mouse is clicked on the keyboard component, this object also + // generates midi messages for this, which we can pass on to our synth. + MidiKeyboardState keyboardState; + + // the synth itself! + Synthesiser synth; + + //============================================================================== + SynthAudioSource() + { + // we'll be mixing two different types of sound, so here we'll create two + // sets of note maps, putting each sound on a different octave of the keyboard: + BitArray sinewaveNotes, samplerNotes; + + int i; + for (i = 0; i < 128; ++i) + { + if (((i / 12) & 1) != 0) + sinewaveNotes.setBit (i); + else + samplerNotes.setBit (i); + } + + // add a wave sound, which will get applied to some of the notes.. + synth.addSound (new SineWaveSound (sinewaveNotes)); + + // give our synth a few voices that can play the wave sound.. + for (i = 4; --i >= 0;) + synth.addVoice (new SineWaveVoice()); + + WavAudioFormat wavFormat; + AudioFormatReader* audioReader + = wavFormat.createReaderFor (new MemoryInputStream (BinaryData::cello_wav, + BinaryData::cello_wavSize, + false), + true); + + synth.addSound (new SamplerSound (T("demo sound"), + *audioReader, + samplerNotes, + 74, // root midi note + 0.1, // attack time + 0.1, // release time + 10.0 // maximum sample length + )); + + delete audioReader; + + // and give the synth some sampler voices to play the sampled sound.. + for (i = 4; --i >= 0;) + synth.addVoice (new SamplerVoice()); + } + + void prepareToPlay (int samplesPerBlockExpected, + double sampleRate) + { + midiCollector.reset (sampleRate); + + synth.setCurrentPlaybackSampleRate (sampleRate); + } + + void releaseResources() + { + } + + void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) + { + // the synth always adds its output to the audio buffer, so we have to clear it + // first.. + bufferToFill.clearActiveBufferRegion(); + + // fill a midi buffer with incoming messages from the midi input. + MidiBuffer incomingMidi; + midiCollector.removeNextBlockOfMessages (incomingMidi, bufferToFill.numSamples); + + // pass these messages to the keyboard state so that it can update the component + // to show on-screen which keys are being pressed on the physical midi keyboard. + // This call will also add midi messages to the buffer which were generated by + // the mouse-clicking on the on-screen keyboard. + keyboardState.processNextMidiBuffer (incomingMidi, 0, bufferToFill.numSamples, true); + + // and now get the synth to process the midi events and generate its output. + synth.renderNextBlock (*bufferToFill.buffer, incomingMidi, 0, bufferToFill.numSamples); + } +}; + +//============================================================================== +class AudioInputWaveformDisplay : public Component, + public Timer, + public AudioIODeviceCallback +{ +public: + AudioInputWaveformDisplay() + { + bufferPos = 0; + bufferSize = 2048; + circularBuffer = (float*) juce_calloc (sizeof (float) * bufferSize); + currentInputLevel = 0.0f; + numSamplesIn = 0; + + setOpaque (true); + startTimer (1000 / 50); // repaint every 1/50 of a second + } + + ~AudioInputWaveformDisplay() + { + juce_free (circularBuffer); + } + + void paint (Graphics& g) + { + g.fillAll (Colours::black); + g.setColour (Colours::lightgreen); + + const float halfHeight = getHeight() * 0.5f; + + int bp = bufferPos; + + for (int x = getWidth(); --x >= 0;) + { + const int samplesAgo = getWidth() - x; + const float level = circularBuffer [(bp + bufferSize - samplesAgo) % bufferSize]; + + if (level > 0.01f) + g.drawLine ((float) x, halfHeight - halfHeight * level, + (float) x, halfHeight + halfHeight * level); + } + } + + void timerCallback() + { + repaint(); + } + + void addSample (const float sample) + { + currentInputLevel += fabsf (sample); + + const int samplesToAverage = 128; + + if (++numSamplesIn > samplesToAverage) + { + circularBuffer [bufferPos++ % bufferSize] = currentInputLevel / samplesToAverage; + + numSamplesIn = 0; + currentInputLevel = 0.0f; + } + } + + void audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) + { + for (int i = 0; i < totalNumInputChannels; ++i) + { + if (inputChannelData [i] != 0) + { + for (int j = 0; j < numSamples; ++j) + addSample (inputChannelData [i][j]); + + break; + } + } + } + + void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock) + { + zeromem (circularBuffer, sizeof (float) * bufferSize); + } + + void audioDeviceStopped() + { + zeromem (circularBuffer, sizeof (float) * bufferSize); + } + +private: + float* circularBuffer; + float currentInputLevel; + int volatile bufferPos, bufferSize, numSamplesIn; +}; + + +//============================================================================== +class AudioDemo : public Component, + public FilenameComponentListener, + public ButtonListener, + public ChangeListener, + public AudioIODeviceCallback +{ + //============================================================================== + FilenameComponent* fileChooser; + TextButton* playButton; + TextButton* stopButton; + TextButton* audioSettingsButton; + + MidiKeyboardComponent* keyboardComponent; + AudioInputWaveformDisplay* waveformComponent; + + //============================================================================== + // this wraps the actual audio device + AudioDeviceManager audioDeviceManager; + + // this allows an audio source to be streamed to the IO device + AudioSourcePlayer audioSourcePlayer; + + // this controls the playback of a positionable audio stream, handling the + // starting/stopping and sample-rate conversion + AudioTransportSource transportSource; + + // this source contains our synth, and generates its output + SynthAudioSource synthSource; + + // this source is used to mix together the output from our synth source + // and wave player source + MixerAudioSource mixerSource; + + // this is the actual stream that's going to read from the audio file. + AudioFormatReaderSource* currentAudioFileSource; + + File currentFile; + +public: + //============================================================================== + AudioDemo() + { + setName (T("Audio")); + + currentAudioFileSource = 0; + + //============================================================================== + AudioFormatManager formatManager; + formatManager.registerBasicFormats(); + + addAndMakeVisible (fileChooser = new FilenameComponent (T("audiofile"), + File::nonexistent, + true, false, false, + formatManager.getWildcardForAllFormats(), + String::empty, + T("(choose a WAV or AIFF file to play)"))); + fileChooser->addListener (this); + fileChooser->setBrowseButtonText (T("browse")); + + addAndMakeVisible (playButton = new TextButton (T("play"), + T("click here to play the current audio file"))); + playButton->addButtonListener (this); + playButton->setColour (TextButton::buttonColourId, Colours::lightgreen); + playButton->setColour (TextButton::buttonOnColourId, Colours::lightgreen); + playButton->setConnectedEdges (Button::ConnectedOnRight); + + addAndMakeVisible (stopButton = new TextButton (T("stop"), + T("click here to play the current audio file"))); + stopButton->addButtonListener (this); + stopButton->setColour (TextButton::buttonColourId, Colours::red); + stopButton->setColour (TextButton::buttonOnColourId, Colours::red); + stopButton->setConnectedEdges (Button::ConnectedOnLeft); + + addAndMakeVisible (audioSettingsButton = new TextButton (T("show audio settings..."), + T("click here to change the audio device settings"))); + audioSettingsButton->addButtonListener (this); + + addAndMakeVisible (keyboardComponent = new MidiKeyboardComponent (synthSource.keyboardState, + MidiKeyboardComponent::horizontalKeyboard)); + + + addAndMakeVisible (waveformComponent = new AudioInputWaveformDisplay()); + + //============================================================================== + // register for start/stop messages from the transport source.. + transportSource.addChangeListener (this); + + // and initialise the device manager with no settings so that it picks a + // default device to use. + const String error (audioDeviceManager.initialise (1, /* number of input channels */ + 2, /* number of output channels */ + 0, /* no XML settings.. */ + true /* select default device on failure */)); + + if (error.isNotEmpty()) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Audio Demo"), + T("Couldn't open an output device!\n\n") + error); + } + else + { + // add the two audio sources to our mixer.. + mixerSource.addInputSource (&transportSource, false); + mixerSource.addInputSource (&synthSource, false); + + // ..and connect the mixer to our source player. + audioSourcePlayer.setSource (&mixerSource); + + // start the IO device pulling its data from our callback.. + audioDeviceManager.setAudioCallback (this); + + // and we need to send midi input to our synth for processing + audioDeviceManager.addMidiInputCallback (String::empty, &synthSource.midiCollector); + } + } + + ~AudioDemo() + { + audioDeviceManager.removeMidiInputCallback (&synthSource.midiCollector); + audioDeviceManager.setAudioCallback (0); + + transportSource.removeChangeListener (this); + + transportSource.setSource (0); + deleteAndZero (currentAudioFileSource); + + audioSourcePlayer.setSource (0); + + deleteAllChildren(); + } + + //============================================================================== + void audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) + { + // pass the audio callback on to our player source, and also the waveform display comp + audioSourcePlayer.audioDeviceIOCallback (inputChannelData, totalNumInputChannels, outputChannelData, totalNumOutputChannels, numSamples); + waveformComponent->audioDeviceIOCallback (inputChannelData, totalNumInputChannels, outputChannelData, totalNumOutputChannels, numSamples); + } + + void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock) + { + audioSourcePlayer.audioDeviceAboutToStart (sampleRate, numSamplesPerBlock); + waveformComponent->audioDeviceAboutToStart (sampleRate, numSamplesPerBlock); + } + + void audioDeviceStopped() + { + audioSourcePlayer.audioDeviceStopped(); + waveformComponent->audioDeviceStopped(); + } + + //============================================================================== + void paint (Graphics& g) + { + // print some text to explain what state we're in. + + g.setColour (Colours::black); + g.setFont (14.0f); + + String s; + + if (transportSource.isPlaying()) + s = T("playing"); + else + s = T("stopped"); + + if (currentAudioFileSource == 0) + s += T(" - no source file selected"); + else + s += T(" - file: \"") + currentFile.getFullPathName() + T("\""); + + g.drawText (s, 250, 50, getWidth() - 250, 24, Justification::centredLeft, true); + } + + void resized() + { + fileChooser->setBounds (10, 10, getWidth() - 20, 24); + playButton->setBounds (10, 50, 100, 24); + stopButton->setBounds (110, 50, 100, 24); + audioSettingsButton->setBounds (10, 120, 200, 24); + audioSettingsButton->changeWidthToFitText(); + keyboardComponent->setBounds (10, 200, getWidth() - 20, 60); + waveformComponent->setBounds (10, 300, 400, 80); + + updateButtons(); + } + + void updateButtons() + { + playButton->setEnabled (currentAudioFileSource != 0 && ! transportSource.isPlaying()); + stopButton->setEnabled (transportSource.isPlaying()); + repaint(); + } + + void buttonClicked (Button* button) + { + if (button == playButton) + { + transportSource.setPosition (0.0); + transportSource.start(); + } + else if (button == stopButton) + { + transportSource.stop(); + } + else if (button == audioSettingsButton) + { + // Create an AudioDeviceSelectorComponent which contains the audio choice widgets... + + AudioDeviceSelectorComponent audioSettingsComp (audioDeviceManager, + 0, 1, + 2, 2, + true); + + // ...and show it in a DialogWindow... + audioSettingsComp.setSize (500, 400); + + DialogWindow::showModalDialog (T("Audio Settings"), + &audioSettingsComp, + this, + Colours::azure, + true); + } + } + + void filenameComponentChanged (FilenameComponent*) + { + // this is called when the user changes the filename in the file chooser box + + File audioFile (fileChooser->getCurrentFile()); + + // unload the previous file source and delete it.. + transportSource.stop(); + transportSource.setSource (0); + deleteAndZero (currentAudioFileSource); + + // create a new file source from the file.. + + // get a format manager and set it up with the basic types (wav and aiff). + AudioFormatManager formatManager; + formatManager.registerBasicFormats(); + + AudioFormatReader* reader = formatManager.createReaderFor (audioFile); + + if (reader != 0) + { + currentFile = audioFile; + + currentAudioFileSource = new AudioFormatReaderSource (reader, true); + + // ..and plug it into our transport source + transportSource.setSource (currentAudioFileSource, + 32768, // tells it to buffer this many samples ahead + reader->sampleRate); + } + + updateButtons(); + } + + void changeListenerCallback (void*) + { + // callback from the transport source to tell us that play has + // started or stopped, so update our buttons.. + updateButtons(); + } +}; + + +//============================================================================== +Component* createAudioDemo() +{ + return new AudioDemo(); +} diff --git a/extras/juce demo/src/binarydata/DragAndDropDemo.cpp b/extras/juce demo/src/binarydata/DragAndDropDemo.cpp new file mode 100644 index 0000000000..1496c339bf --- /dev/null +++ b/extras/juce demo/src/binarydata/DragAndDropDemo.cpp @@ -0,0 +1,239 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + +//============================================================================== +// this is the listbox containing the draggable source components.. + +class DragAndDropDemoSource : public ListBox, + public ListBoxModel +{ +public: + //============================================================================== + DragAndDropDemoSource() + : ListBox (T("d+d source"), 0) + { + // tells the ListBox that this object supplies the info about + // its rows. + setModel (this); + + setMultipleSelectionEnabled (true); + } + + ~DragAndDropDemoSource() + { + } + + //============================================================================== + // The following methods implement the necessary virtual functions from ListBoxModel, + // telling the listbox how many rows there are, painting them, etc. + int getNumRows() + { + return 30; + } + + void paintListBoxItem (int rowNumber, + Graphics& g, + int width, int height, + bool rowIsSelected) + { + if (rowIsSelected) + g.fillAll (Colours::lightblue); + + g.setColour (Colours::black); + g.setFont (height * 0.7f); + + g.drawText (T("Row Number ") + String (rowNumber + 1), + 5, 0, width, height, + Justification::centredLeft, true); + } + + const String getDragSourceDescription (const SparseSet& selectedRows) + { + // for our drag desctription, we'll just make a list of the selected + // row numbers - this will be picked up by the drag target and displayed in + // its box. + String desc; + + for (int i = 0; i < selectedRows.size(); ++i) + desc << (selectedRows [i] + 1) << T(" "); + + return desc.trim(); + } + + //============================================================================== + // this just fills in the background of the listbox + void paint (Graphics& g) + { + g.fillAll (Colours::white.withAlpha (0.7f)); + } + + /*void listBoxItemClicked (int row, const MouseEvent& e) + { + PopupMenu m; + m.addItem (1, "sdfsdfs"); + + m.show(); + + //AlertWindow::showMessageBox (AlertWindow::InfoIcon, "asdfsadfads", "srdfsdfa"); + DocumentWindow* dw = new DocumentWindow ("sfdsd", Colours::white, DocumentWindow::allButtons, true); + dw->setBounds (100, 100, 500, 500); + dw->setVisible (true); + }*/ +}; + + +//============================================================================== +// and this is a component that can have things dropped onto it.. + +class DragAndDropDemoTarget : public Component, + public DragAndDropTarget +{ + bool somethingIsBeingDraggedOver; + String message; + +public: + //============================================================================== + DragAndDropDemoTarget() + { + somethingIsBeingDraggedOver = false; + + message = T("Drag-and-drop some rows from the top-left box onto this component!"); + } + + ~DragAndDropDemoTarget() + { + } + + //============================================================================== + void paint (Graphics& g) + { + g.fillAll (Colours::green.withAlpha (0.2f)); + + // draw a red line around the comp if the user's currently dragging something over it.. + if (somethingIsBeingDraggedOver) + { + g.setColour (Colours::red); + g.drawRect (0, 0, getWidth(), getHeight(), 3); + } + + g.setColour (Colours::black); + g.setFont (14.0f); + g.drawFittedText (message, 10, 0, getWidth() - 20, getHeight(), Justification::centred, 4); + } + + //============================================================================== + bool isInterestedInDragSource (const String& sourceDescription) + { + // normally you'd check the sourceDescription value to see if it's the + // sort of object that you're interested in before returning true, but for + // the demo, we'll say yes to anything.. + return true; + } + + void itemDragEnter (const String& sourceDescription, + Component* sourceComponent, + int x, int y) + { + somethingIsBeingDraggedOver = true; + repaint(); + } + + void itemDragMove (const String& sourceDescription, + Component* sourceComponent, + int x, int y) + { + } + + void itemDragExit (const String& sourceDescription, + Component* sourceComponent) + { + somethingIsBeingDraggedOver = false; + repaint(); + } + + void itemDropped (const String& sourceDescription, + Component* sourceComponent, + int x, int y) + { + message = T("last rows dropped: ") + sourceDescription; + + somethingIsBeingDraggedOver = false; + repaint(); + } +}; + + +//============================================================================== +class DragAndDropDemo : public Component, + public DragAndDropContainer +{ + //============================================================================== + DragAndDropDemoSource* source; + DragAndDropDemoTarget* target; + +public: + //============================================================================== + DragAndDropDemo() + { + setName (T("Drag-and-Drop")); + + source = new DragAndDropDemoSource(); + addAndMakeVisible (source); + + target = new DragAndDropDemoTarget(); + addAndMakeVisible (target); + } + + ~DragAndDropDemo() + { + deleteAllChildren(); + } + + void resized() + { + source->setBounds (10, 10, 250, 150); + target->setBounds (getWidth() - 260, getHeight() - 160, 250, 150); + } + + //============================================================================== + // (need to put this in to disambiguate the new/delete operators used in the + // two base classes). + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +Component* createDragAndDropDemo() +{ + return new DragAndDropDemo(); +} diff --git a/extras/juce demo/src/binarydata/FontsAndTextDemo.cpp b/extras/juce demo/src/binarydata/FontsAndTextDemo.cpp new file mode 100644 index 0000000000..7de327ce42 --- /dev/null +++ b/extras/juce demo/src/binarydata/FontsAndTextDemo.cpp @@ -0,0 +1,215 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class FontsAndTextDemo : public Component, + public ListBoxModel, + public ButtonListener, + public SliderListener +{ + OwnedArray fonts; + ListBox* listBox; + TextEditor* textBox; + ToggleButton* boldButton; + ToggleButton* italicButton; + Slider* sizeSlider; + + StretchableLayoutManager verticalLayout; + StretchableLayoutManager horizontalLayout; + + StretchableLayoutResizerBar* verticalDividerBar; + StretchableLayoutResizerBar* horizontalDividerBar; + +public: + //============================================================================== + FontsAndTextDemo() + { + setName (T("Fonts")); + + Font::findFonts (fonts); + + addAndMakeVisible (listBox = new ListBox (T("fonts"), this)); + listBox->setRowHeight (28); + + addAndMakeVisible (textBox = new TextEditor()); + + textBox->setColour (TextEditor::backgroundColourId, Colours::white); + textBox->setColour (TextEditor::outlineColourId, Colours::black.withAlpha (0.5f)); + + textBox->setMultiLine (true, true); + textBox->setReturnKeyStartsNewLine (true); + textBox->setText (T("The Quick Brown Fox Jumped Over The Lazy Dog\n\nAa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz 0123456789")); + + addAndMakeVisible (boldButton = new ToggleButton (T("bold"))); + boldButton->addButtonListener (this); + + addAndMakeVisible (italicButton = new ToggleButton (T("italic"))); + italicButton->addButtonListener (this); + + addAndMakeVisible (sizeSlider = new Slider (T("size"))); + sizeSlider->setRange (3.0, 50.0, 0.1); + sizeSlider->setValue (20.0); + sizeSlider->addListener (this); + + listBox->selectRow (0); + listBox->setColour (ListBox::outlineColourId, Colours::black.withAlpha (0.5f)); + listBox->setOutlineThickness (1); + + // set up the layout and resizer bars.. + + verticalLayout.setItemLayout (0, -0.2, -0.8, -0.5); // width of the font list must be + // between 20% and 80%, preferably 50% + verticalLayout.setItemLayout (1, 8, 8, 8); // the vertical divider drag-bar thing is always 8 pixels wide + verticalLayout.setItemLayout (2, 150, -1.0, -0.5); // the components on the right must be + // at least 150 pixels wide, preferably 50% of the total width + + verticalDividerBar = new StretchableLayoutResizerBar (&verticalLayout, 1, true); + addAndMakeVisible (verticalDividerBar); + + horizontalLayout.setItemLayout (0, -0.2, -1.0, -0.4); // height of the font text box must be + // between 20% and 100%, preferably 40% + horizontalLayout.setItemLayout (1, 8, 8, 8); // the horizontal divider drag-bar thing is always 8 pixels high + horizontalLayout.setItemLayout (2, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (3, 15, 20, 20); // the italic button would like to be 20 pixels high + horizontalLayout.setItemLayout (4, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (5, 15, 20, 20); // the bold button would like to be 20 pixels high + horizontalLayout.setItemLayout (6, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (7, 15, 20, 20); // the italic button would like to be 20 pixels high + horizontalLayout.setItemLayout (8, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (9, 15, 20, 20); // the copy code button would like to be 20 pixels high + horizontalLayout.setItemLayout (10, 5, -1.0, 5); // add a gap at the bottom that will fill up any + // space left over - this will stop the + // sliders from always sticking to the + // bottom of the window + + horizontalDividerBar = new StretchableLayoutResizerBar (&horizontalLayout, 1, false); + addAndMakeVisible (horizontalDividerBar); + } + + ~FontsAndTextDemo() + { + deleteAllChildren(); + } + + void resized() + { + // lay out the list box and vertical divider.. + Component* vcomps[] = { listBox, verticalDividerBar, 0 }; + + verticalLayout.layOutComponents (vcomps, 3, + 4, 4, getWidth() - 8, getHeight() - 8, + false, // lay out side-by-side + true); // resize the components' heights as well as widths + + // now lay out the text box and the controls below it.. + Component* hcomps[] = { textBox, horizontalDividerBar, 0, + boldButton, 0, + italicButton, 0, + sizeSlider }; + + horizontalLayout.layOutComponents (hcomps, 8, + 4 + verticalLayout.getItemCurrentPosition (2), // for their widths, refer to the vertical layout state + 4, + verticalLayout.getItemCurrentAbsoluteSize (2), + getHeight() - 8, + true, // lay out above each other + true); // resize the components' widths as well as heights + } + + // implements the ListBoxModel method + int getNumRows() + { + return fonts.size(); + } + + // implements the ListBoxModel method + void paintListBoxItem (int rowNumber, + Graphics& g, + int width, int height, + bool rowIsSelected) + { + if (rowIsSelected) + g.fillAll (Colours::lightblue); + + if (fonts [rowNumber] != 0) + { + Font font (*fonts [rowNumber]); + font.setHeight (height * 0.7f); + + g.setFont (font); + g.drawText (font.getTypefaceName(), + 4, 0, width - 4, height, + Justification::centredLeft, true); + } + } + + void updatePreviewBoxText() + { + Font* f = fonts [listBox->getSelectedRow()]; + + if (f != 0) + { + Font font (*f); + + font.setHeight ((float) sizeSlider->getValue()); + font.setBold (boldButton->getToggleState()); + font.setItalic (italicButton->getToggleState()); + + textBox->applyFontToAllText (font); + } + } + + void selectedRowsChanged (int lastRowselected) + { + updatePreviewBoxText(); + } + + void buttonClicked (Button* button) + { + updatePreviewBoxText(); + } + + void sliderValueChanged (Slider*) + { + // (this is called when the size slider is moved) + updatePreviewBoxText(); + } +}; + + +//============================================================================== +Component* createFontsAndTextDemo() +{ + return new FontsAndTextDemo(); +} diff --git a/extras/juce demo/src/binarydata/InterprocessCommsDemo.cpp b/extras/juce demo/src/binarydata/InterprocessCommsDemo.cpp new file mode 100644 index 0000000000..ae7fe623f2 --- /dev/null +++ b/extras/juce demo/src/binarydata/InterprocessCommsDemo.cpp @@ -0,0 +1,334 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class InterprocessCommsDemo : public Component, + public ButtonListener, + public ComboBoxListener +{ +public: + //============================================================================== + InterprocessCommsDemo() + { + server = new DemoInterprocessConnectionServer (*this); + + setName (T("Interprocess Communication")); + + // create all our UI bits and pieces.. + addAndMakeVisible (modeSelector = new ComboBox (T("mode:"))); + modeSelector->setBounds (100, 25, 200, 24); + (new Label (modeSelector->getName(), modeSelector->getName()))->attachToComponent (modeSelector, true); + + modeSelector->addItem (T("(Disconnected)"), 8); + modeSelector->addSeparator(); + modeSelector->addItem (T("Named pipe (listening)"), 1); + modeSelector->addItem (T("Named pipe (connect to existing pipe)"), 5); + modeSelector->addSeparator(); + modeSelector->addItem (T("Socket (listening)"), 2); + modeSelector->addItem (T("Socket (connect to existing socket)"), 6); + + modeSelector->setSelectedId (8); + modeSelector->addListener (this); + + addAndMakeVisible (pipeName = new TextEditor (T("pipe name:"))); + pipeName->setBounds (100, 60, 130, 24); + pipeName->setMultiLine (false); + pipeName->setText (T("juce demo pipe")); + (new Label (pipeName->getName(), pipeName->getName()))->attachToComponent (pipeName, true); + + addAndMakeVisible (socketNumber = new TextEditor (T("socket port:"))); + socketNumber->setBounds (350, 60, 80, 24); + socketNumber->setMultiLine (false); + socketNumber->setText (T("12345")); + socketNumber->setInputRestrictions (5, T("0123456789")); + (new Label (socketNumber->getName(), socketNumber->getName()))->attachToComponent (socketNumber, true); + + addAndMakeVisible (socketHost = new TextEditor (T("socket host:"))); + socketHost->setBounds (530, 60, 130, 24); + socketHost->setMultiLine (false); + socketHost->setText (T("localhost")); + socketNumber->setInputRestrictions (512); + (new Label (socketHost->getName(), socketHost->getName()))->attachToComponent (socketHost, true); + + addChildComponent (sendText = new TextEditor (T("sendtext"))); + sendText->setBounds (30, 120, 200, 24); + sendText->setMultiLine (false); + sendText->setReadOnly (false); + sendText->setText (T("testing 1234")); + + addChildComponent (sendButton = new TextButton (T("send"), T("Fires off the message"))); + sendButton->setBounds (240, 120, 200, 24); + sendButton->changeWidthToFitText(); + sendButton->addButtonListener (this); + + addChildComponent (incomingMessages = new TextEditor (T("messages"))); + incomingMessages->setReadOnly (true); + incomingMessages->setMultiLine (true); + incomingMessages->setBounds (30, 150, 500, 250); + + // call this to set up everything's state correctly. + comboBoxChanged (0); + } + + ~InterprocessCommsDemo() + { + close(); + delete server; + + deleteAllChildren(); + } + + void buttonClicked (Button* button) + { + if (button == sendButton) + { + // The send button has been pressed, so write out the contents of the + // text box to the socket or pipe, depending on which is active. + const String text (sendText->getText()); + MemoryBlock messageData ((const char*) text, text.length()); + + for (int i = activeConnections.size(); --i >= 0;) + { + if (! activeConnections[i]->sendMessage (messageData)) + { + // the write failed, so indicate that the connection has broken.. + appendMessage (T("send message failed!")); + } + } + } + } + + void comboBoxChanged (ComboBox*) + { + // This is called when the user picks a different mode from the drop-down list.. + const int modeId = modeSelector->getSelectedId(); + + close(); + + if (modeId < 8) + { + open ((modeId & 2) != 0, + (modeId & 4) != 0); + } + } + + //============================================================================== + // Just closes any connections that are currently open. + void close() + { + server->stop(); + activeConnections.clear(); + + // Reset the UI stuff to a disabled state. + sendText->setVisible (false); + sendButton->setVisible (false); + incomingMessages->setText (String::empty, false); + incomingMessages->setVisible (true); + + appendMessage ( + "To demonstrate named pipes, you'll need to run two instances of the JuceDemo application on this machine. On " + "one of them, select \"named pipe (listening)\", and then on the other, select \"named pipe (connect to existing pipe)\". Then messages that you " + "send from the 'sender' app should appear on the listener app. The \"pipe name\" field lets you choose a name for the pipe\n\n" + "To demonstrate sockets, you can either run two instances of the app on the same machine, or on different " + "machines on your network. In each one enter a socket number, then on one of the apps, select the " + "\"Socket (listening)\" mode. On the other, enter the host address of the listening app, and select \"Socket (connect to existing socket)\". " + "Messages should then be be sent between the apps in the same way as through the named pipes."); + } + + void open (bool asSocket, bool asSender) + { + close(); + + // Make the appropriate bits of UI visible.. + sendText->setVisible (true); + sendButton->setVisible (true); + + incomingMessages->setText (String::empty, false); + incomingMessages->setVisible (true); + + // and try to open the socket or pipe... + bool openedOk = false; + + if (asSender) + { + // if we're connecting to an existing server, we can just create a connection object + // directly. + DemoInterprocessConnection* newConnection = new DemoInterprocessConnection (*this); + + if (asSocket) + { + openedOk = newConnection->connectToSocket (socketHost->getText(), + socketNumber->getText().getIntValue(), + 1000); + } + else + { + openedOk = newConnection->connectToPipe (pipeName->getText()); + } + + if (openedOk) + activeConnections.add (newConnection); + else + delete newConnection; + } + else + { + // if we're starting up a server, we need to tell the server to start waiting for + // clients to connect. It'll then create connection objects for us when clients arrive. + if (asSocket) + { + openedOk = server->beginWaitingForSocket (socketNumber->getText().getIntValue()); + + if (openedOk) + appendMessage (T("Waiting for another app to connect to this socket..")); + } + else + { + DemoInterprocessConnection* newConnection = new DemoInterprocessConnection (*this); + + openedOk = newConnection->createPipe (pipeName->getText()); + + if (openedOk) + { + appendMessage (T("Waiting for another app to connect to this pipe..")); + activeConnections.add (newConnection); + } + else + { + delete newConnection; + } + } + } + + if (! openedOk) + { + modeSelector->setSelectedId (8); + + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Interprocess Comms Demo"), + T("Failed to open the socket or pipe...")); + } + } + + void appendMessage (const String& message) + { + incomingMessages->setCaretPosition (INT_MAX); + incomingMessages->insertTextAtCursor (message + T("\n")); + incomingMessages->setCaretPosition (INT_MAX); + } + + //============================================================================== + class DemoInterprocessConnection : public InterprocessConnection + { + InterprocessCommsDemo& owner; + int ourNumber; + + public: + DemoInterprocessConnection (InterprocessCommsDemo& owner_) + : InterprocessConnection (true), + owner (owner_) + { + static int totalConnections = 0; + ourNumber = ++totalConnections; + } + + ~DemoInterprocessConnection() + { + } + + void connectionMade() + { + owner.appendMessage (T("Connection #") + String (ourNumber) + T(" - connection started")); + } + + void connectionLost() + { + owner.appendMessage (T("Connection #") + String (ourNumber) + T(" - connection lost")); + } + + void messageReceived (const MemoryBlock& message) + { + owner.appendMessage (T("Connection #") + String (ourNumber) + T(" - message received: ") + message.toString()); + } + }; + + //============================================================================== + class DemoInterprocessConnectionServer : public InterprocessConnectionServer + { + InterprocessCommsDemo& owner; + + public: + DemoInterprocessConnectionServer (InterprocessCommsDemo& owner_) + : owner (owner_) + { + } + + ~DemoInterprocessConnectionServer() + { + } + + InterprocessConnection* createConnectionObject() + { + DemoInterprocessConnection* newConnection = new DemoInterprocessConnection (owner); + + owner.activeConnections.add (newConnection); + return newConnection; + } + }; + + OwnedArray activeConnections; + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + ComboBox* modeSelector; + TextEditor* sendText; + TextButton* sendButton; + TextEditor* incomingMessages; + + TextEditor* pipeName; + TextEditor* socketNumber; + TextEditor* socketHost; + + DemoInterprocessConnectionServer* server; +}; + + +//============================================================================== +Component* createInterprocessCommsDemo() +{ + return new InterprocessCommsDemo(); +} diff --git a/extras/juce demo/src/binarydata/OpenGLDemo.cpp b/extras/juce demo/src/binarydata/OpenGLDemo.cpp new file mode 100644 index 0000000000..7dadef9e06 --- /dev/null +++ b/extras/juce demo/src/binarydata/OpenGLDemo.cpp @@ -0,0 +1,257 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _WIN32 + #include +#elif ! defined (LINUX) + #include + #include +#endif + +#include "../jucedemo_headers.h" + +#if JUCE_OPENGL + +#ifdef _WIN32 + #include + #include + #ifdef _MSC_VER + #pragma comment(lib, "OpenGL32.Lib") + #pragma comment(lib, "GlU32.Lib") + #endif +#elif defined (LINUX) + #include + #include + #undef KeyPress +#else + #include + #include +#endif + +#ifndef GL_BGRA_EXT + #define GL_BGRA_EXT 0x80e1 +#endif + +//============================================================================== +class DemoOpenGLCanvas : public OpenGLComponent, + public Timer +{ + float rotation, delta; + Image* image; + +public: + DemoOpenGLCanvas() + { + rotation = 0.0f; + delta = 1.0f; + + Image* im = ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize); + image = new Image (Image::RGB, 512, 512, true); + Graphics g (*image); + g.fillAll (Colours::white); + g.drawImage (im, 0, 0, 512, 512, 0, 0, im->getWidth(), im->getHeight()); + delete im; + + startTimer (20); + } + + ~DemoOpenGLCanvas() + { + delete image; + } + + // when the component creates a new internal context, this is called, and + // we'll use the opportunity to create the textures needed. + void newOpenGLContextCreated() + { + // (no need to call makeCurrentContextActive(), as that will have + // been done for us before the method call). + glClearColor (0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth (1.0); + + glDepthFunc (GL_LESS); + glEnable (GL_DEPTH_TEST); + glEnable (GL_TEXTURE_2D); + glEnable (GL_BLEND); + glShadeModel (GL_SMOOTH); + + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glPixelStorei (GL_UNPACK_ALIGNMENT, 4); + + int stride, pixStride; + const void* pixels = image->lockPixelDataReadOnly (0, 0, image->getWidth(), image->getHeight(), stride, pixStride); + + glTexImage2D (GL_TEXTURE_2D, 0, 4, image->getWidth(), image->getHeight(), + 0, GL_RGB, + GL_UNSIGNED_BYTE, pixels); + image->releasePixelDataReadOnly (pixels); + + glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint (GL_POINT_SMOOTH_HINT, GL_NICEST); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + void mouseDrag (const MouseEvent& e) + { + delta = e.getDistanceFromDragStartX() / 100.0f; + repaint(); + } + + void renderOpenGL() + { + glClearColor (0.8f, 0.0f, 0.4f, 0.0f); + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho (0.0, getWidth(), 0.0, getHeight(), 0, 1); + + glColor4f (1.0f, 1.0f, 1.0f, fabsf (sinf (rotation / 100.0f))); + glBegin(GL_QUADS); + glTexCoord2i (0, 0); glVertex2f (50.0f, getHeight() - 50.0f); + glTexCoord2i (1, 0); glVertex2f (getWidth() - 50.0f, getHeight() - 50.0f); + glTexCoord2i (1, 1); glVertex2f (getWidth() - 50.0f, 50.0f); + glTexCoord2i (0, 1); glVertex2f (50.0f, 50.0f); + glEnd(); + + glMatrixMode (GL_PROJECTION); + glLoadIdentity(); + + glClear (GL_DEPTH_BUFFER_BIT); + gluPerspective (45.0f, + getWidth() / (GLfloat) getHeight(), + 0.1f, + 100.0f); + + glMatrixMode (GL_MODELVIEW); + + glLoadIdentity(); + glPushMatrix(); + + glTranslatef (0.0f, 0.0f, -5.0f); + glRotatef (rotation, 0.5f, 1.0f, 0.0f); + + glBegin (GL_QUADS); + + glColor3f (0.0f, 1.0f, 0.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + + glColor3f (1.0f, 0.0f, 0.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + + glColor3f (0.0f, 0.0f, 1.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + + glColor3f (1.0f, 1.0f, 0.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + + glColor3f (0.0f, 1.0f, 1.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + + glColor3f (1.0f, 0.0f, 1.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + + glEnd(); + + glPopMatrix(); + } + + void timerCallback() + { + rotation += delta; + + repaint(); + } +}; + +//============================================================================== +class OpenGLDemo : public Component +{ + //============================================================================== + DemoOpenGLCanvas* canvas; + +public: + //============================================================================== + OpenGLDemo() + { + setName (T("OpenGL")); + + canvas = new DemoOpenGLCanvas(); + addAndMakeVisible (canvas); + } + + ~OpenGLDemo() + { + deleteAllChildren(); + } + + void resized() + { + canvas->setBounds (10, 10, getWidth() - 20, getHeight() - 50); + } +}; + + +//============================================================================== +Component* createOpenGLDemo() +{ + return new OpenGLDemo(); +} + +#endif diff --git a/extras/juce demo/src/binarydata/PathsAndTransformsDemo.cpp b/extras/juce demo/src/binarydata/PathsAndTransformsDemo.cpp new file mode 100644 index 0000000000..d2cee55ccd --- /dev/null +++ b/extras/juce demo/src/binarydata/PathsAndTransformsDemo.cpp @@ -0,0 +1,384 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +static float randomNumber() +{ + return Random::getSystemRandom().nextFloat() * 300.0f - 150.0f; +} + + +//============================================================================== +class PathsAndTransformsDemo : public Component, + public SliderListener, + public ComboBoxListener +{ +public: + //============================================================================== + PathsAndTransformsDemo() + { + setName (T("Paths")); + + // No parts of this component are semi-transparent, so calling setOpaque() + // allows the redraw system to exploit this fact and optimise repainting. + setOpaque (true); + + generateRandomShape(); + generateImage(); + generateDrawable(); + generateSVGDrawable(); + + addAndMakeVisible (typeChooser = new ComboBox (T("type"))); + addAndMakeVisible (scaleSlider = new Slider (T("scale"))); + addAndMakeVisible (angleSlider = new Slider (T("angle"))); + addAndMakeVisible (xSlider = new Slider (T("x"))); + addAndMakeVisible (ySlider = new Slider (T("y"))); + addAndMakeVisible (opacitySlider = new Slider (T("opacity"))); + + (new Label (String::empty, T("type:"))) ->attachToComponent (typeChooser, true); + (new Label (String::empty, T("scale:"))) ->attachToComponent (scaleSlider, true); + (new Label (String::empty, T("angle:"))) ->attachToComponent (angleSlider, true); + (new Label (String::empty, T("x offset:"))) ->attachToComponent (xSlider, true); + (new Label (String::empty, T("y offset:"))) ->attachToComponent (ySlider, true); + (new Label (String::empty, T("opacity:"))) ->attachToComponent (opacitySlider, true); + + typeChooser->addItem (T("random shape - solid colour"), 1); + typeChooser->addItem (T("random shape - linear gradient fill"), 2); + typeChooser->addItem (T("random shape - radial gradient fill"), 3); + typeChooser->addItem (T("random shape - tiled image fill"), 8); + typeChooser->addItem (T("image - low quality"), 4); + typeChooser->addItem (T("image - high quality"), 5); + typeChooser->addItem (T("image - colour-filled alpha channel"), 6); + typeChooser->addItem (T("image - gradient-filled alpha channel"), 7); + typeChooser->addItem (T("image - alphamap-filled alpha channel"), 9); + typeChooser->addItem (T("drawable object"), 10); + typeChooser->addItem (T("SVG object"), 11); + typeChooser->setSelectedId (11); + typeChooser->addListener (this); + + scaleSlider ->addListener (this); + angleSlider ->addListener (this); + xSlider ->addListener (this); + ySlider ->addListener (this); + opacitySlider ->addListener (this); + + scaleSlider->setRange (0.01, 10.0, 0.001); + scaleSlider->setValue (1.0); + + angleSlider->setRange (-1.0, 1.0, 0.001); + angleSlider->setValue (0); + + xSlider->setRange (-10, 10, 0.001); + xSlider->setValue (0); + + ySlider->setRange (-10, 10, 0.001); + ySlider->setValue (0); + + opacitySlider->setRange (0, 1, 0.01); + opacitySlider->setValue (1.0); + } + + ~PathsAndTransformsDemo() + { + if (image != 0) + delete image; + + delete drawable; + delete svgDrawable; + + deleteAllChildren(); + } + + void paint (Graphics& g) + { + g.fillCheckerBoard (0, 0, getWidth(), getHeight(), + 50, 50, + Colour (0xffe0e0e0), + Colours::white); + + const int type = typeChooser->getSelectedId(); + + if (type == 1) + { + g.setColour (Colours::blue.withAlpha ((float) opacitySlider->getValue())); + g.fillPath (shape, getTransform()); + } + else if (type == 2 || type == 3) + { + GradientBrush gb (Colours::blue.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.5f, getHeight() * 0.5f, + Colours::red.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.6f, getHeight() * 0.7f, + type == 3); + + g.setBrush (&gb); + g.fillPath (shape, getTransform()); + } + else if (type == 8) + { + ImageBrush ib (image, 100, 100, (float) opacitySlider->getValue()); + + g.setBrush (&ib); + g.fillPath (shape, getTransform()); + } + else if (type == 4 || type == 5) + { + if (type == 4) + g.setImageResamplingQuality (Graphics::lowResamplingQuality); + else + g.setImageResamplingQuality (Graphics::mediumResamplingQuality); + + g.setOpacity ((float) opacitySlider->getValue()); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), -0.5f * image->getHeight()) + .followedBy (getTransform()), + false); + } + } + else if (type == 6) + { + g.setColour (Colours::blue.withAlpha ((float) opacitySlider->getValue())); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), -0.5f * image->getHeight()) + .followedBy (getTransform()), + true); + } + } + else if (type == 7) + { + GradientBrush gb (Colours::blue.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.5f, getHeight() * 0.5f, + Colours::red.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.6f, getHeight() * 0.7f, + false); + + g.setBrush (&gb); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), -0.5f * image->getHeight()) + .followedBy (getTransform()), + true); + } + } + else if (type == 9) + { + ImageBrush ib (image, 100, 100, (float) opacitySlider->getValue()); + g.setBrush (&ib); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), + -0.5f * image->getHeight()) + .followedBy (getTransform()), + true); + } + } + else if (type == 10) + { + g.setOpacity ((float) opacitySlider->getValue()); + + float x, y, w, h; + drawable->getBounds (x, y, w, h); + + drawable->draw (g, AffineTransform::translation (-x - 0.5f * w, + -y - 0.5f * h) + .followedBy (getTransform())); + } + else if (type == 11) + { + g.setOpacity ((float) opacitySlider->getValue()); + + float x, y, w, h; + svgDrawable->getBounds (x, y, w, h); + + svgDrawable->draw (g, AffineTransform::translation (-x - 0.5f * w, + -y - 0.5f * h) + .followedBy (getTransform())); + } + } + + void resized() + { + const int x = 100; + int y = 4; + typeChooser->setBounds (x, y, 300, 24); + y += 28; + scaleSlider->setBounds (x, y, 300, 24); + y += 28; + angleSlider->setBounds (x, y, 300, 24); + y += 28; + xSlider->setBounds (x, y, 300, 24); + y += 28; + ySlider->setBounds (x, y, 300, 24); + y += 28; + opacitySlider->setBounds (x, y, 300, 24); + } + + void sliderValueChanged (Slider*) + { + repaint(); + } + + void comboBoxChanged (ComboBox*) + { + repaint(); + } + +private: + Path shape; + Image* image; + Drawable* drawable; + DrawableComposite* svgDrawable; + + ComboBox* typeChooser; + Slider* scaleSlider; + Slider* angleSlider; + Slider* xSlider; + Slider* ySlider; + Slider* opacitySlider; + + void generateRandomShape() + { + shape.startNewSubPath (randomNumber(), randomNumber()); + + for (int i = 0; i < 7; ++i) + { + shape.lineTo (randomNumber(), randomNumber()); + + shape.quadraticTo (randomNumber(), randomNumber(), + randomNumber(), randomNumber()); + } + + shape.closeSubPath(); + } + + void generateImage() + { + image = ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize); + } + + void generateDrawable() + { + // create a composite drawable object.. + DrawableComposite* dc = new DrawableComposite(); + drawable = dc; + + // ..add a paths drawable to it... + DrawablePath dp; + dp.setPath (shape); + + dp.setOutline (4.0f, Colours::blue); + + GradientBrush gb (ColourGradient (Colours::red.withAlpha (0.4f), -100.0f, -100.0f, + Colours::green.withAlpha (0.6f), 100.0f, 100.0f, false)); + + dp.setFillBrush (gb); + + dc->insertDrawable (dp); + + // ..add an image drawable.. + DrawableImage di; + di.setImage (image, false); + + dc->insertDrawable (di, AffineTransform::scale (0.3f, 0.8f)); + + // ..and a text object + DrawableText dt; + dt.setText (T("JUCE Drawables"), Font (30.0f, Font::bold)); + dt.setColour (Colours::green); + + dc->insertDrawable (dt, AffineTransform::translation (-80.0f, -20.0f) + .scaled (2.0f, 0.8f) + .rotated (-1.3f)); + } + + void generateSVGDrawable() + { + svgDrawable = 0; + + MemoryInputStream iconsFileStream (BinaryData::icons_zip, BinaryData::icons_zipSize, false); + ZipFile icons (&iconsFileStream, false); + + // Load a random SVG file from our embedded icons.zip file. + InputStream* svgFileStream + = icons.createStreamForEntry (Random::getSystemRandom().nextInt (icons.getNumEntries())); + + if (svgFileStream != 0) + { + Drawable* loadedSVG = Drawable::createFromImageDataStream (*svgFileStream); + + if (loadedSVG != 0) + { + // to make our icon the right size, we'll put it inside a DrawableComposite, and apply + // a transform to get it to the size we want. + + float x, y, w, h; + loadedSVG->getBounds (x, y, w, h); + const float scaleFactor = 300.0f / jmax (w, h); + + svgDrawable = new DrawableComposite(); + svgDrawable->insertDrawable (loadedSVG, AffineTransform::scale (scaleFactor, scaleFactor)); + } + + delete svgFileStream; + } + } + + const AffineTransform getTransform() const + { + return AffineTransform::rotation (float_Pi * 2.0f * (float) angleSlider->getValue()) + .scaled ((float) scaleSlider->getValue(), + (float) scaleSlider->getValue()) + .translated (getWidth() * 0.5f + (float) xSlider->getValue(), + getHeight() * 0.5f + (float) ySlider->getValue()); + } +}; + +Component* createPathsAndTransformsDemo() +{ + return new PathsAndTransformsDemo(); +} diff --git a/extras/juce demo/src/binarydata/QuickTimeDemo.cpp b/extras/juce demo/src/binarydata/QuickTimeDemo.cpp new file mode 100644 index 0000000000..eb22f6c846 --- /dev/null +++ b/extras/juce demo/src/binarydata/QuickTimeDemo.cpp @@ -0,0 +1,129 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + +#if JUCE_QUICKTIME && ! JUCE_LINUX + +//============================================================================== +// so that we can easily have two QT windows each with a file browser, wrap this up as a class.. +class QuickTimeWindowWithFileBrowser : public Component, + public FilenameComponentListener +{ +public: + QuickTimeWindowWithFileBrowser() + { + addAndMakeVisible (qtComp = new QuickTimeMovieComponent()); + + // and a file-chooser.. + addAndMakeVisible (fileChooser = new FilenameComponent (T("movie"), + File::nonexistent, + true, false, false, + T("*.*"), + String::empty, + T("(choose a video file to play)"))); + fileChooser->addListener (this); + fileChooser->setBrowseButtonText (T("browse")); + } + + ~QuickTimeWindowWithFileBrowser() + { + deleteAllChildren(); + } + + void resized() + { + qtComp->setBounds (0, 0, getWidth(), getHeight() - 30); + fileChooser->setBounds (0, getHeight() - 24, getWidth(), 24); + } + + void filenameComponentChanged (FilenameComponent*) + { + // this is called when the user changes the filename in the file chooser box + if (qtComp->loadMovie (fileChooser->getCurrentFile(), true)) + { + // loaded the file ok, so let's start it playing.. + + qtComp->play(); + } + else + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Couldn't load the file!"), + T("Sorry, QuickTime didn't manage to load that file!")); + } + } + +private: + QuickTimeMovieComponent* qtComp; + FilenameComponent* fileChooser; +}; + + +//============================================================================== +class QuickTimeDemo : public Component +{ +public: + //============================================================================== + QuickTimeDemo() + { + setName (T("QuickTime")); + + // add a movie component.. + addAndMakeVisible (qtComp1 = new QuickTimeWindowWithFileBrowser()); + addAndMakeVisible (qtComp2 = new QuickTimeWindowWithFileBrowser()); + } + + ~QuickTimeDemo() + { + deleteAllChildren(); + } + + void resized() + { + qtComp1->setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f); + qtComp2->setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f); + } + +private: + //============================================================================== + QuickTimeWindowWithFileBrowser* qtComp1; + QuickTimeWindowWithFileBrowser* qtComp2; +}; + + +//============================================================================== +Component* createQuickTimeDemo() +{ + return new QuickTimeDemo(); +} + +#endif diff --git a/extras/juce demo/src/binarydata/README - what this directory is for.txt b/extras/juce demo/src/binarydata/README - what this directory is for.txt new file mode 100644 index 0000000000..c884fa4f1c --- /dev/null +++ b/extras/juce demo/src/binarydata/README - what this directory is for.txt @@ -0,0 +1,7 @@ + +FYI.. + +To embed the files and things that the demo needs into its executable, +I've used my BinaryBuilder utility - the files in this directory are the +ones that get encoded into BinaryData.cpp and BinaryData.h, which get built +into the application. diff --git a/extras/juce demo/src/binarydata/TableDemo.cpp b/extras/juce demo/src/binarydata/TableDemo.cpp new file mode 100644 index 0000000000..5207b26df0 --- /dev/null +++ b/extras/juce demo/src/binarydata/TableDemo.cpp @@ -0,0 +1,329 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +/** + This class shows how to implement a TableListBoxModel to show in a TableListBox. +*/ +class TableDemoComponent : public Component, + public TableListBoxModel +{ +public: + //============================================================================== + TableDemoComponent() + : font (14.0f), + demoData (0) + { + // Load some data from an embedded XML file.. + loadData(); + + // Create our table component and add it to this component.. + addAndMakeVisible (table = new TableListBox (T("demo table"), this)); + + // give it a border + table->setColour (ListBox::outlineColourId, Colours::grey); + table->setOutlineThickness (1); + + // Add some columns to the table header, based on the column list in our database.. + forEachXmlChildElement (*columnList, columnXml) + { + table->getHeader()->addColumn (columnXml->getStringAttribute T("name"), + columnXml->getIntAttribute T("columnId"), + columnXml->getIntAttribute T("width"), + 50, 400, + TableHeaderComponent::defaultFlags); + } + + // we could now change some initial settings.. + table->getHeader()->setSortColumnId (1, true); // sort forwards by the ID column + table->getHeader()->setColumnVisible (7, false); // hide the "length" column until the user shows it + + // un-comment this line to have a go of stretch-to-fit mode + // table->getHeader()->setStretchToFitActive (true); + } + + ~TableDemoComponent() + { + deleteAllChildren(); + + delete demoData; + } + + //============================================================================== + // This is overloaded from TableListBoxModel, and must return the total number of rows in our table + int getNumRows() + { + return numRows; + } + + // This is overloaded from TableListBoxModel, and should fill in the background of the whole row + void paintRowBackground (Graphics& g, int rowNumber, int width, int height, bool rowIsSelected) + { + if (rowIsSelected) + g.fillAll (Colours::lightblue); + } + + // This is overloaded from TableListBoxModel, and must paint any cells that aren't using custom + // components. + void paintCell (Graphics& g, + int rowNumber, + int columnId, + int width, int height, + bool rowIsSelected) + { + g.setColour (Colours::black); + g.setFont (font); + + const XmlElement* rowElement = dataList->getChildElement (rowNumber); + + if (rowElement != 0) + { + const String text (rowElement->getStringAttribute (getAttributeNameForColumnId (columnId))); + + g.drawText (text, 2, 0, width - 4, height, Justification::centredLeft, true); + } + + g.setColour (Colours::black.withAlpha (0.2f)); + g.fillRect (width - 1, 0, 1, height); + } + + // This is overloaded from TableListBoxModel, and tells us that the user has clicked a table header + // to change the sort order. + void sortOrderChanged (int newSortColumnId, const bool isForwards) + { + if (newSortColumnId != 0) + { + DemoDataSorter sorter (getAttributeNameForColumnId (newSortColumnId), isForwards); + dataList->sortChildElements (sorter); + + table->updateContent(); + } + } + + // This is overloaded from TableListBoxModel, and must update any custom components that we're using + Component* refreshComponentForCell (int rowNumber, int columnId, bool isRowSelected, + Component* existingComponentToUpdate) + { + if (columnId == 5) // If it's the ratings column, we'll return our custom component.. + { + RatingColumnCustomComponent* ratingsBox = (RatingColumnCustomComponent*) existingComponentToUpdate; + + // If an existing component is being passed-in for updating, we'll re-use it, but + // if not, we'll have to create one. + if (ratingsBox == 0) + ratingsBox = new RatingColumnCustomComponent (*this); + + ratingsBox->setRowAndColumn (rowNumber, columnId); + + return ratingsBox; + } + else + { + // for any other column, just return 0, as we'll be painting these columns directly. + + jassert (existingComponentToUpdate == 0); + return 0; + } + } + + // This is overloaded from TableListBoxModel, and should choose the best width for the specified + // column. + int getColumnAutoSizeWidth (int columnId) + { + if (columnId == 5) + return 100; // (this is the ratings column, containing a custom component) + + int widest = 32; + + // find the widest bit of text in this column.. + for (int i = getNumRows(); --i >= 0;) + { + const XmlElement* rowElement = dataList->getChildElement (i); + + if (rowElement != 0) + { + const String text (rowElement->getStringAttribute (getAttributeNameForColumnId (columnId))); + + widest = jmax (widest, font.getStringWidth (text)); + } + } + + return widest + 8; + } + + // A couple of quick methods to set and get the "rating" value when the user + // changes the combo box + int getRating (const int rowNumber, const int columnId) const + { + return dataList->getChildElement (rowNumber)->getIntAttribute (T("Rating")); + } + + void setRating (const int rowNumber, const int columnId, const int newRating) + { + dataList->getChildElement (rowNumber)->setAttribute (T("Rating"), newRating); + } + + //============================================================================== + void resized() + { + // position our table with a gap around its edge + table->setBoundsInset (BorderSize (8)); + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + TableListBox* table; // the table component itself + Font font; + + XmlElement* demoData; // This is the XML document loaded from the embedded file "demo table data.xml" + XmlElement* columnList; // A pointer to the sub-node of demoData that contains the list of columns + XmlElement* dataList; // A pointer to the sub-node of demoData that contains the list of data rows + int numRows; // The number of rows of data we've got + + //============================================================================== + // This is a custom component containing a combo box, which we're going to put inside + // our table's "rating" column. + class RatingColumnCustomComponent : public Component, + public ComboBoxListener + { + public: + RatingColumnCustomComponent (TableDemoComponent& owner_) + : owner (owner_) + { + // just put a combo box inside this component + addAndMakeVisible (comboBox = new ComboBox (String::empty)); + comboBox->addItem (T("fab"), 1); + comboBox->addItem (T("groovy"), 2); + comboBox->addItem (T("hep"), 3); + comboBox->addItem (T("neat"), 4); + comboBox->addItem (T("wild"), 5); + comboBox->addItem (T("swingin"), 6); + comboBox->addItem (T("mad for it"), 7); + + // when the combo is changed, we'll get a callback. + comboBox->addListener (this); + comboBox->setWantsKeyboardFocus (false); + } + + ~RatingColumnCustomComponent() + { + deleteAllChildren(); + } + + void resized() + { + comboBox->setBoundsInset (BorderSize (2)); + } + + // Our demo code will call this when we may need to update our contents + void setRowAndColumn (const int newRow, const int newColumn) + { + row = newRow; + columnId = newColumn; + comboBox->setSelectedId (owner.getRating (row, columnId), true); + } + + void comboBoxChanged (ComboBox* comboBoxThatHasChanged) + { + owner.setRating (row, columnId, comboBox->getSelectedId()); + } + + private: + TableDemoComponent& owner; + ComboBox* comboBox; + int row, columnId; + }; + + //============================================================================== + // A comparator used to sort our data when the user clicks a column header + class DemoDataSorter + { + public: + DemoDataSorter (const String attributeToSort_, bool forwards) + : attributeToSort (attributeToSort_), + direction (forwards ? 1 : -1) + { + } + + int compareElements (XmlElement* first, XmlElement* second) const + { + int result = first->getStringAttribute (attributeToSort) + .compareLexicographically (second->getStringAttribute (attributeToSort)); + + if (result == 0) + result = first->getStringAttribute (T("ID")) + .compareLexicographically (second->getStringAttribute (T("ID"))); + + return direction * result; + } + + private: + const String attributeToSort; + const int direction; + }; + + //============================================================================== + // this loads the embedded database XML file into memory + void loadData() + { + XmlDocument dataDoc (String ((const char*) BinaryData::demo_table_data_xml)); + demoData = dataDoc.getDocumentElement(); + + dataList = demoData->getChildByName (T("DATA")); + columnList = demoData->getChildByName (T("COLUMNS")); + + numRows = dataList->getNumChildElements(); + } + + // (a utility method to search our XML for the attribute that matches a column ID) + const String getAttributeNameForColumnId (const int columnId) const + { + forEachXmlChildElement (*columnList, columnXml) + { + if (columnXml->getIntAttribute T("columnId") == columnId) + return columnXml->getStringAttribute T("name"); + } + + return String::empty; + } +}; + + +//============================================================================== +Component* createTableDemo() +{ + return new TableDemoComponent(); +} diff --git a/extras/juce demo/src/binarydata/ThreadingDemo.cpp b/extras/juce demo/src/binarydata/ThreadingDemo.cpp new file mode 100644 index 0000000000..361203a1b3 --- /dev/null +++ b/extras/juce demo/src/binarydata/ThreadingDemo.cpp @@ -0,0 +1,354 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class BouncingBallComp : public Component, + public AsyncUpdater +{ + float x, y, size, dx, dy, w, h, parentWidth, parentHeight; + float innerX, innerY; + Colour colour; + CriticalSection lock; + int threadId; + +public: + BouncingBallComp() + { + x = Random::getSystemRandom().nextFloat() * 200.0f; + y = Random::getSystemRandom().nextFloat() * 200.0f; + parentWidth = 50; + parentHeight = 50; + innerX = 0; + innerY = 0; + threadId = 0; + + const float speed = 5.0f; // give each ball a fixed speed so we can + // see the effects of thread priority on how fast + // they actually go. + const float angle = Random::getSystemRandom().nextFloat() * float_Pi * 2.0f; + + dx = sinf (angle) * speed; + dy = cosf (angle) * speed; + + size = Random::getSystemRandom().nextFloat() * 30.0f + 30.0f; + + colour = Colour (Random::getSystemRandom().nextInt()) + .withAlpha (0.5f) + .withBrightness (0.7f); + } + + ~BouncingBallComp() + { + } + + void paint (Graphics& g) + { + g.setColour (colour); + g.fillEllipse (innerX, innerY, size, size); + + g.setColour (Colours::black); + g.setFont (10.0f); + g.drawText (String::toHexString (threadId), 0, 0, getWidth(), getHeight(), Justification::centred, false); + } + + void parentSizeChanged() + { + parentWidth = getParentWidth() - size; + parentHeight = getParentHeight() - size; + } + + void handleAsyncUpdate() + { + const ScopedLock sl (lock); + + setBounds (((int) x) - 2, + ((int) y) - 2, + ((int) size) + 4, + ((int) size) + 4); + + innerX = x - getX(); + innerY = y - getY(); + + repaint(); + } + + void moveBall() + { + const ScopedLock sl (lock); + + threadId = Thread::getCurrentThreadId(); // this is so the component can print the thread ID inside the ball + + x += dx; + y += dy; + + if (x < 0) + dx = fabsf (dx); + + if (x > parentWidth) + dx = -fabsf (dx); + + if (y < 0) + dy = fabsf (dy); + + if (y > parentHeight) + dy = -fabsf (dy); + + // this is called on a background thread, so we don't want to call + // any UI code from here - instead we'll trigger an event that will update + // the component's position later. This is a safe way to avoid deadlocks + triggerAsyncUpdate(); + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +class DemoThread : public BouncingBallComp, + public Thread +{ + int interval; + +public: + DemoThread() + : Thread (T("Juce Demo Thread")) + { + interval = Random::getSystemRandom().nextInt (50) + 6; + + // give the threads a random priority, so some will move more + // smoothly than others.. + startThread (Random::getSystemRandom().nextInt (3) + 3); + } + + ~DemoThread() + { + // allow the thread 2 seconds to stop cleanly - should be plenty of time. + stopThread (2000); + } + + void run() + { + // this is the code that runs this thread - we'll loop continuously, + // updating the co-ordinates of our blob. + + // threadShouldExit() returns true when the stopThread() method has been + // called, so we should check it often, and exit as soon as it gets flagged. + while (! threadShouldExit()) + { + moveBall(); + + // sleep a bit so the threads don't all grind the CPU to a halt.. + wait (interval); + } + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +class DemoThreadPoolJob : public BouncingBallComp, + public ThreadPoolJob +{ +public: + DemoThreadPoolJob() + : ThreadPoolJob (T("Demo Threadpool Job")) + { + } + + ~DemoThreadPoolJob() + { + } + + JobStatus runJob() + { + // this is the code that runs this job. It'll be repeatedly called until we return + // jobHasFinished instead of jobNeedsRunningAgain. + + moveBall(); + Thread::sleep (30); + + return jobNeedsRunningAgain; + } + + void removedFromQueue() + { + // This is called to tell us that our job has been removed from the pool. + // In this case there's no need to do anything here. + } + + juce_UseDebuggingNewOperator +}; + +//============================================================================== +class ThreadingDemo : public Component, + public Timer, + public ButtonListener +{ + bool isUsingPool; + ThreadPool pool; + TextButton* controlButton; + +public: + //============================================================================== + ThreadingDemo() + : pool (3) + { + isUsingPool = false; + + setName (T("Multithreading")); + + setOpaque (true); + } + + ~ThreadingDemo() + { + pool.removeAllJobs (true, 2000); + + deleteAllChildren(); + } + + // this gets called when a component is added or removed from a parent component. + void parentHierarchyChanged() + { + // we'll use this as an opportunity to start and stop the threads, so that + // we don't leave them going when the component's not actually visible. + stopTimer(); + + pool.removeAllJobs (true, 4000); + deleteAllChildren(); + + addAndMakeVisible (controlButton = new TextButton (T("Thread type"))); + controlButton->changeWidthToFitText (20); + controlButton->setTopLeftPosition (20, 20); + controlButton->setTriggeredOnMouseDown (true); + controlButton->setAlwaysOnTop (true); + controlButton->addButtonListener (this); + + if (isShowing()) + { + while (getNumChildComponents() < 5) + addABall(); + + startTimer (2000); + } + } + + void paint (Graphics& g) + { + g.fillAll (Colours::white); + } + + void setUsingPool (bool usePool) + { + isUsingPool = usePool; + parentHierarchyChanged(); // resets everything + } + + void addABall() + { + if (isUsingPool) + { + DemoThreadPoolJob* newComp = new DemoThreadPoolJob(); + addAndMakeVisible (newComp); + newComp->parentSizeChanged(); + + pool.addJob (newComp); + } + else + { + DemoThread* newComp = new DemoThread(); + addAndMakeVisible (newComp); + newComp->parentSizeChanged(); + } + } + + void removeABall() + { + if (isUsingPool) + { + ThreadPoolJob* jobToRemove = pool.getJob (Random::getSystemRandom().nextInt (pool.getNumJobs())); + + if (jobToRemove != 0) + { + pool.removeJob (jobToRemove, true, 4000); + delete jobToRemove; + } + } + else + { + if (getNumChildComponents() > 1) + { + Component* ball = getChildComponent (1 + Random::getSystemRandom().nextInt (getNumChildComponents() - 1)); + + if (dynamic_cast (ball) == 0) // don't delete our button! + delete ball; + } + } + } + + void timerCallback() + { + if (Random::getSystemRandom().nextBool()) + { + if (getNumChildComponents() <= 10) + addABall(); + } + else + { + if (getNumChildComponents() > 3) + removeABall(); + } + } + + void buttonClicked (Button* button) + { + PopupMenu m; + m.addItem (1, T("Use one thread per ball"), true, ! isUsingPool); + m.addItem (2, T("Use a thread pool"), true, isUsingPool); + + const int res = m.showAt (button); + + if (res != 0) + setUsingPool (res == 2); + } +}; + + + +//============================================================================== +Component* createThreadingDemo() +{ + return new ThreadingDemo(); +} diff --git a/extras/juce demo/src/binarydata/TreeViewDemo.cpp b/extras/juce demo/src/binarydata/TreeViewDemo.cpp new file mode 100644 index 0000000000..d0b53a9373 --- /dev/null +++ b/extras/juce demo/src/binarydata/TreeViewDemo.cpp @@ -0,0 +1,184 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class TreeViewDemoItem : public TreeViewItem +{ + XmlElement* xml; + +public: + TreeViewDemoItem (XmlElement* const xml_) + : xml (xml_) + { + } + + ~TreeViewDemoItem() + { + } + + int getItemWidth() const + { + return xml->getIntAttribute (T("width"), -1); + } + + const String getUniqueName() const + { + if (xml != 0) + return xml->getTagName(); + else + return String::empty; + } + + bool mightContainSubItems() + { + return xml != 0 + && xml->getFirstChildElement() != 0; + } + + void paintItem (Graphics& g, int width, int height) + { + if (xml != 0) + { + // if this item is selected, fill it with a background colour.. + if (isSelected()) + g.fillAll (Colours::blue.withAlpha (0.3f)); + + // use a "colour" attribute in the xml tag for this node to set the text colour.. + g.setColour (Colour (xml->getStringAttribute (T("colour"), T("ff000000")).getHexValue32())); + + g.setFont (height * 0.7f); + + // draw the xml element's tag name.. + g.drawText (xml->getTagName(), + 4, 0, width - 4, height, + Justification::centredLeft, true); + } + } + + void itemOpennessChanged (bool isNowOpen) + { + if (isNowOpen) + { + // if we've not already done so, we'll now add the tree's sub-items. You could + // also choose to delete the existing ones and refresh them if that's more suitable + // in your app. + if (getNumSubItems() == 0) + { + // create and add sub-items to this node of the tree, corresponding to + // each sub-element in the XML.. + + if (xml != 0) + { + forEachXmlChildElement (*xml, child) + { + addSubItem (new TreeViewDemoItem (child)); + } + } + } + } + else + { + // in this case, we'll leave any sub-items in the tree when the node gets closed, + // though you could choose to delete them if that's more appropriate for + // your application. + } + } + + const String getDragSourceDescription() + { + return T("TreeView Items"); + } +}; + +//============================================================================== +class TreeViewDemo : public Component, + public DragAndDropContainer +{ + XmlElement* treeXml; + + TreeViewItem* rootItem; + TreeView* treeView; + +public: + //============================================================================== + TreeViewDemo() + { + setName (T("Tree Views")); + + const String treeXmlString (BinaryData::treedemo_xml); + + XmlDocument parser (treeXmlString); + + treeXml = parser.getDocumentElement(); + + rootItem = new TreeViewDemoItem (treeXml); + rootItem->setOpen (true); + + addAndMakeVisible (treeView = new TreeView()); + + treeView->setRootItem (rootItem); + } + + ~TreeViewDemo() + { + deleteAllChildren(); + + if (rootItem != 0) + delete rootItem; + + if (treeXml != 0) + delete treeXml; + } + + void paint (Graphics& g) + { + g.setColour (Colours::grey); + g.drawRect (treeView->getX(), treeView->getY(), + treeView->getWidth(), treeView->getHeight()); + } + + void resized() + { + treeView->setBoundsRelative (0.05f, 0.05f, 0.9f, 0.9f); + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +Component* createTreeViewDemo() +{ + return new TreeViewDemo(); +} diff --git a/extras/juce demo/src/binarydata/WidgetsDemo.cpp b/extras/juce demo/src/binarydata/WidgetsDemo.cpp new file mode 100644 index 0000000000..62d69dbe30 --- /dev/null +++ b/extras/juce demo/src/binarydata/WidgetsDemo.cpp @@ -0,0 +1,1335 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class BouncingBallComponent : public Component, + public Timer +{ + Colour colour; + float x, y, dx, dy; + +public: + BouncingBallComponent() + { + x = Random::getSystemRandom().nextFloat() * 100.0f; + y = Random::getSystemRandom().nextFloat() * 100.0f; + + dx = Random::getSystemRandom().nextFloat() * 8.0f - 4.0f; + dy = Random::getSystemRandom().nextFloat() * 8.0f - 4.0f; + + colour = Colour (Random::getSystemRandom().nextInt()) + .withAlpha (0.5f) + .withBrightness (0.7f); + + int size = 10 + Random::getSystemRandom().nextInt (30); + setSize (size, size); + + startTimer (60); + } + + ~BouncingBallComponent() + { + } + + void paint (Graphics& g) + { + g.setColour (colour); + g.fillEllipse (x - getX(), y - getY(), getWidth() - 2.0f, getHeight() - 2.0f); + } + + void timerCallback() + { + x += dx; + y += dy; + + if (x < 0) + dx = fabsf (dx); + + if (x > getParentWidth()) + dx = -fabsf (dx); + + if (y < 0) + dy = fabsf (dy); + + if (y > getParentHeight()) + dy = -fabsf (dy); + + setTopLeftPosition ((int) x, (int) y); + } + + bool hitTest (int x, int y) + { + return false; + } +}; + +//============================================================================== +class DragOntoDesktopDemoComp : public Component +{ + Component* parent; + ComponentDragger dragger; + +public: + DragOntoDesktopDemoComp (Component* p) + : parent (p) + { + // show off semi-transparency if it's supported by the current OS. + setOpaque (! Desktop::canUseSemiTransparentWindows()); + + for (int i = 3; --i >= 0;) + addAndMakeVisible (new BouncingBallComponent()); + } + + ~DragOntoDesktopDemoComp() + { + deleteAllChildren(); + } + + void mouseDown (const MouseEvent& e) + { + dragger.startDraggingComponent (this, 0); + } + + void mouseDrag (const MouseEvent& e) + { + if (! parent->isValidComponent()) + { + delete this; + } + else + { + MouseEvent e2 (e.getEventRelativeTo (parent)); + + // if the mouse is inside the parent component, we'll make that the + // parent - otherwise, we'll put this comp on the desktop. + if (e2.x >= 0 && e2.y >= 0 && e2.x < parent->getWidth() && e2.y < parent->getHeight()) + { + // re-add this component to a parent component, which will + // remove it from the desktop.. + parent->addChildComponent (this); + } + else + { + // add the component to the desktop, which will remove it + // from its current parent component.. + addToDesktop (ComponentPeer::windowIsTemporary); + } + + dragger.dragComponent (this, e); + } + } + + void paint (Graphics& g) + { + if (isOpaque()) + g.fillAll (Colours::white); + else + g.fillAll (Colours::blue.withAlpha (0.2f)); + + String desc (T("drag this box onto the desktop to show how the same component can move from being lightweight to being a separate window")); + + g.setFont (15.0f); + g.setColour (Colours::black); + g.drawFittedText (desc, 4, 0, getWidth() - 8, getHeight(), Justification::horizontallyJustified, 5); + + g.drawRect (0, 0, getWidth(), getHeight()); + } +}; + +//============================================================================== +class CustomMenuComponent : public PopupMenuCustomComponent, + public Timer +{ + int blobX, blobY; + +public: + CustomMenuComponent() + { + // set off a timer to move a blob around on this component every + // 300 milliseconds - see the timerCallback() method. + startTimer (300); + } + + ~CustomMenuComponent() + { + } + + void getIdealSize (int& idealWidth, + int& idealHeight) + { + // tells the menu how big we'd like to be.. + idealWidth = 200; + idealHeight = 60; + } + + void paint (Graphics& g) + { + g.fillAll (Colours::yellow.withAlpha (0.3f)); + + g.setColour (Colours::pink); + g.fillEllipse ((float) blobX, (float) blobY, 30.0f, 40.0f); + + g.setFont (14.0f, Font::italic); + g.setColour (Colours::black); + + g.drawFittedText (T("this is a customised menu item (also demonstrating the Timer class)..."), + 4, 0, getWidth() - 8, getHeight(), + Justification::centred, 3); + } + + void timerCallback() + { + blobX = Random::getSystemRandom().nextInt (getWidth()); + blobY = Random::getSystemRandom().nextInt (getHeight()); + repaint(); + } +}; + +//============================================================================== +/** To demonstrate how sliders can have custom snapping applied to their values, + this simple class snaps the value to 50 if it comes near. +*/ +class SnappingSlider : public Slider +{ +public: + SnappingSlider (const String& name) + : Slider (name) + { + } + + double snapValue (double attemptedValue, const bool userIsDragging) + { + if (! userIsDragging) + return attemptedValue; // if they're entering the value in the text-box, don't mess with it. + + if (attemptedValue > 40 && attemptedValue < 60) + return 50.0; + else + return attemptedValue; + } +}; + +/** A TextButton that pops up a colour chooser to change its colours. */ +class ColourChangeButton : public TextButton, + public ChangeListener +{ +public: + ColourChangeButton() + : TextButton (T("click to change colour...")) + { + setSize (10, 24); + changeWidthToFitText(); + } + + ~ColourChangeButton() + { + } + + void clicked() + { + // create two colour selector components for our background and + // text colour.. + ColourSelector colourSelector1; + colourSelector1.setName (T("background")); + colourSelector1.setCurrentColour (findColour (TextButton::buttonColourId)); + colourSelector1.addChangeListener (this); + + ColourSelector colourSelector2; + colourSelector2.setName (T("text")); + colourSelector2.setCurrentColour (findColour (TextButton::textColourId)); + colourSelector2.addChangeListener (this); + + // and add the selectors as custom menu items to a PopupMenu, putting + // them in two different sub-menus.. + PopupMenu m, sub1, sub2; + + sub1.addCustomItem (1234, &colourSelector1, 300, 300, false); + m.addSubMenu (T("background colour"), sub1); + + sub2.addCustomItem (1234, &colourSelector2, 300, 300, false); + m.addSubMenu (T("text colour"), sub2); + + // and show the menu (modally).. + m.showAt (this); + } + + void changeListenerCallback (void* source) + { + ColourSelector* cs = (ColourSelector*) source; + + if (cs->getName() == T("text")) + setColour (TextButton::textColourId, cs->getCurrentColour()); + else + setColour (TextButton::buttonColourId, cs->getCurrentColour()); + } +}; + +//============================================================================== +// just a component that deletes all its children, to use for the tabbed pages to avoid +// memory leaks when they're deleted +class DemoPageComp : public Component +{ +public: + DemoPageComp() + { + } + + ~DemoPageComp() + { + deleteAllChildren(); + } +}; + +//============================================================================== +static Component* createSlidersPage() +{ + DemoPageComp* page = new DemoPageComp(); + + const int numSliders = 11; + Slider* sliders [numSliders]; + + int i; + for (i = 0; i < numSliders; ++i) + { + if (i == 2) + page->addAndMakeVisible (sliders[i] = new SnappingSlider (T("slider"))); + else + page->addAndMakeVisible (sliders[i] = new Slider (T("slider"))); + + sliders[i]->setRange (0.0, 100.0, 0.1); + sliders[i]->setPopupMenuEnabled (true); + sliders[i]->setValue (Random::getSystemRandom().nextDouble() * 100.0, false, false); + } + + sliders[0]->setSliderStyle (Slider::LinearVertical); + sliders[0]->setTextBoxStyle (Slider::TextBoxBelow, false, 100, 20); + sliders[0]->setBounds (10, 25, 70, 200); + sliders[0]->setDoubleClickReturnValue (true, 50.0); // double-clicking this slider will set it to 50.0 + sliders[0]->setTextValueSuffix (T(" units")); + + sliders[1]->setSliderStyle (Slider::LinearVertical); + sliders[1]->setVelocityBasedMode (true); + sliders[1]->setSkewFactor (0.5); + sliders[1]->setTextBoxStyle (Slider::TextBoxAbove, true, 100, 20); + sliders[1]->setBounds (85, 25, 70, 200); + sliders[1]->setTextValueSuffix (T(" rels")); + + sliders[2]->setSliderStyle (Slider::LinearHorizontal); + sliders[2]->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + sliders[2]->setBounds (180, 35, 150, 20); + + sliders[3]->setSliderStyle (Slider::LinearHorizontal); + sliders[3]->setTextBoxStyle (Slider::NoTextBox, false, 0, 0); + sliders[3]->setBounds (180, 65, 150, 20); + sliders[3]->setPopupDisplayEnabled (true, page); + sliders[3]->setTextValueSuffix (T(" nuns required to change a lightbulb")); + + sliders[4]->setSliderStyle (Slider::IncDecButtons); + sliders[4]->setTextBoxStyle (Slider::TextBoxLeft, false, 50, 20); + sliders[4]->setBounds (180, 105, 100, 20); + sliders[4]->setIncDecButtonsMode (Slider::incDecButtonsDraggable_Vertical); + + sliders[5]->setSliderStyle (Slider::Rotary); + sliders[5]->setRotaryParameters (float_Pi * 1.2f, float_Pi * 2.8f, false); + sliders[5]->setTextBoxStyle (Slider::TextBoxRight, false, 70, 20); + sliders[5]->setBounds (190, 145, 120, 40); + sliders[5]->setTextValueSuffix (T(" mm")); + + sliders[6]->setSliderStyle (Slider::LinearBar); + sliders[6]->setBounds (180, 195, 100, 30); + sliders[6]->setTextValueSuffix (T(" gallons")); + + sliders[7]->setSliderStyle (Slider::TwoValueHorizontal); + sliders[7]->setBounds (360, 20, 160, 40); + + sliders[8]->setSliderStyle (Slider::TwoValueVertical); + sliders[8]->setBounds (360, 110, 40, 160); + + sliders[9]->setSliderStyle (Slider::ThreeValueHorizontal); + sliders[9]->setBounds (360, 70, 160, 40); + + sliders[10]->setSliderStyle (Slider::ThreeValueVertical); + sliders[10]->setBounds (440, 110, 40, 160); + + for (i = 7; i <= 10; ++i) + { + sliders[i]->setTextBoxStyle (Slider::NoTextBox, false, 0, 0); + sliders[i]->setMinValue (Random::getSystemRandom().nextDouble() * 100.0, false, false); + sliders[i]->setMaxValue (Random::getSystemRandom().nextDouble() * 100.0, false, false); + sliders[i]->setPopupDisplayEnabled (true, page); + } + + Label* label = new Label (T("hint"), T("Try right-clicking on a slider for an options menu. \n\nAlso, holding down CTRL while dragging will turn on a slider's velocity-sensitive mode")); + label->setBounds (20, 245, 350, 150); + page->addAndMakeVisible (label); + + return page; +} + +//============================================================================== +static Component* createRadioButtonPage() +{ + DemoPageComp* page = new DemoPageComp(); + + GroupComponent* group = new GroupComponent (T("group"), T("radio buttons")); + group->setBounds (20, 20, 220, 140); + page->addAndMakeVisible (group); + + int i; + for (i = 0; i < 4; ++i) + { + ToggleButton* tb = new ToggleButton (T("radio button #") + String (i + 1)); + page->addAndMakeVisible (tb); + tb->setRadioGroupId (1234); + tb->setBounds (45, 46 + i * 22, 180, 22); + tb->setTooltip (T("a set of mutually-exclusive radio buttons")); + + if (i == 0) + tb->setToggleState (true, false); + } + + for (i = 0; i < 4; ++i) + { + DrawablePath normal, over; + + Path p; + p.addStar (0.0f, 0.0f, i + 5, 20.0f, 50.0f, -0.2f); + normal.setPath (p); + normal.setSolidFill (Colours::lightblue); + normal.setOutline (4.0f, Colours::black); + + over.setPath (p); + over.setSolidFill (Colours::blue); + over.setOutline (4.0f, Colours::black); + + DrawableButton* db = new DrawableButton (String (i + 5) + T(" points"), DrawableButton::ImageAboveTextLabel); + db->setImages (&normal, &over, 0); + + page->addAndMakeVisible (db); + db->setClickingTogglesState (true); + db->setRadioGroupId (23456); + + const int buttonSize = 50; + db->setBounds (25 + i * buttonSize, 180, buttonSize, buttonSize); + + if (i == 0) + db->setToggleState (true, false); + } + + for (i = 0; i < 4; ++i) + { + TextButton* tb = new TextButton (T("button ") + String (i + 1)); + + page->addAndMakeVisible (tb); + tb->setClickingTogglesState (true); + tb->setRadioGroupId (34567); + tb->setColour (TextButton::buttonColourId, Colours::white); + tb->setColour (TextButton::buttonOnColourId, Colours::blueviolet.brighter()); + + tb->setBounds (20 + i * 55, 260, 55, 24); + tb->setConnectedEdges (((i != 0) ? Button::ConnectedOnLeft : 0) + | ((i != 3) ? Button::ConnectedOnRight : 0)); + + if (i == 0) + tb->setToggleState (true, false); + } + + return page; +} + +//============================================================================== +class ButtonsPage : public Component, + public ButtonListener +{ +public: + ButtonsPage (ButtonListener* buttonListener) + { + //============================================================================== + // create some drawables to use for our drawable buttons... + DrawablePath normal, over; + + Path p; + p.addStar (0.0f, 0.0f, 5, 20.0f, 50.0f, 0.2f); + normal.setPath (p); + normal.setSolidFill (Colours::red); + + p.clear(); + p.addStar (0.0f, 0.0f, 7, 30.0f, 50.0f, 0.0f); + over.setPath (p); + over.setSolidFill (Colours::pink); + over.setOutline (5.0f, Colours::black); + + DrawableImage down; + down.setImage (ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize), true); + down.setOverlayColour (Colours::black.withAlpha (0.3f)); + + //============================================================================== + // create an image-above-text button from these drawables.. + DrawableButton* db = new DrawableButton (T("Button 1"), DrawableButton::ImageAboveTextLabel); + db->setImages (&normal, &over, &down); + + addAndMakeVisible (db); + db->setBounds (10, 30, 80, 80); + db->setTooltip (T("this is a DrawableButton with a label")); + + //============================================================================== + // create an image-only button from these drawables.. + db = new DrawableButton (T("Button 2"), DrawableButton::ImageFitted); + db->setImages (&normal, &over, &down); + db->setClickingTogglesState (true); + + addAndMakeVisible (db); + db->setBounds (90, 30, 80, 80); + db->setTooltip (T("this is an image-only DrawableButton")); + db->addButtonListener (buttonListener); + + //============================================================================== + // create an image-on-button-shape button from the same drawables.. + db = new DrawableButton (T("Button 3"), DrawableButton::ImageOnButtonBackground); + db->setImages (&normal, 0, 0); + + addAndMakeVisible (db); + db->setBounds (200, 30, 110, 25); + db->setTooltip (T("this is a DrawableButton on a standard button background")); + + //============================================================================== + db = new DrawableButton (T("Button 4"), DrawableButton::ImageOnButtonBackground); + db->setImages (&normal, &over, &down); + db->setClickingTogglesState (true); + db->setBackgroundColours (Colours::white, Colours::yellow); + + addAndMakeVisible (db); + db->setBounds (200, 70, 50, 50); + db->setTooltip (T("this is a DrawableButton on a standard button background")); + db->addButtonListener (buttonListener); + + //============================================================================== + HyperlinkButton* hyperlink + = new HyperlinkButton (T("this is a HyperlinkButton"), + URL (T("http://www.rawmaterialsoftware.com/juce"))); + + hyperlink->setBounds (10, 130, 200, 24); + addAndMakeVisible (hyperlink); + + //============================================================================== + ImageButton* imageButton = new ImageButton (T("imagebutton")); + addAndMakeVisible (imageButton); + + Image* juceImage = ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize); + ImageCache::incReferenceCount (juceImage); + ImageCache::incReferenceCount (juceImage); + + imageButton->setImages (true, true, true, + juceImage, 0.7f, Colours::transparentBlack, + juceImage, 1.0f, Colours::transparentBlack, + juceImage, 1.0f, Colours::pink.withAlpha (0.8f), + 0.5f); + + imageButton->setTopLeftPosition (10, 160); + imageButton->setTooltip (T("image button - showing alpha-channel hit-testing and colour overlay when clicked")); + + //============================================================================== + ColourChangeButton* colourChangeButton = new ColourChangeButton(); + addAndMakeVisible (colourChangeButton); + colourChangeButton->setTopLeftPosition (350, 30); + + //============================================================================== + animateButton = new TextButton (T("click to animate...")); + addAndMakeVisible (animateButton); + animateButton->changeWidthToFitText (24); + animateButton->setTopLeftPosition (350, 70); + animateButton->addButtonListener (this); + } + + ~ButtonsPage() + { + deleteAllChildren(); + } + + void buttonClicked (Button*) + { + for (int i = getNumChildComponents(); --i >= 0;) + { + if (getChildComponent (i) != animateButton) + { + animator.animateComponent (getChildComponent (i), + Rectangle (Random::getSystemRandom().nextInt (getWidth() / 2), + Random::getSystemRandom().nextInt (getHeight() / 2), + 60 + Random::getSystemRandom().nextInt (getWidth() / 3), + 16 + Random::getSystemRandom().nextInt (getHeight() / 6)), + 500 + Random::getSystemRandom().nextInt (2000), + Random::getSystemRandom().nextDouble(), + Random::getSystemRandom().nextDouble()); + } + } + } + +private: + TextButton* animateButton; + ComponentAnimator animator; +}; + + +//============================================================================== +static Component* createMiscPage() +{ + DemoPageComp* page = new DemoPageComp(); + + TextEditor* textEditor = new TextEditor(); + page->addAndMakeVisible (textEditor); + textEditor->setBounds (10, 25, 200, 24); + textEditor->setText (T("single-line text box")); + + textEditor = new TextEditor (T("password"), (tchar) 0x2022); + page->addAndMakeVisible (textEditor); + textEditor->setBounds (10, 55, 200, 24); + textEditor->setText (T("password")); + + //============================================================================== + ComboBox* comboBox = new ComboBox (T("combo")); + page->addAndMakeVisible (comboBox); + comboBox->setBounds (300, 25, 200, 24); + comboBox->setEditableText (true); + comboBox->setJustificationType (Justification::centred); + + int i; + for (i = 1; i < 100; ++i) + comboBox->addItem (T("combo box item ") + String (i), i); + + comboBox->setSelectedId (1); + + DragOntoDesktopDemoComp* d = new DragOntoDesktopDemoComp (page); + page->addAndMakeVisible (d); + d->setBounds (20, 100, 200, 80); + + return page; +} + +//============================================================================== +class ToolbarDemoComp : public Component, + public SliderListener, + public ButtonListener +{ +public: + ToolbarDemoComp (ApplicationCommandManager* commandManager) + { + // Create and add the toolbar... + addAndMakeVisible (toolbar = new Toolbar()); + + // And use our item factory to add a set of default icons to it... + toolbar->addDefaultItems (factory); + + // Now we'll just create the other sliders and buttons on the demo page, which adjust + // the toolbar's properties... + Label* info = new Label (String::empty, + "As well as showing off toolbars, this demo illustrates how to store " + "a set of SVG files in a Zip file, embed that in your application, and read " + "them back in at runtime.\n\nThe icon images here are taken from the open-source " + "Tango icon project."); + + addAndMakeVisible (info); + info->setJustificationType (Justification::topLeft); + info->setBounds (80, 80, 450, 100); + info->setInterceptsMouseClicks (false, false); + + addAndMakeVisible (depthSlider = new Slider (T("toolbar depth:"))); + depthSlider->setRange (10.0, 200.0, 1.0); + depthSlider->setValue (50, false); + depthSlider->setSliderStyle (Slider::LinearHorizontal); + depthSlider->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + depthSlider->addListener (this); + depthSlider->setBounds (80, 210, 300, 22); + (new Label (depthSlider->getName(), depthSlider->getName()))->attachToComponent (depthSlider, false); + + addAndMakeVisible (orientationButton = new TextButton (T("vertical/horizontal"))); + orientationButton->addButtonListener (this); + orientationButton->changeWidthToFitText (22); + orientationButton->setTopLeftPosition (depthSlider->getX(), depthSlider->getBottom() + 20); + + addAndMakeVisible (customiseButton = new TextButton (T("customise..."))); + customiseButton->addButtonListener (this); + customiseButton->changeWidthToFitText (22); + customiseButton->setTopLeftPosition (orientationButton->getRight() + 20, orientationButton->getY()); + } + + ~ToolbarDemoComp() + { + deleteAllChildren(); + } + + void resized() + { + if (toolbar->isVertical()) + toolbar->setBounds (0, 0, (int) depthSlider->getValue(), getHeight()); + else + toolbar->setBounds (0, 0, getWidth(), (int) depthSlider->getValue()); + } + + void sliderValueChanged (Slider* slider) + { + resized(); + } + + void buttonClicked (Button* button) + { + if (button == orientationButton) + { + toolbar->setVertical (! toolbar->isVertical()); + resized(); + } + else if (button == customiseButton) + { + toolbar->showCustomisationDialog (factory); + } + } + +private: + Toolbar* toolbar; + Slider* depthSlider; + TextButton* orientationButton; + TextButton* customiseButton; + + //============================================================================== + class DemoToolbarItemFactory : public ToolbarItemFactory + { + public: + DemoToolbarItemFactory() {} + ~DemoToolbarItemFactory() {} + + //============================================================================== + // Each type of item a toolbar can contain must be given a unique ID. These + // are the ones we'll use in this demo. + enum DemoToolbarItemIds + { + doc_new = 1, + doc_open = 2, + doc_save = 3, + doc_saveAs = 4, + edit_copy = 5, + edit_cut = 6, + edit_paste = 7, + juceLogoButton = 8, + customComboBox = 9 + }; + + void getAllToolbarItemIds (Array & ids) + { + // This returns the complete list of all item IDs that are allowed to + // go in our toolbar. Any items you might want to add must be listed here. The + // order in which they are listed will be used by the toolbar customisation panel. + + ids.add (doc_new); + ids.add (doc_open); + ids.add (doc_save); + ids.add (doc_saveAs); + ids.add (edit_copy); + ids.add (edit_cut); + ids.add (edit_paste); + ids.add (juceLogoButton); + ids.add (customComboBox); + + // If you're going to use separators, then they must also be added explicitly + // to the list. + ids.add (separatorBarId); + ids.add (spacerId); + ids.add (flexibleSpacerId); + } + + void getDefaultItemSet (Array & ids) + { + // This returns an ordered list of the set of items that make up a + // toolbar's default set. Not all items need to be on this list, and + // items can appear multiple times (e.g. the separators used here). + ids.add (doc_new); + ids.add (doc_open); + ids.add (doc_save); + ids.add (doc_saveAs); + ids.add (spacerId); + ids.add (separatorBarId); + ids.add (edit_copy); + ids.add (edit_cut); + ids.add (edit_paste); + ids.add (separatorBarId); + ids.add (flexibleSpacerId); + ids.add (customComboBox); + ids.add (flexibleSpacerId); + ids.add (separatorBarId); + ids.add (juceLogoButton); + } + + ToolbarItemComponent* createItem (const int itemId) + { + switch (itemId) + { + case doc_new: + return createButtonFromZipFileSVG (itemId, T("new"), T("document-new.svg")); + + case doc_open: + return createButtonFromZipFileSVG (itemId, T("open"), T("document-open.svg")); + + case doc_save: + return createButtonFromZipFileSVG (itemId, T("save"), T("document-save.svg")); + + case doc_saveAs: + return createButtonFromZipFileSVG (itemId, T("save as"), T("document-save-as.svg")); + + case edit_copy: + return createButtonFromZipFileSVG (itemId, T("copy"), T("edit-copy.svg")); + + case edit_cut: + return createButtonFromZipFileSVG (itemId, T("cut"), T("edit-cut.svg")); + + case edit_paste: + return createButtonFromZipFileSVG (itemId, T("paste"), T("edit-paste.svg")); + + case juceLogoButton: + return new ToolbarButton (itemId, T("juce!"), Drawable::createFromImageData (BinaryData::juce_png, BinaryData::juce_pngSize), 0); + + case customComboBox: + return new CustomToolbarComboBox (itemId); + + default: + break; + } + + return 0; + } + + private: + StringArray iconNames; + OwnedArray iconsFromZipFile; + + // This is a little utility to create a button with one of the SVG images in + // our embedded ZIP file "icons.zip" + ToolbarButton* createButtonFromZipFileSVG (const int itemId, const String& text, const String& filename) + { + if (iconsFromZipFile.size() == 0) + { + // If we've not already done so, load all the images from the zip file.. + MemoryInputStream iconsFileStream (BinaryData::icons_zip, BinaryData::icons_zipSize, false); + ZipFile icons (&iconsFileStream, false); + + for (int i = 0; i < icons.getNumEntries(); ++i) + { + InputStream* svgFileStream = icons.createStreamForEntry (i); + + if (svgFileStream != 0) + { + iconNames.add (icons.getEntry(i)->filename); + iconsFromZipFile.add (Drawable::createFromImageDataStream (*svgFileStream)); + + delete svgFileStream; + } + } + } + + Drawable* image = iconsFromZipFile [iconNames.indexOf (filename)]->createCopy(); + return new ToolbarButton (itemId, text, image, 0); + + return 0; + } + + // Demonstrates how to put a custom component into a toolbar - this one contains + // a ComboBox. + class CustomToolbarComboBox : public ToolbarItemComponent + { + public: + CustomToolbarComboBox (const int toolbarItemId) + : ToolbarItemComponent (toolbarItemId, T("Custom Toolbar Item"), false) + { + addAndMakeVisible (comboBox = new ComboBox (T("demo toolbar combo box"))); + + for (int i = 1; i < 20; ++i) + comboBox->addItem (T("Toolbar ComboBox item ") + String (i), i); + + comboBox->setSelectedId (1); + comboBox->setEditableText (true); + } + + ~CustomToolbarComboBox() + { + delete comboBox; + } + + bool getToolbarItemSizes (int toolbarDepth, + bool isToolbarVertical, + int& preferredSize, int& minSize, int& maxSize) + { + if (isToolbarVertical) + return false; + + preferredSize = 250; + minSize = 80; + maxSize = 300; + return true; + } + + void paintButtonArea (Graphics&, int, int, bool, bool) + { + } + + void contentAreaChanged (const Rectangle& contentArea) + { + comboBox->setSize (contentArea.getWidth() - 2, + jmin (contentArea.getHeight() - 2, 22)); + + comboBox->setCentrePosition (contentArea.getCentreX(), contentArea.getCentreY()); + } + + private: + ComboBox* comboBox; + }; + }; + + DemoToolbarItemFactory factory; +}; + +//============================================================================== +class DemoTabbedComponent : public TabbedComponent, + public ButtonListener +{ +public: + DemoTabbedComponent (ApplicationCommandManager* commandManager) + : TabbedComponent (TabbedButtonBar::TabsAtTop) + { + addTab (T("sliders"), getRandomBrightColour(), createSlidersPage(), true); + addTab (T("toolbars"), getRandomBrightColour(), new ToolbarDemoComp (commandManager), true); + addTab (T("buttons"), getRandomBrightColour(), new ButtonsPage (this), true); + addTab (T("radio buttons"), getRandomBrightColour(), createRadioButtonPage(), true); + addTab (T("misc widgets"), getRandomBrightColour(), createMiscPage(), true); + } + + ~DemoTabbedComponent() + { + } + + void buttonClicked (Button* button) + { + BubbleMessageComponent* bmc = new BubbleMessageComponent(); + + if (Desktop::canUseSemiTransparentWindows()) + { + bmc->setAlwaysOnTop (true); + bmc->addToDesktop (0); + } + else + { + addChildComponent (bmc); + } + + bmc->showAt (button, T("This is a demo of the BubbleMessageComponent, which lets you pop up a message pointing at a component or somewhere on the screen.\n\nThe message bubbles will disappear after a timeout period, or when the mouse is clicked."), + 2000, true, true); + } + + static const Colour getRandomBrightColour() + { + return Colour (Random::getSystemRandom().nextFloat(), 0.1f, 0.97f, 1.0f); + } +}; + + +//============================================================================== +class DemoBackgroundThread : public ThreadWithProgressWindow +{ +public: + DemoBackgroundThread() + : ThreadWithProgressWindow (T("busy doing some important things..."), + true, + true) + { + setStatusMessage (T("Getting ready...")); + } + + ~DemoBackgroundThread() + { + } + + void run() + { + const int thingsToDo = 10; + + for (int i = 0; i < thingsToDo; ++i) + { + // must check this as often as possible, because this is + // how we know if the user's pressed 'cancel' + if (threadShouldExit()) + break; + + // this will update the progress bar on the dialog box + setProgress (i / (double) thingsToDo); + + wait (500); + + setStatusMessage (String (thingsToDo - i) + T(" things left to do...")); + } + } +}; + +//============================================================================== +/** A DialogWindow containing a ColourSelector component */ +class ColourSelectorDialogWindow : public DialogWindow +{ +public: + ColourSelectorDialogWindow() + : DialogWindow (T("Colour selector demo"), + Colours::lightgrey, + true) + { + setContentComponent (new ColourSelector()); + centreWithSize (400, 400); + setResizable (true, true); + } + + ~ColourSelectorDialogWindow() + { + } + + void closeButtonPressed() + { + // we expect this component to be run within a modal loop, so when the close + // button is clicked, we can make it invisible to cause the loop to exit and the + // calling code will delete this object. + setVisible (false); + } +}; + +//============================================================================== +const int numGroups = 4; + +class WidgetsDemo : public Component, + public ButtonListener +{ + TextButton* menuButton; + ToggleButton* enableButton; + + DemoTabbedComponent* tabs; + +public: + //============================================================================== + WidgetsDemo (ApplicationCommandManager* commandManager) + { + setName (T("Widgets")); + + addAndMakeVisible (tabs = new DemoTabbedComponent (commandManager)); + + //============================================================================== + menuButton = new TextButton (T("click for a popup menu.."), + T("click for a demo of the different types of item you can put into a popup menu...")); + + addAndMakeVisible (menuButton); + menuButton->setBounds (10, 10, 200, 24); + menuButton->addButtonListener (this); + menuButton->setTriggeredOnMouseDown (true); // because this button pops up a menu, this lets us + // hold down the button and drag straight onto the menu + + //============================================================================== + enableButton = new ToggleButton (T("enable/disable components")); + addAndMakeVisible (enableButton); + enableButton->setBounds (230, 10, 180, 24); + enableButton->setTooltip (T("toggle button")); + enableButton->setToggleState (true, false); + enableButton->addButtonListener (this); + } + + ~WidgetsDemo() + { + deleteAllChildren(); + } + + void resized() + { + tabs->setBounds (10, 40, getWidth() - 20, getHeight() - 50); + } + + //============================================================================== + void buttonClicked (Button* button) + { + if (button == enableButton) + { + const bool enabled = enableButton->getToggleState(); + + menuButton->setEnabled (enabled); + tabs->setEnabled (enabled); + } + else if (button == menuButton) + { + PopupMenu m; + m.addItem (1, T("normal item")); + m.addItem (2, T("disabled item"), false); + m.addItem (3, T("ticked item"), true, true); + m.addColouredItem (4, T("coloured item"), Colours::green); + m.addSeparator(); + m.addCustomItem (5, new CustomMenuComponent()); + + m.addSeparator(); + + PopupMenu tabsMenu; + tabsMenu.addItem (1001, T("show tabs at the top"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtTop); + tabsMenu.addItem (1002, T("show tabs at the bottom"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtBottom); + tabsMenu.addItem (1003, T("show tabs at the left"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtLeft); + tabsMenu.addItem (1004, T("show tabs at the right"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtRight); + m.addSubMenu (T("tab position"), tabsMenu); + + m.addSeparator(); + + PopupMenu dialogMenu; + dialogMenu.addItem (100, T("show a plain alert-window...")); + dialogMenu.addItem (101, T("show an alert-window with a 'warning' icon...")); + dialogMenu.addItem (102, T("show an alert-window with an 'info' icon...")); + dialogMenu.addItem (103, T("show an alert-window with a 'question' icon...")); + + dialogMenu.addSeparator(); + + dialogMenu.addItem (110, T("show an ok/cancel alert-window...")); + + dialogMenu.addSeparator(); + + dialogMenu.addItem (111, T("show an alert-window with some extra components...")); + + dialogMenu.addSeparator(); + + dialogMenu.addItem (112, T("show a ThreadWithProgressWindow demo...")); + + m.addSubMenu (T("AlertWindow demonstrations"), dialogMenu); + + dialogMenu.addSeparator(); + + m.addItem (120, T("show a colour selector demo...")); + + dialogMenu.addSeparator(); + + PopupMenu nativeFileChoosers; + nativeFileChoosers.addItem (121, T("'load' file browser...")); + nativeFileChoosers.addItem (124, T("'load' file browser with an image file preview...")); + nativeFileChoosers.addItem (122, T("'save' file browser...")); + nativeFileChoosers.addItem (123, T("choose directory file browser...")); + + PopupMenu juceFileChoosers; + juceFileChoosers.addItem (131, T("'load' file browser...")); + juceFileChoosers.addItem (134, T("'load' file browser with an image file preview...")); + juceFileChoosers.addItem (132, T("'save' file browser...")); + juceFileChoosers.addItem (133, T("choose directory file browser...")); + + PopupMenu fileChoosers; + fileChoosers.addSubMenu (T("Operating system dialogs"), nativeFileChoosers); + fileChoosers.addSubMenu (T("Juce dialogs"), juceFileChoosers); + + m.addSubMenu (T("file chooser dialogs"), fileChoosers); + + int result = m.showAt (menuButton); + + if (result != 0) + { + // user chose something from the menu.. + + if (result >= 100 && result < 105) + { + AlertWindow::AlertIconType icon = AlertWindow::NoIcon; + + if (result == 101) + icon = AlertWindow::WarningIcon; + else if (result == 102) + icon = AlertWindow::InfoIcon; + else if (result == 103) + icon = AlertWindow::QuestionIcon; + + AlertWindow::showMessageBox (icon, + T("This is an AlertWindow"), + T("And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah."), + T("ok")); + } + else if (result == 110) + { + bool userPickedOk + = AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon, + T("This is an ok/cancel AlertWindow"), + T("And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.")); + } + else if (result == 111) + { + AlertWindow w (T("AlertWindow demo.."), + T("This AlertWindow has a couple of extra components added to show how to add drop-down lists and text entry boxes."), + AlertWindow::QuestionIcon); + + w.addTextEditor (T("text"), T("enter some text here"), T("text field:")); + + StringArray options; + options.add (T("option 1")); + options.add (T("option 2")); + options.add (T("option 3")); + options.add (T("option 4")); + w.addComboBox (T("option"), options, T("some options")); + + w.addButton (T("ok"), 1, KeyPress (KeyPress::returnKey, 0, 0)); + w.addButton (T("cancel"), 0, KeyPress (KeyPress::escapeKey, 0, 0)); + + if (w.runModalLoop() != 0) // is they picked 'ok' + { + // this is the item they chose in the drop-down list.. + const int optionIndexChosen = w.getComboBoxComponent (T("option"))->getSelectedItemIndex(); + + // this is the text they entered.. + String text = w.getTextEditorContents (T("text")); + + } + } + else if (result == 112) + { + DemoBackgroundThread demoThread; + + if (demoThread.runThread()) + { + // thread finished normally.. + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Progress window"), + T("Thread finished ok!")); + } + else + { + // user pressed the cancel button.. + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Progress window"), + T("You pressed cancel!")); + } + + } + else if (result == 120) + { + ColourSelectorDialogWindow colourDialog; + + // this will run an event loop until the dialog's closeButtonPressed() + // method causes the loop to exit. + colourDialog.runModalLoop(); + } + else if (result >= 121 && result < 139) + { + const bool useNativeVersion = result < 130; + if (result > 130) + result -= 10; + + if (result == 121) + { + FileChooser fc (T("Choose a file to open..."), + File::getCurrentWorkingDirectory(), + T("*"), + useNativeVersion); + + if (fc.browseForFileToOpen()) + { + File chosenFile = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenFile.getFullPathName()); + } + } + else if (result == 124) + { + ImagePreviewComponent imagePreview; + imagePreview.setSize (200, 200); + + FileChooser fc (T("Choose an image to open..."), + File::getCurrentWorkingDirectory(), + T("*.jpg;*.jpeg;*.png;*.gif"), + useNativeVersion); + + if (fc.browseForFileToOpen (&imagePreview)) + { + File chosenFile = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenFile.getFullPathName()); + } + } + else if (result == 122) + { + FileChooser fc (T("Choose a file to save..."), + File::getCurrentWorkingDirectory(), + T("*"), + useNativeVersion); + + if (fc.browseForFileToSave (true)) + { + File chosenFile = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenFile.getFullPathName()); + } + } + else if (result == 123) + { + FileChooser fc (T("Choose a directory..."), + File::getCurrentWorkingDirectory(), + T("*"), + useNativeVersion); + + if (fc.browseForDirectory()) + { + File chosenDirectory = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenDirectory.getFullPathName()); + } + } + } + else if (result == 1001) + { + tabs->setOrientation (TabbedButtonBar::TabsAtTop); + } + else if (result == 1002) + { + tabs->setOrientation (TabbedButtonBar::TabsAtBottom); + } + else if (result == 1003) + { + tabs->setOrientation (TabbedButtonBar::TabsAtLeft); + } + else if (result == 1004) + { + tabs->setOrientation (TabbedButtonBar::TabsAtRight); + } + } + } + } +}; + + +//============================================================================== +Component* createWidgetsDemo (ApplicationCommandManager* commandManager) +{ + return new WidgetsDemo (commandManager); +} diff --git a/extras/juce demo/src/binarydata/cello.wav b/extras/juce demo/src/binarydata/cello.wav new file mode 100644 index 0000000000000000000000000000000000000000..b56c600bb4a7642327d6443e612c5e11c45e48d0 GIT binary patch literal 46348 zcmd>mWq1@x)NcD|+&v)#5|Th55Zv9}-QAsq1%m6s;?CkMvWvTW(4Yx%nTg9}eA@0C z_Pfvhe}CRfJ=0-&X1c4ZPMz}}d8=R7PMw$=1TnbnppKJfE(moc2!cebF^C{KTqFpJ za3#h~T(V#Ug%AEe|F>Y?*zwaBOr1UJ|8g7}#Kk4V){l#gYgoTQv-%C2#l`<$Ug-b9 zpG_FMVC?d%|2>#Pw#ft`%JQ$HUAE)BfFnULkW5)-2*t0X9cQcG6L`roP0;w1Aq0G0 z{oCrR81SMA4voZbNSqgCi)@ywa1?%B^Z)!_#5b$&>cE}M_`LeA)mP zD%?qymA}qapC^dwepKI~`kvLjtG?!c@2am_efR4348B?Y%j#=a-=lg2t3S2NCOk>? z{p|S6^6U5Hubx+5t@?d+KkdK9vAUnt&rANgQuWyW*Td>#^_{ElR6QpDdwvAD`g!PI z->yDeeTV89;PCqI`S4|&uf9(8eg5l*j9+nt^4E8&HBI$cF?d&f*Z)R``JXFR|Kh(n zsGh~@C#wEl^%Dxe#`eD+RrjI#jvU5Ni=&!wA)N7-!*#3Wruq&_ysD4Yx=oE%J(Jbn zto~iKyl4n_{HFSs8XTSR*9~Xfel-oQs=@!XIIqB`)$gk3x?0A_U!yMKiK=J)zd5Xy z0vcDXp8fwVDgVi1^*D=|TaNG}JkZ?He9`;}eRh}e|lgFct#cPT@7oY8v_sOT_^YV51v3w85Gx+6U`JlX8-h;mv zaqhW%Uw(?$Bl!l}b@`I~w|o|#ZIkE7gXN~Ozf8ylQi}9l`XZ%EI;ldEq#(H?uD?#+ zj_W;>Kg)%Xi0Zj4k&|(S)40cJT;&d~d0W1PD;`8orl3!A@SDT<nw}mM#Yp{fYI&bt0YcCWn!Kk)>n;^*i;Ha!_^X z0rYfwE&T`D7J4N;obE(N(I)C1wTqfU4WN2cJ*i&QKx!oZpFpXpBytDYmvknd62B8& zh{i+%~w6p*c9#BSmn5lGG;pO9**J9_hla-rMPqv?h8 zHhMd~hMq|eq#M&NbT0Lr+KwJNQ!jC?+T?qTn@L_KS4nfEd~v2oiWh}>!cd`~FhW=* zJQvjBaPgd&FM3D~rPg=_OI6|r@r<}ioFI-7CyBp_2gN61l^7unl$K+JuSjR51JV|0 zfz(IRNEh&(I-*J}6VilA!B^}lUJ>hKUTVu*Au}4HEis>1L5v}~Vr`Jbdq~J5NdJF2 z#tivNhRpAh7sxH;JY1cWwu{}w=3;>@I#3|CH9qD~Zlz4mpgvK~+#rv=<$Nd5oZW z>LaxWvsgqnAqNrjn$jw)f<9PTXXG__~Jpb$B_P9rYcf9QzyvjzRnr-d$)d3=-xFOVI0<=(Ud!CoB^3h4o@D zDNX4TvjZZ~&=Tfz0>f;fS- zungzLwd5Az+!<~$SCf0g_GG^>(-;ww<3=BV)O^DF8B0#V@ir-t-KhsuEPayZ=^o4> zCZ7plJF>&s@$6u>58I5b&3do}%oFA;vk7;OXMCApra7*5hACiT**WYbwt|i0MshQ` zKDd7dyMc{n)0y>5J?0ZuL@(Nx&ZG`d!>DMACsW9KIRhGLxcpse zCG8h!af?t_DC3{=H~Bn1PFO0u62fuSn$miyL}~|(au#zuUiOd=O99diak5xnED?4I zEd&#v%)diV_M$&6cr~BxNOIgp`{8KI=kh0owc;enS?&+*nI(;qK8h{G`FWoEFqIbP91wMYG3 zQ>lI7G|Rcdxu?romn|+sUA{OwIVU(x)xOaT(6E|9b*B1(dWX7`xCO@Nw9x&>W0YJH&-4jwmSQB4vs) zT-64xzA9LyRmsXqK!3VHl2{uEz`cf}uKEm)oB5()dZ2{xrJEJ`w= zg7)rD_Qom*CH+V{u@jhMxO_^|O2@>;;!|O=5Df`_4S9*=?T(j@b&d$fJ$p}kiEWQ9 z&i34zXq|4IXI+k$uXTmxt(h@5GVM3EGx{4NjJ=IBjO&b7j77$9Q&-atQzLUX%QfpH zdw0IJm?zC4^2k_v7Bio%&8@`hO=d|phi*+ZCi2CD{84)o+fr*s>r$)Hdd#-K-WZbY z#fR}P00{l;^=<8~lP#;w=S()^Ok;acLoD|!HLSa>9=5l( zUG{MfKmG(?2lA>Gr;5+84q2@7ZlsRd!^CjA6nB*mR5R4y)uhH%(@?WtBWiYNJ31Mi zt~*b2@o~NB+R`o6?V!7#M=y_h9xvQmx}SA(xOR2D=CZ(Lp37e@sV=Ur!LGS3b6qYw z?{kXM?ob<)0~H_GSxg(c7j=>BNXCYrUOnIu&TgY42+s>Ui~Us#4_^WfNtd zVymK-;ubfQD}gNbX8qU_<~ehO8OTUL1clIWTgY#~9$vDK)LvXF+~qs*ey|IB`4HiU zuv2UX^zj;N{h|0yILA+LMA!?hPc3iElzFwOt*NnTnCYmg$kfgJ(A>zf!E)E~)bif) z(IQ!TS@&AMVP4{G>urK_+IQMR9QFC9!c8fgs7>!;Wkn-(2QBBk(dDh{zivI<&$uf+j(PO;jPdH~ zz2C>~JH-EafL~BhusL{U$f6K?aNFQ?YX561EHXk{hL{0WG#lMX9@~`=|rd?^Lr@ z4(0FAU@aA^Ig!m`>v3v1gd&bOY)>QA1uY`UrUrcgG3)QG2pI z-m%G%<}f+#I>H=+t&g>@xt=l7Ft8%6%uu?gG`aK;<}I}Hlp)f%#q`E}!_wEf(|Xdn z${J#wY5Bvv#q_)J@2a>eO%+k)FeFqxu6k>9HIK2}uvXa;9Ao(Q!b4!IKZP1XUp~a) zZ{J~?Xj_QUPsDv~4y`Z`v$~Ivu*Un*o#|4lITc90lDkN&guRX%wjtIi+UEN7b=Qg7xBftOHY=) zEHAAvR^}M)RqZq;nogT9TCQ5B+GyzI8TJZWkZpjqhV`-4)t>86i(Yaj(EWxAv}^T~eIeI=^(9>NLhIp~@&_OXYOs zOJ#s+l4`kXo~pgdrd+G!lnWIS1hBA2GSr8CR=ly|8ZQn|_S zu`1rw#mt-IEDrM)vy*w8X|Zv9)hLYd){1-Owz7U@hf1ZAcO{)l`Jx0CiLSE+MR44 zEuYMGlfihks)eC@#n)1@xKDwUPv?!yF=lniip}bSV@y_LR$|tY>{huG^3Ukc6*eud zRdTqbs$_m?&9X-2dny_l@~gg>D65No2CQErM@#6SakdJZm*X8DFS(N;OkKrX)ot}j zbq&>SZXj)wF9<32{nkA5dDBN(9HGMNqgREy5?WWn5 zI9r7sC{S<+ZlXo_C}av3#fI_*ase|@(Og}w?c*}jZIDNy=T+~=z6bo92YwD}6w*KR zdFaj1zM*eIu7r#YeHyked}qYi+PX;RI^}idM<+&ih!*N3)k&=5h#C@gB{IKuX03}6 z6Knc}7ll0vogLCNxMq+w;Hv*HzY?Fz-mkspc`fle>80}Cuh2f!7a|W{dMdm+gOn(@Awozu%99?#{L6}*tMaGv zn5wJ#uDV2Bp)OWGRwt^%)b~|=RAtIPls^@96;rrpY#e)uX~z6XU!W$CZ)A6AxuE9H z+6UO`TAN$?nQxn1OcRVrRh5PSLwIHVis|K7$|_2IN_&({D}Gn9*2yu)IO(xMJrbq2Po5jxI*&Ob**Y#HK)qocoACYjB%5(%=q5a*ivdeXg5221yZ~! zro-bMAQ&9O?KiEGIn>m?YH8*A@*Smd)vdyZ6;_oQ z&zqlFZT6u;Pid!I47>eInkk;=eH~Huo3{G4J=TMkbLPdSe#TZ+^9;2N;|w*bs;Z6} z!%SyP?&b^TdzRj|nGT1rQT|T0g0?$H|4W6CpJi9sEKQPU6aA>~%xguQ=CShvcgbtE z-=BfQLbilW4Zl@$RK!0KCn6?Bw2J5*@hIX)t>uv~>kN!#KkOo)vNb7_E^lz==3_OI<2D)M)I}$)}CH#dPG3Yl{J2bwhYM&x)XRLV2A%U zzcapZz6PHMK4*LqeVY3uc{lPNlj=)H!pD8c)lqg-eNdIDo~zp zeaU3fZ>b&RIHG}ECGHY}_$&5A+X}1E^1{Me$6JqCA6mOv=Ubf21B~&859KFHM-;ay zOw{+(-OoRl@1jf5rRt*#uNKuR8D2`3nM*g9I+w03c~Pt@$|_7PAPf5Fi*?I&KDuZ5 z{qk?-oyhaZKbhZAXVmS~k1Xh4xT5G)@u1R|WqZs2EgxI1E>AC0m;X`jTA{8OR^G9! zL+R%dRq40Vw6YK7nHA#=w6TuqZ__1Hj7e?0ZCFz|v_ez9r!=kjYvFzUko>%y!mO^D zS?S4XyV6>wx6CNZFl21b*q-5&8IkoYJ204rxW z`ZXL$l{MYoGOSi4rOf|@_W zZ`YU|<{O$6d@|@jV0OUPfYAYC0}cdO0+t3=26_g44D<{P2&nSA=G)UJ)2pB7BX_7I zmq4e@ns(|?RUPFbSjH00#(6{k^i|AL^iZ7OKC&wI0dtZ`XC5%unctb7OgbVUztJ1% z7xW(HKAX*zE1oFZsamVDl+ntmiW{7QYs$7_YST5TWTKvYL98znIm+x2_A|EMZKrG} zZNqJStq09*jXf(nlsOlt=xgVDX zJD0sHaVlO>7+Nq)-%4Lk@1uX98=@=7-;&=ge_H0nI>I%C7 z2e}oGD85-7Q?jXKc*(`$(jrqKQX$RO+QTr(^u0v(|%LBsUdXMEz2m| z8^;;38Q~!BP}it)WU~B0Y%Ofz`w5pMA8I{!UbEkAw9mr8e?x<7?y5CA@^RFtIvI7E zMW2k;#Pp64V%pRt;yN@4XjHe!nC5F+Eop0Qf41X{PNO@G>^QG|d7C>e+ce8hpc>w- z|FhoCy8p(e#}q_sqvPw$ih3OB7OAh*GGb=9DeOY%u#lC(pMy38?Fjli=w%QS>=7&k zJr7C<+8KBenk>d|s}JkF)N`tPU)L_qx3t|fR@G?bL5^mh(@zoE>OdwFQ;6DxUY;fw zBSzj_PLcm0R+00l_H+@Qh-lp_rjTjJK4MRBGZd|rHsw{7N%ch4QFRj@!BcKKo4{P4 z$_b-%OW5aVi1o$~Ys>0af(%S+D<&CSmF zoO3v5MNV?g-dtTCsU!7tL2AL;LaM0VFYCIYsCH4W!j1(k^@DYcu9@zO?y8tM+lZ^aj#^=Zg#Ofy!PKiK}^n@C>7Jz^7aOI{`IL`>$I7$6TO-!c7EBc1Pg6#HHe zGKH;(u+`oZb)(LX=y@^SV`J(LthXTUTm4<}HyXJ&S=3C?GP(7>cFK-#JALdtxJz&s zN2hxo4z}&k>UFbSjV%q;@oDuN*S{X8jZ@b98oMY)6TKm-qIUmUDK*E2H>oiwEHm^_ z=%1m9p)Ep9A=g93gk%RBg80Cj0jvBw`}z5f_pa$#;g;(1#OaXcx#|E=(rSe_aMC08 z4s(}YNcA9d<=0YsNryO+x0EM6l&=umNH6L<)sWtad_W=Hg)uV@HcYWrd0BN#JzR4^ zvjOoqH+8;pn}Xyb7%!?0F;pO~g_+Bx$>{ap5!c^Vi zyp=ggS%)*5W)94JmAMjjW?}9h`Oow@g|Ca7mDVe}QFg10Ez2p{P~5wyS>YZ?*6xC& zf@cNI3g+m0=xXKn%{!JW=lq^CDCb0uUv5Eet^6ap_4@nzGJWHMDFvGgh{9%tR|*E} z<@}KRuX!=~FY;IDy6JltY%4rfw4yk&WJyV6iCgiq!an-Xd5v=>XD&!vnX=;B%+KdP z{`p@2_HI(sq_s(kx3%7uCcR7YeJj7c|32_j%P+?7nzXiA_401%`xQr)`&I2VN7!gb z4j(4%Bc4(&h(j-@Ra7L=P|6ZEBIj^d>?9u~|6%eJo7FMez1kAZH1!f?JFW-gL9e5p zQ1j@=$l%0MH;Bj5E}@6R-?qZ?!ZZnEHKXcM)qLaMrYOs6YafS)SRjw21~MM(XQq(8 zOD!UQC*~1j$r$<;t5un_-P}a4O#i(hh2a}(yVgmGE{fR_yEWD;_EStkY;0X!y+#c} z8m((WwrJVfyWNZqGdr0&f9|61(yEKGlcmG5c5hnyw;a)|1#IHdMk^YQi4SRTC9ZM3 z@3FgM6w$4t#?*cnF|}rFxCHNUap?OHrx2fDD#$0WcfdmbNWZ5(`@Ii(9q}CJan$XH zOH=3T+Hsl)buZOjWe4RSius&@nMs$C>xfPAd15xk1Ps zFp6V}hRS?puBw6NhIYAgN7v(S>)da+cXju6Yw8m3B&xS4eYyMeL^55fFD$ko|&h!%X3fW z@6g5SSLvtdJ@pH8wRDdBR=P~x@A?Y;%7WqoMd93nSNd|Di*9uO*1Scz?{jYC%+4K{ zR|lx;s=f%4Q(EX=G`{G0(ZQk}g%15s-CkXWE?6(7M4e>Xagd{mDeJ{#+UNj9bs1q>q!Qo5`-{cS`5TQs#*wM&+#1DgNN{nD%sUWarL8n(uKt)UGa855n(NP<~isgtj(c zyIbVY$j*^9A{#{#QE%&vh@BGmJ$_T;N6n3`-?gvmG^T5t?w5Ov>shmBVfVdVGdjub zTekhH)r=PZHk;oxsL8g3pAEk@aKz25*P^a#?Cj|0Q6nSGwH8JE9sVM0Na(nbv%$xM zCI!|BNbr|^cld;PfAlQ(800a--Rv6Z;_Vcv$yHwA?lP_DU}`Y=5E;Ag@-bw5Zy>u8 zPdp^LAlE}9vzSV)r{^)p*iYP1MU?WYa;nNr9j$q&-QYacwX=J=M{BQI-s8NByvBMq zcR%T}Q#)7HftyOdBp7KrpKbHB9*4$yYYa6`t}+|y7`!U$m)|T2Eb6U)o#&U+D^p0T zO6`{7^dt7W@AvKBFaKzp8kxps?8?l}D$m}ZQ=D@$r%}$D?Ch-DS;Ml|=Df}=%&W{l zuDb$URhmC9|5Vh7E6?@B+`_*#;p&zP0FTYscjD33ATvKZ_&#C=42W|<;i z)l4%)b4uM#bwT0H^+g`e!fxYED-Nh4v`?HLxxRAKx_5Caa{1x(M$<|?P*tJSs(e-3 zm17j&*zwFd>I^Yk?kH)+M|`GZqN9srxMQcI0pC?7LiPS&9^I_o`__+AL)LfvY7tHFe;!uc9iH3GuL@P8u)N8XCwS#L}H=Ej?v zFKb=W?qf&aE*rYaUDtLcyZq=_vwdQll9qopm*6SpHV$g+mmoGg7;mq?CvIuI_H~cN zT&P1t9jM)`*1DRHYmi}&AX#04Dg)B|%l*dr75H}Y-R<+h`;=EB&p7wTF5yn^)K8R2 z+)rjFT?e^tD>AYT>1p(S_85(0kVLe(PQ0-PgO&Gsq*!b)j>xc8jXFf@K?0dZ{*wUh+-UUnYALTsH?3?cO(=|o)-Tmvv&*7i@e(v~1`OWJ`d}^<>qv^dfT4vPG z7@P4VBR(@VGdW9{(>M2e-sk)Sy0f~H{OftAa>H|n>eF@i^{)!H6do)}E1q1^xa31|U~y&PjDp9yqP&MW z*R%Fzj7xiw(*4`cWd9GR-i}Rb@P>HZ|J9&ZRj-b|KK)vJ)$LWySI)21NuAyYeBSco z&vdt(2f72r6DvL&t=6A>lpIWzFb5R>sN6LxHA!kumB3{)AL!5YFlITMsCcX%nO*XYD;r4^0K~9amHzm2(vD*+&e#ZRB)OEkL5mLyD2siXtik z_KG>uVqzE-#zeCRmDbfA6xn+m-GudX#nF(XBz3!5!zd`?qyu z%lgfen_g*hsqyiIutw4Gjq6{n*SzkknBjHYA|FQl9=;;%w~(DdHv?k>9RYU&<_FXd zcwCr^;5}M8sh}YecT*3UiDZ!1yrUOhd$^b~5Xb0}4`{ zQH)mlsD7$mtB-5qvFxdpj*^BCz_-z(c|xwqCw@=o&Z>|NjMs7In( zgv%stcU1!}oX(IZ2=Vq)mP01ic-b(oa$d#c@~LI@N?#P072eVB%zu-!F|%u0lN9qe z^OxbDHzXfPKJq!}tJ8Pal$t-6rL{??)Bj4VO1qfulhHim&kUE$(#({sitMjB{SjM| zbK-JhvvacUXKl&4lI5AbEZde{m9r}EL;ghFLfvBBXkB03G+ifH(*3%_x*z#m{>!}1 z`2%$}{h`9AMLmlh#j{G};ul3X3r_>zPtG^w-pDD=%FS4pW=Zk<-uuh6r** z#QVqZ$oCuGuYdpZ-JEx>@9%x+lq`I`llm}odfvr?3nlj|-W&h12J)F=E8-UA!_HSc zQT5ea*F0Cdss<}6*oLefx#PCnJ%v`?#_1o|FCJE}&)%)QM|-|@vp65p_Sa0(Y|`w2 zd{wIB)WIr~A`!mSHROsXlWmA)vQ;`FO+#(PH@PGEj_S|sV|#EWb`SHMbd{Dl7Ff@j z%S|iHvDOdvq2dX$Gk074*7ZUFelyn@ZV%lBkLF%3-hX;0dUM{cUh6z4w@RlO>J)Ab9Y-`0?RFpQBU66WCc}ct zFUWsQDEBEFQBtR9lD<}+BP%8STdL;|^|!n)(O>dEyL>tOCFASB?`u+y|LmClG^0u8 z-pm)7r!sG5zRUcUX~`Uy)jGRNPGIhY+`!y@Im#R&hsm*Jx60AyjLdD7+adSQ+_rgl zVGq~mzse8M-O#N8lHXNe04}>;u(6<^;A!E;qS?h$5w+i6`m{8%Y*d-HY<=ml(yJv0 zi{-+x&|Y`*&g8^r?Mkot)9{1%-s)@qXIt{|>#<`XWb{pSGN+fb94XfuCDi5nFRHUkzq6+!kBh-6pGQEl!%*Cj#Yk8Oc z?k_!9&nX^hZmV3rYM-g!qH188s=KO{>W#7p#e1RLVR=I3*zvMZ~yTYfg zUkCrj0RsZ>2Xzjq6_yx2tk$Kd+Ofyttnto`Pc_YGKB48DR(D%9X_emMOSAYUml_?8 z4{Xr1eplGQnRVINy3tHjS}n1rclhYAl#m9&u0c_O+XJY8gZ{Dpw12VRL%-gB`+Xny z7`-#R-g)Xh+IU=X&v85FO1Ws9tZGWtR3Wel>~Y4Q`35iLG;Coi-Ilq{v|?|wO}VX{ ziEF9Yq`0dnRw$Icm1mW)sspMp^%M0`&1G%5Q?N^6Ln* zVmrNEe#p_5%1vVVV>j&u<>Tl@#6m$SSUs&`4_6J3lS=xR)Gt|FQc#jrTDLr* z;%>#H%5H|SRWGaFS1qmj$FRE6Tt2MqT8VFQV&N@)nC?@al-ne?O-@4gldQa~hS`_1 zhvhWNjmjIIU!e0Yd|Q0K>`CQ*V;##W8_f?CFUbb-1|7$a;#MhUDM?j?Y6~ozf!)u% zrkBtk=;h3HHjf*jtfvmvnw@-ID3?agU$vJt8R{A8w(2pcZ@HvitG=bGrJTXJvIpsF zlnIp^i-~l3n5>dn)RW93u94koJ2Q@Jp@>$r;*K#1)FIhdbmQ&zW%jRj!SP$U55kw#TvYQ_ z`0*O+!d8V&4rv_RBxriz+JFuI?fstlw1A$d^!V)lz^%YF#I>8t5$7jPN~d?)Yuba_ zLE3)W`P%E+GVNFG4ee*GfcBTRyY{)pThmM(tI{jZal6^;jGYdrXH#xe0M(f~f_k$h zbOAkrxy<}zG;Aki11)SDZW1?C4=wqT` zEspIB{svv;k;(>@cPjQ({8eG7SX0@=z#F<$9ji*OvR649y^O)APdQUntLmHKg@LI$ zT-DFm$W&&!ZJuX|NAB0f7HjKoYimolwzB?dd2W6KFZN8;eS^2*Yo)HzhDI7j8S)MN zt9Die8jFoK(_~Au&0){uzlkU0k))oAU`Dh1xD*Ai6p;;Fris%2p&hARtch3uRK8Kv zSG?e!a;e-Dj8-F6V|8my8|^3UEiIvS*MzG#tJWj4u^kyR4~?kqrJjj=$PI1)t6@y2 zAIU-`=mv5b>Vuk+<53T~5V`b1Is)t8N+pt)iz*m(Hhq$&c8c# z)YjC5sVAs@Dtjr9D!y{T+<5jRD)jV(?4Oy#BtW}UgcWwfQS#bh30&NEFkDNKZ^rfGp`mnq5QWu9T)XHGOv zHba167ZS8ODLmdkK9Q>;8s1S4$Uh52gcZNG2 zRZG;t8Utc5E1XK5qMU=AA3C`?)z%7Xor;H+cTzr89948uMxoLq9f%@MV^wca+f^G> zZ>1G z2dHig7q+6Jk#~fk;e$!IQF1+a{M(2{54-#$3}p#VnW)S}H7!P%pRK`lt0bYa?s8m9x&WGN>51VS8=6V(Vf1WF2Gmwtlr7 zw;aYR!xCwoYdvSZYW)i}HxsO_t?jIRtUZy*K4_J!{cW3U7TaL^cl#8F-LaHU;yVdX zg;|IJpOK7`AF7R;!QLE`x=LY^t5jc_FBMDMWf$TPq7qTae@Fv40+q}qQ~+k{JH44% z!!G7lD5fae14|88uUFq!yKAV?Wj-Blf~E>*2m1*onmHz)@va}@g&A&Qq=M=lk0Z~4fiePgUlLv}VB$)=)C_yt`T z(bT|S`l~y6235R4@_1>LxK6ml=Q?KpS_J{TO6VlcKovm?;v8Wh+(=(ij|wm~F-cAa z`j1Bqq%Z1o6QvW<->4VdCZ~cck`Km0jQmQfgVkS&b#q$yL)aqpMvde_RMuTYm4?Os z3N6E~cElh*xz+K)!SN&cGrX0bER+eqq3W)-{9YbKBoXoCI`SPEN-aWdygxmJUJB_N zL61l6-ZuIOYUCHtT~YtNh6+K&^i^;S=8==hspRjd&rc$YP`%oknocc;RGUW1UEJOxkO!`=#4nqXgUzYX%$AyobbgL3mp z91eM!im{Cc6JaNDo5&+HU;zY@E@UO~5|uSY;3f?1~r)i>Tsp$el5P=F3e~q8!mAbz=S9MUeR`rMKr0R{z zq6$&_sDG-~s8m1;(aO`v(01i6qn0;@bzu$A9AA)^UCy*(jPwKWDmKv1={w**jEBbh z9rouR^eBLQ0+zsaur@rUSg{u}h8jM}k?k1EM+;73lDHJL+dY8Dwt_M66#Nzo*fY=N z-{jiz7iqgRKx!<7pn~WVYIa+TUxZV_I#l7OLsC9CreLjK1zMYlu{>cvi>jk&`$yX< zTW?#WEgIQy!FI^r%u(#v$U6(uP=o%jP$~q9v&15Cnj}iAA*JgO4emnjBa=x271gt$ zs{$ckL+SdogzWo5@Ky|vp;M5hUZhOCK+VGpq7}G9)x4QcsQd^bRueX2C}eIG_$Ix{ z?&Jtm>#rrZ01b>Gy~vA1N5X(-S^)k{E7W#2L*DT>)TnQlSA%o&NPY`8&KXpF+EF28 z5|@ZI#Jj=@LE;ba9r*5iG~b(_!~X>a!gyh&uv6$JG!#O>KX}h?=NIz*`1bflmgBVJ znB$S71gj^IZ;5efzzdEYju1y4Y75uf6Cr~SAxANe7LJ+t=6O`0zH_+ozr(k>3>{ue z`YdggYhz`*;VF~JaBu+D!qR*MXC@XEYVmXg)<+ITrj&BS%E_Qd18cToZ?RLkO73?> zjv`LEO8G*`D`Viz?M1eRDnBc~D``~}zBvii z=iOAa>Y}m%GXF=B>33mwGCddv{gXD*TKMD^tk7eSsW$XYNYW-$f`3Kr=^-KuJ?%lZ zB^mN07%&8}A9YUWp;<4Z+W)8UShy*C7lOsn;xSZn7l{5+53q<1NcT{|`yQOA^WYQx zj&o69hin#Wi6_DCF!F!$b@^22pf(sKt>dA+yZt3(Xboy=_gdz`1{f`IsNlY1by#cI z`q<{%zS{=bImaPKJ#Z2F35Bq`7etd-1JXJN)x454PJW4Xx&te8HtLyO!G3B79ki7? zO8rUAqMA@;;19JVO~iZR72@ybiN#=+J(s)78Q|gU0Lvy>@_@vQ0xzt)ycle(XQ&R| zgB3CnXI1#tTd5E^#w@VA2viM)$&K;7;b>Ekb-fKvRXt)l7*&TL-{ZiB+X`!b74^&Y zB~~iMn0!Q)`xUIG1LAb7sitBtu`?>CT8p0GZlnrdgj>H>*>Yhv*hHO#2EaZwptpbW z=OHx{AazZ^?O4Wd0pd7-T7!f9DOf#)&{a4h(Bg8euC9238em0)5qF6mWEQ!Gstc_U z#SB3O$95o&ZHT$_VmdNQm_LCmKQKndk8KU~yAwPa6Po}JnL^b!tsJA=4$1nVRH-^c z15H!)RV~8b1NyvlER}98$o8lkE8(^*Okg9Cxs3AbN z3+P$UO-sSeYD(9lSs;@=R8#QLmV&Qw8eFDS`HlPvOuc;B8S8rqxM-s=BY9wyM1f29 zSo%|%3=3xz?~8wcRWby8fyo%Vd1%YAYR8B%unrc%U-S@PfP2*wj215;ncu|E!#W+q zhw@Jxy&TE*KKAFfR>7Pw=qz1Tj?u^Q|7lcOn6)=0rB z`~{gh0lnW2yrnl_FGdn=(6dW~6IelC$Y{vY8freYl%72B%j!)AGc1vujyn1juofCa zPwkMKgAe!xak{xuU#SUnsY)sobHNKUij^V>P8ctii%N-r4fm1UB@WTz7Wn2CF#573 zizG;P997`?C4#L-5;ei~8B7eqm^A|{(;0WTB=?aO@^k5dbRB&?ChfzW;v@!{@Q={$ zPmmAK5er2f%!!5jpWR3Hgn6k)!a$$5tq%yDpo;4LX;y>=e=6FMtK^(%XQ@^r5ljcaMfT{D0l-m zm2;Ku%0wXX{ajrx2eP>gY^%O(1NJ*Jnc?Z#w3dEAZ2*>S0wzu|*n8*5QDigH47_p@ zR-!E!rRA^^+vT2eG;E&%HU7(CGrTY>t-w5e32sSuxt-hGp8^D&8pzi-2>_j5?o9|KA;RBA{94Qud>n>(<1$Z<8;(Oq{ z&B8)q3heDxXyR0%M4-gF;wW(&>N7u!rJ@V?n$6)+%z>u+E_s1Lx(1pe4T!ic{EivG zHZ#yB5d(M<> zeIR7mQ%V&#g2%;*`9cwTVL&sXf|nD0!8>aY-Tz%|C*7B#<>PWFo~ewO3RdAD>MA^# z`t&&X%xCFmbS~}5j9}g|joIC78tcY2LuBO;vcsR@r`1*TR*ZtanS)BTMv4ZgUUO3f zC~7M@Li0dw6i%q$9;@63Nh*eQ{HeUC9ItE&L_QVK&K>aAZ-EnKK`tYRxdzOk0#kH5 zH3M3S2Uqj}@M~W(41Cd-&_z=rGa^{UAAWI(FF|q^$fGfGHDp>Yhqb8zyt)Q!BNyKh zz`8HQkt3>r6+Zya-UowsJ}g8YbXWzvIA8Iq&{xod+t!J9;!_+Sz}|2Ia##qY@s2O$ zGx?)@UwD)&9SX-GdjtDV+i}}++br7*+W}jtttl|;L13-(U{ZDg10IhG_9P1H zem7?5w)9b|0yA%oELI4gU|FU^s|E`;{tGnYU9>#j6}sXYcuGUWKcSb?!7S85 zzYRnmvZRi9X1(kS37U#(k42EDagg%a#Bam`{J$eO+|?X%8^-4f`q>O#k6CiTN*oQo z^I3Q>OXP)!6t;!O90ta7C!8ORRjft6qZnFopEOe%25TAyi*Oab!ESM#Q~ffr0As>3fWl(W?haV`j>6og}BQyuq@mnP zb_v@Ul`bwE9&?M6ZODDdIM=}CO?Lsw?&kM zwL+-y6s%o0_~PpwlN|#c^BwyUM|p_$)bR~0mlSa0t~>TRmN_~)A|0GVu-AmIG}tlD zu@va^J{Xw<-x;`~7`9*`{KkgRh0S1Bilv&6jgi30)u?C=yvzGw+SkT>-hgBgq!rrh z2xdD0{QfMglTUb^2j9Lstlt%An=VoWG;0KGTotg|0$A)ca8Jhy?O|)i2&098utOn& zpWp-!uQ|BBHw6!I1SIP<7}9kx+e@KuGO*Gnfgf*@TN2A4!T&;b4-!Wq&0C3W&{`d_ zPD8P80Et}++_9g4H~v=uU*;C{n=@GCLm`E6@G(=dGETq)SO?v62OQT5AhvH9iR?Av9!m0kD-s# znRGBSm|4pF4SN^_c}QcMale7XBp|X>S5XI=s*7R*_;WiHrxoXZN!mHZU-v#t|=&8`!L%^u*f>qT@j+C9DsnUVKQ^2eA0%Gq77V%u5)m@OE)p+ugz!8@*ryn3= zF4$keh7~ji*!B$2$Oo|7J;Z;22Nc3T;1s7IGU0}*-h8_qthFg%i+^(zIe6$X5fv1( z_|wo5I^M+Fpd*|G4qAhU4^>NO2R!i}zQI(WkPBG3?|>^J!1t|2>}_Gu*10CRj6tYLQ`nkLY@YrsL3g~32V8PHb^5na0gzF!ykgbuJYmO-9wK(4Mp zGhWBvYs497$iJa0Z^7qZkE;8%#D0ACFFvhq2Z8WcL-uyzlWjnTwJ~mAq4|oz&`-b$ zod}8R42dj&Kavc)P=I({1;+R|<|YiNgu(Ol!Cnk{+nH#7vlt6w0%l#{&7Y~4=c%Zy;%tvcT z0FC%r5cKaF$kj$zzG2W>-GORb;y4W}VjJ|+cIf+^*b8AQnCT<&`B=!-3G8!Gy;n*J zG{L|4-T+8lJ;+@bVESrA{I@g_SokVdxh(8O9Q7)^ZJPh&_!r*u3}~*Qj*EpFBRv&R;>rBeF&Uu7e(M|2D~SCV4Y5w;Tuwc z6fF0EgdInO<2h_{3T7!4J#)Zf=R!X$N52&EHz4R$@F64c+gxDho8kj7<HTEs};_XW~nNNEh#P_kSTa`i9vDR={n z_X?4t4`|u2#T3?WHDg^xy5Z$V1_9-HlTO(6f`G4m3zoAbWJiV#4+1*t1x(ftZ9b%G zBxGvZYgg-rW!C74v zF%J=l?md@oA}a6!Iw>FM+z3y{9bV2{*#9K#+fo6hD+f-n41JW1*?NQh4$i<6zl@b6 zz_V?O7EV~e4?hE~(F2l2$QF3zAAo;0W7a9@F6N`I_#L}ljDSBF2oE|1yGfjZ$22Y!!@kw-swk341pI z(y#>@=`YCFQ((JnRHz2Qe;9#??Gf@8`I>xz{ZUSnTgeshwTHr|2qDX%;TAzV(ZGE9 z*d@o8=m5<%9QH8*I4}X4HUW{?C6J}R5kIKbeD{eTzvMLya=RPftcj?P0eg*jC;Yq?+_Z+|`7hjfD?< z1DK$CgsoCJke?2_COiWQUN0?#ei?$jX^!E&Ly7}#Sq2Su8uE7;w(b)Cw-s7xHSpC| zoJ)gtwgI&}|Jq-OfF3V~r0v11wuQa?0&6n_`GdExTWhh4#6Ynh=4l-EREfh*CO@zb z#x3EVa1LJKX2eIQ0n;SFf9?t&al7yWG0#L;n@DK{dUXjFn2>{izWav?anz7!3LCkDjl>jBl6L0edWkKAC~s#b#)zBt)JJhzgWI79QjMeq42u)DaOi zyZ8mZ;F({#suSW#Eg=7`AyJcnw^pFv$QU7BvK?B|j^2#I)s8?5-^RTyQbTB}(^zR9 zz@|;1Ulze9+YMy34RUZ7JLFU$>emALV=wGO61?quh;;A8jEo1TBbIcB#rO()xE?yG z12CA375oyT`V5HV4c2oyMw3ItVhXgtK1AG7ff&8Wn%Ipf2=Qre%x3^8Ah(eQDL#aI z9)&D>A)Y${a(sb&1gj*G!N~I-pmbCeWa2P#IYW^z78{V-;%5I%G(AeK4so@T%{c9CP{nvlmK zz*Q&l{K=3i7obspjB9VA570m`bl^o;NO#0+wqWMkW7igMcrwq$+$_2HCb)fEwj z07%wP>`QP3d%c`NFZaW0m*DR3xLMEax169&1 z>G=Pu>1^O_EYtnJUkoM=2S*{>pD2E!l>gW*tdu>arhecAi|JZr7J*0Y|M`~Ka(>vz38&tjJMq-TGIJ!sBc z?}69cm%bj$T%W=?{F;%ONo-{mBl;J#%UQgyBSec1Gf#`C9O_#vFQqcwMYEoLx)X%o&z~vxZ>fKI4vN z-chX`Ihv)QCOfNQRvjXbEx2phL)>}lm)!a4{;a#RN@sn~{nq|B^Bhr!f?3tbv%i$} zR@SHB;$&9A?7N6-eMpwMAS_g+K+OVo7AT5tx3t*`C&HHb*CS%%)XRhjd+^NV9_tRv(Skf-xF`YdgI!Sn>PyZ zjU3i{nwhqZKB&hWeIBo6FJ3_m1QyB%&=RZvm*&dlahz+)(2BI2P z>o#=A5p?}*)*X%x?*|hNKu>jo?~4)TIfh?;8XaB+mTHK;YJhqwiK?%Oe(eKiea5#h z!dh*~RJ}zEdq?J#%(7UfhsakwNyhzIo_|R-QIo8i)SeW~DoU2U4tL7yl{Jj$_iSnx z{*-kj>t9*l5jVXJ%-oxOKRNbaXTL>+YZ=!7{2s4y5jBu6!EASBf6G16RONSosW0H# z9?Xb~LXaHj}a1L7z5b{04#3q1e05#JRXH7m>aKsI`iWcU{oXjn5~cv*ys= z25}QpY_$WU-U6okIXbB|>b@sF!+4N1jn7AdjLCfCLwI#JJY>H5AbdC%FLW#(=n$6v zv>t4uKAE>09M^WRe-xZuzgd(>NF`L)-FV)2pzKOAgMNf|JPHQpVBvoWB5I?heg<O_=k3K4~M*s5nXjAN2=TLx+`XOu_X{E{s`!`+MK zquc&Tp1llrn0XM7e*nwFyn2ir%5zyS5X*X#$MIxIUnNia8Fgsy^WLv%&%i=2W_<{Y z9nSgzb>E!oj}f$i_*WJle}AdG92j>_FAN3T9h#m%EEF-4@PaA9a$*Q(JQfS4LA_YhSJtPElX4P!1n1NL6WSNW28v>&vtfu)CG zFVzV5z~{dNRm;%;*J0M`%!;n`>Bk&fG5ode*r>_e|851*vW-NT4`8eQ1*`mD#trcG zZz;NvmvKJhEb%3CNMEJc)k0!h3sB=~_R6X9W<5Q#4$ZoST*ew+uct3gqh9NStGD2| z0~z0E+(x`23$1>g`_k1ywLOK_nv9SC5en;gW*(NY7`|FPY~qtJ)Qbs83t*l1vgTw> z=U$u-U?uO$`cc-+%zvTjv#^+Tc&8m$9L~Cb0Am|?Tnh4rXLX15{)61==UCk?@b5`x z&abf7m9Tz$7|BuCmloiu6gc=Xtr+vUI4y%a=$!@y=h05)>iEfE&E z-Mb%uhZ6aYS2^@nW0<}w9Dh4CT7`*0d)M7U_}ku-SR{Fu+Ctpzwkl&+jk77t`$lh< zbB|hcA5W0+sD+*V796bQD9pQk4l?#)HLo)ZE`q7!;3PMp{`btAX`D$j*p-ctVS3Evf?UrsZ- za#Ll|T*l1n9v3ms4x!u3^v`GgtN4}`@dj(5Z(5>q9>C9UhmGwHbB)0(c#BxZ(xld} zWd0aC*a5zpn)ModH49vQL~YrVS-;4tl9iox8vD6{H8+u+{{{_Kg0-8aRtF^AhSfXC zCtri8-)FwYwja;DA0PAvzQ_Wsc234NY*8;_fok;{*ohqQaDlk_Hmun`Smg>>DV1!- z1$uuWmaaFt_Fn8lRpxaItm6o{>OID6HMVdU-~1LNUO~5?;dvh;vY7TMdhA`=VrKMi zF#7$?;_T}l>|8$>YZ_{66Qgj2xm^W>)Wb7v1^0JP@xRWzYEMk>UNF{>Pa1NE>)<})`wNMnjmKNRxZ;oN*az--wJ zs(f2Ms2FHZqWdcK2*sEp+G49;&cpPvCuIpnSCF>_jB;etDV5pTKX$I&U3sjcvT%K`dk`-1jRy)@DROY7)~ZiRW4t3s{7DH9d_9jKXy|^#l67Khc2(#6DFW zMN+)#G`)C)b|}r%LuszAVa~sY1?-CM$RS@=ilq@MWGt%cLy)x`Y-w#aF;;(0ymX1t z`zK?`O-;et3AT2C*?kKAbq8b98%CK#fz$EkRLvuKl&Y9El!t~Il&F|(%vXLbc%WHUoHTk?FJu-qZodGBA zWPERfwHm@y1Hsi4kT8#^*zdVl@9RV#rc(bpk7&bE5cUbLKH>ErQAnG>&0mPje#Pt0 zGZ%xUU0~@?iMc+_oC!XkfCVdKXD?!}bD0^dh=R;x2F%6tdyi!@enxu~UpA2>eO2!l zJ_g^sE^4<3_OC1$<62hi;Z+c|hTffz9-YH7i`hIO#e6#A8~%bQ_T$XzL1>dl@uT{q zZKt6@{s(S503uI;rlMf=PPSJM|Gpfa+jr<1^Fj4dAfrL`ChS?pE%iAVEir@k8a*^A zwdu^+56}*;@yW}~`52W6d_IA*n93N9Cv!0ne6>oc z3>%HY@;%2K8Nh$eq|vl-oZCd+@6X(C%6U~n1$%${VlcsZnmVB{+pd_l+8FL`&Ft#V zHb#Kaxv=5iGO}Tlc6b7VsBC>71O;loA%^uQs@8u8clDt%r~^w+G}u5GZ8XRk%RNfR zqsQK3okgHcd@V-#e}oNHLsiK<&uo~TMq&`hJCJ$*6zyS-pb=+SiDUAP{AH4Ixr!=T zP0u_Hwpyi#bz^3A1^BC2-Whs$75#2h^jVbZ2%g&2t%j6@4OJS|0a=68F1#Aj2qz}QPJ+V(13-k4+i4KsBCGkFf^pAMSd z!8&}wtk_6fhuZjxIN=ub=`u1F^NAh5!}^m!)^l)L7nq?sz3;CVm?!tQ6iRWP+R7ZF zXWxOiy>R1NIOR>)t3T)37{q7f{T;5_!m>Thg(LVMCurZ2srn9eUmR|&1-rIS@ruV_ zslK#coI@{soe|i)x7p$fxN#%f{*pcH#(Ox+Ib|^RC5U4B3mAD=#X=lKInY)g9JGPI z?&Gl~7QHz~-VPS-3oiPBEUU75!$9}aCzWXxK~!nJYsJwi)aM1ZRthex$2iu<(mIkk zNkKHG7xX*l&`00k2gq6-GlznSrR03qpqRdbg}%a?eGYPdOZ9#`VrR9mXjL-nU_0;T z@u$R9dyyHou74^O)-Mo6odDV%ML|_T;vNE5Z)FSx#|=PrdG@XHy-tsx;jEA1Z5;vm zSLl6}@F{x3T7}unywUVqSA6|iXww_mL-RLZCZ9^SdLi-CV3=u4ibKd%z45|(5VQWT z6lF9PKaLpAYUciTH%q})4bW0v_t5~I-j#U4TvV;O-a;vFQKu5->4%>)dt|$e*$}w-sF(RcImrCiA z;*9Z8l<(YIQH_UEX0Q=DsS>Q3nfJd~>V4QpBkmVaQ~!=Oug{$5NRNz6k+_8@H$5?9 zav#8e@1vdl~eBW$y6_!$r(-r#7s-tW4SSd!eEU2o?`Q`AsJmcID zJJgF&p8;#FrPr>f>|-04=1El1uTv%d>+sP8_~{wq@;y^6V-;-MRdg9Q%q9MRoht2r zBT8Elj5WfV{tPeRXT)vGkQ={5-P-1q19+Jk(4Ku4BJ+3@^lW2ZZDL++nZxiNJAnS`%%-A5Aa0N`xC6Ge^5O~j?G2REHu~u# z+p?NWyc9`CeuepYj(5H1zjLf#mQ{@S{oS;mz)X#(kZl1@S`atAA3w1Z8ti^FcokwDm(gVh!Q!zL@i;>)KDEaWmUp!1l*t1>4ip<%rhqO}>(~6RW|`I_B9f-dTgXorgY%-)UJ6 zZ+*;cd^IVNW@w>IJoSCx>Qn6D??BA!;A$)=8cMXGKbEjR|NR!fX(r2b;#{+^nydbo)~%h3Bwvlamj%3~Q(@ z+=vgg6hnn>TYI3C)89gP&bh^*3esLz~^;hM%BSVJI1jy zdb}lLS^{pl0Im*$p~LLy3`jZy3J=ltVDHz%U%9+G57!h0BSueT)gqv#EU2gj#+uO@ zvgOhVKmP7eG5AQ{6@~udQT#HMn9{2HTTb!IOnG@FQFIMC_kk!j_1RnKgvIpF*Z7D= zV)HTzfSo&OUeQ$?AMPh8uqFv-4Kk~Py%KnI=RnSWX084FRqERX%v?RwIn3}+Xp6BE zRwPbI+I9>WeiA!V7rY;bnZ9Hmt)`#iSA!zr{R;g$k#V1nzI~VZIRnMzZ~Z)oKB|;g zAnz0k8$j#PM`pKtqE*3fe|&H zw;PPR?5E$YQmcyE=!qTdPlS0Cm>Lbw4oH2Zhh&xT7vN|u%VsdOC(WzONiB^6nm+3hcDU4%o9z#GBWt3cB-SW{dr23PCpkIjtxD*l^~ZJSMd zmEIVa)cFYd#9n!ywKsC){<@73kp@JSyD|^DBzx90>5Ve%?=sjqL)_#zYo5A=wEg&} zo6>&1r1$r6G%66Un<$p_m-<9qPy!T{Vexmc{B16O9msfHW_o1=F9SrGZ7s&SMHo$g zPc4&ICFsEha9tZb<{r#Sku?_-{2^g$BU)k?eRdFx{S6k9hb|FC&B)9q>Qn%`XUpbV zstoG;_oHLKzSXa9(5Jsj%DgjMz7OQehmOw#^zd`^b}!~vlQbKyGnSj_+r_ZbTre~< z`8A`^q1ICNXBo=tp~Uz4kx6NTEyy8;ev??@g%n9V0#^32>;^fjz|fm0^$FO)S75E* zg0MGK;neT6w6EJEW#5v zo};%h1m3cSGMCKPN#Zj{=%KH%fopkO&tf!a75}YDR`IQ*{CzurU#&z^ zPwMsC!C5i>^SLbVm*>6mpt=%!s?1UmwU)!9+RFG|TU1(i#(FTlHw9+V5BiF^xD}4y zN*}sxgTs!1uLB_H5RZSO`RZHPN?Yh!3zH2PNI!PIr7r5E?Z>$qIcba4)@IjFwxJ}J zA&>L5k5{4@mZk{LJMfcLpvI`Xk^^ah2V`VMwcUj0YAD!p=nZ~I0xe$*l>Hb6y8+J3 z6t5@VGanndfX9#FvL$G+&k|#8NeW91TpZ=n9G(0KSRIb0nF^+tVu{V+oTYa&=*@DB z(!I=x{>+4FaL@YH0_*fVhjKKnYknF-WvMQy68{n`KjptM;MQ4Y_}rEP%9lpZC>YacA`ig z^*1Fi(r1@BQ#pD+=eY%2XdT{%iM8bZ@x&UsGX6F4s^EiH08Pf>>(iR!)2Y3yr_b)< zQ!}?>>lz-pQPkZ;t#-p=2e5wI@!L12%*_#^Sl95@EAh>Hh+=RfJ}hfrJoM=(oK?(X zweEE+i&35m^iUJ}r5`-|Mw)3mleOOfiZ-OaIKaF*4!ZU->$HpOc-+WmVr&K2S_&TL zgTvQQ8QRi5*s0d2`MQi#agdO6g7y`dWHJh+iRN~BSh3FHJL6{6)f z@T3|lootm1685TavQ~xotaQRdWpGxR(I~|?uCh(_mY&f@=8?a0vjF}2G3UOOqp%*` zoRl~h>HY#|2K%z6NPpH?keRCbSoXFkgam9LGLdC8wn_3f zAHhnEPO;V*u+KZN*P`S{F9kWDrP;WY=RYLXq)Jsc%}83JKl`yRr%A$awKQ*T=luL- z$V@!I4#Qx7c3Q6*U_VF?@a z{?EZgTOL)kHSqB&fi8ZFh*m0jQT(tL@u2Thj>K5~KBB6}i3ELrGXo6jU6lh}_0Yus z32%)6#~*WaJK>7+30ZnbGFB(JW&k`sEh*2fVCW=@@)SJ%4QSfHtTK}I4Q&rt3x*eC zUx2cesmJESb;hx$qR^g#w~Rt)6KkjOmWL=u2T2#wOp}9*qn2fKYO+?0QU%tnjBTsU zI5nk@jhTBjsd1ZXtm!NeJ^l(PH{SsZCBQ%qGrKD1VPwZDNq@ca0)EOt?89c7jAhT; z|Lb|)oIJ)|VCpzC-s8EJtf4-h(bc-}gg#?)?0Oei=t+8}FO1$NdB9ybGoxVIqb7;N z>Tq<`IfA+zXDfQLYx1vuLto6KiLUoxFje>hdRJT-ula~i?5~&c@_v<~XR=^5nwi(? zoKp@+F94$U!}dnf7h!MavCK$KH983d`J13~$#AGq-%S>945%7JO+)wO0a>lm3=7yO z<-d&Z)B;=P#+txfZBm@G5uchFYsx!~Si2Rk>cew)U?U3?SjmrW&gp z+i3!-y1`lfP;e8mzwyvO z{?|L)0HRb_UoayV(^K!jcPh*A%-B(=`KOYeS93L>ul(KBO5msjsL&@Xz_VVL+NE6j z%sDDgRb-5;bn<$IPHCLFb9`+WXQO3~V9m5N$Nn^7d>hm1fQ3qINpJTCY;4TXdW@Z% z!+bhv?I}@^0TK*=kD$Dpnc@WYJUefRE3`2F|INI>sf&aSm-ore0 zqdkxmPcv|D#k*Fr9*<4=?tQFlg#SqpGm_pIOB81^IGP1N8OeDcq#0p;16+*;ujW}> zamKYcccXz7Xt%R?F6ZFg4Pa^>vAZ`xls?`ojNY7;M!_G0s+Kum@?K`RqX~X9v*O9=y4R`I@rmsZwy%?VzkQ zILprCQWfl>*t!Gk)nd)I)NT%7?_=>1-=S|eV=vC5->qb5%lR3Fk#S})n-+o?_4yv~ zrQX~NlKw)=1##b?K@YL)KqssLTQa=bY<9~2jK?01rN1VyjAX9&PNUO|ewTNu(kjzu zWm(FA1z%}RR7_Q2s-}!qd&WhZ(++NM>B2}EDRbm%CGK+kTC!f$S)0qN!#2u*tD;F` zS?hCzrU#&AH`28i{@R!<#!4*W3M|Qb-q{1Qc@=MF^7+(QIc%#Tcoi=;f0I}*LC>!l z=#EO#E+EV!6xVe?qHNWO|9o!9dreu|aC{HbuX@=p!A#Rq?*@-e1#7=Sk3D|N--)@W zX4Lwt9{g?BgUpCks25{WGSW0Gjxj*5W$+r5ejug~%VX%ACsO_02;TSe@vJwMHi^Y= zjfKUY#Wx&`h3uLTb|1Xd7F4wXYaMAl*ivt{)fr9xU%b~oss0u)S9SDRSIlFR%81v7JeM%2xCF#!ULn{Gp6BhJJhwe2t<#mwe3L%+R_=+Y*QpvhU|S>Gy*rKqn( zX)AB@eSd4)Ej-OKi0|~~o83T_zhP^(tS`?GrT-oRW#X(eC~FKinRBj=4Xwdr4W6s; zd=LC5uKKdQG3?PQ(9aWNox>KEW}d1lI-n%%f#1M5uff%G6S72-Y_%7LQq`-n)LMJt ztF7Z){ucy#=6Y06J_=y9siG7)u-Ppd?%YHXLU;CC-Q!{D*R2SN0 zW3}BGuWlf{YeJ3lU#@7*ds-*4Sb7o3pfJ(ITtP zWMu8B_$p%#Eb5n_bpbdP zrD`;{X}qg12McsJr%a+8S@vlB0?LX06bwSo$SVuE$trN?2N_cdyL$JHkVO8r( zHm2FCZY{t(xt-pq$#`1>&K1F|uD>0)zk%JtaTDMvi5LG4Z-O55o>OR;?E7%?s$w!Wx zi@un)NHj&o*dvTqAI8X;ufO2BP1shIWMPdz6u_ojNX)znK->Q6W=Gw@BQP=9}yy~!~ z>vp7fyRc}(+t;M!8fmxKb{QtIQqlDO#fu_WT__@aZ%*! z-U(rH%>Z~~I5ux2h?x$q=CPgi%qOFP>P+tkX5>Xb`D1V}8wQ(@w*D-!RMGViSn0{u zpJIQb+4HER;GSX+-La4N(VAg9+kn3w?5!_HF_=A$1EX((*p>K6`h_+I*2g9o)UgotGPS$liNqao0 ztj_dmTl&`dt*_UH|Kym4sc$1nq)Jhtv}6tO(UNtvI3lSf-!vAfy7GISQ7>+NFxLAy zP;3p!Q}AeInZMc`7*e<%3_vLu8ON|jG7uzHNGXT^j)u@=`&%i zK$f{?y$^i{^V0H>D3Xt~@K$Zr10~h?L_bxlY7|1{sHV5&pP#BN)S}#G%)cZYnZcDm z$MICRz$@k=7Qidh823@&L`6P4F~~5m<7f`%U2V^ctl>2(gJ6x3tUD%Q>J7&EUDVF! zFqB$yE7&r!a+r1mCi1|o zz?NEE1l4A?hhnMEyYfO)-mSx^G)PAn*cy0C&6zFe!~Wb`>x5$Wa4+juKs{OCAf~($ znVWdQO!AbxwGUNq_5KO|KLOTUxY0W6@T1%*3Sm?}n{hX*WA@qjd>ML6tW~6WjN-&P z2^E^iv!)|r^r6|ThA^&ElTXTXL^=E~OPMV&^B9WIh_SJSsKK3sy^37@^9eKKc=UP} z>l{VYWc2wfjOvW^tV-8s6jN_A&hv=DF9BCeKV0h?<%!t9BNYIw-2P+tpJ+igq+ zlM`T{(FtW^z|t5HC0g|pUSywR_;do#lVQ5)pngW$`>cdunbG{lA@<=sz09mE!ugd? zJtb>ZV?-TgGjiRrVR|)#L5;C^@5wR^&)IrF(Waj>ljo_Zsj)DX`qT`UJY~hH9=piW z`iTkEt%_EkPR~z^*D+yBE2k%=t(2eCD>W<-G?kByKvv7@DUxMrzDfY}p_3n$g<}VDKc*mlJzk0+U9& z_14@<;iSLBSjmJkD*??l8eO%nPz&fW*G|W7JVonRD$QQwyGG!QjA$_fwZ;`3^YAfN zqp-}Lz6lqEcV~uX5*FuWM%DHzTqA1ctv=`Gd2{gIK`S8<1w!4shtfH+3 zRbFMIzOV-69K98lAh&Uz5%D$-FS29~t(H}nYI<`OQ9U{yYd0=6JwFjO7M=ba&2iQK zbx&+%mRLQ}0qkfkYB9npIS~?7QI5a(P<3ljTuZg0t*Dtd|Cs?4aG@v#o{97xh0m^a-{Kik`fn9uT-S0G&g zM=qDZl6RDm$INV7funUayOd442H&g0;vLaq%%d_~RR)i;G)vUd-k$JhPC(8p4leZ( z%ynOf6ECyX$e%~P)QXI?sBUxhAE(&o2PyvPeO~0GS6Qr7m<1N}8O%Veg$l`7QXTRJW17rx-WK%o>Q% z*t}8bC_Uy;u*I(uV^{}2koa^@Sgvc*sBQVau|gw@GLvKMwLj*MjXniHaq3@MJz@T_6qpiSeqzN}0g$QcJI;6k@Bl0F%b(0+q(m$xs75vylnDMT930W!_Ju^L5xy^fDs?)r>Lq9_#iK;-9mF-^V;iqlbdVOqRInGhW zQn~B1$V~_7-<@gBdN(EO0(aczxzDl)O}scdfWFzir;Z7-%L(awQ@51c*JvY!}fUO^mqw;=N?If_)c#xmDoC zoRn=X??lar@dV%Z|JA(jt60nTy$aGeu$fcstX#E+eeB?s^J#NBb6GOh_M0n`?Q|dR zb7jJiXj8d~wI!^vmQVby)vIo2UpfbS%Ibz|FmZuoBO=oqS9Hk_wXlckWh*PSSH`|O zFt2ZxPzH|G$JOh&B$vv{jS#nhlZ06UOqbJVK1E15bg@<#5CCR~L3sewh^}W(ShBiMHSt?bQF&k}=+@PngM`skqNVCms znOUd+B1W}iJkMa^PB4;D z^{8zSWAcY^KCKf!2)sPFF<>xt`U{Te|VMg20*LG>QcFuo4i<&@{<@swfMY4B|T#EJ82T-|LpQ=ia?fPAh z%cB%g#s@<)s20`kGFG89o2(2lVqAeSwMCX+A5L5}W4vrCXGb)y*0Z+JtXbF~bxn_? zZG6uxtsbE@aPbYRERAKUdW=9s1fgz1aO9C?%J9_n$j$C+H%cdjnV~k$CXdzQn6!~< zG*Pb)tHm{5DYlGW8keZcH_S|GfmFynt(_t{| zF@-8}>^vGX1>!_(h?(FZwV~R3BbeLDW1vU2$!96o)?T{4Z5!(c8q`;^jEdVPBg@Rr zBCkm?=HcE%v3Az0psZUkqaQPHe>yhjfZEEVH@19*x$9gB#xmYel5rGUm0$;HV>uHGW2~deTH#WMyPHEnoP2;?(O%jed$&>zZn^ zPnjyzm9LBsgyORT!m7J`#Ooz$6OBUT&jFu}Cz*fL$Jg8U9j~9UO29D>D`ef_Ir>5E zbc`N6lltTYeIq|Ob7gmXe=qMDS2B+5x^ce>wY#}R>$lVq#+Ku%3+tVWvoBR@RG?bH zQ!;(3iuJmv>mXD6XQnCYb;P)QCBC$``U%ErMSQ3tYcg!w#azaE3n&TX=I+(}wLbBaUZL7P6q(pky=lATX%TDXV^}h4*z_W_z9K6$RPdwt)LI4}578^K zzW1oIPqYK7Pd!1oDq<-5F8VXpjA(75?$(+hM^Ha3uE5iqQ`xjm{2;=tJ!lWQj996m z)HqtD_)m*zG%M~Z6)4J&zJ^aI@5n3pdMa$8v9v&io>auVBNiFxGxC@pU34zUNs&L+ zW?D6&f9vQ*%t$+BWHatRp&c^nZUw2aqr>#1+WBZ2P3s^WQ6pR;%9-q4Dy(_6;?#(I zXe(n5CE1tJsZ#WueDBd%r(ra!Z2Cn0Qq#Nth@)BisZG@vh-{O!v`5&Nd-AFyQKnt- zYE0|0238-dUhj5xcmw5<_Q zkcGsx%~w@ftjKkQ^ryUHMy(XMaXg(1R#+Nsw9+(UL{@uwPI~;#82vP(+u1D6r>l&t zH|RaLFJioQ&M3URs*LZysA5(s=y7!8MPykxV!z|9Ts6i5URvL*b z)q!*LY~m^zT>seWOVxmE9k_CSdu^06PX^HD=;7G^xrpcpek;GIKM^j56oSGD+` zl`T=Rq{3=T(^>{UiNmJ6R;wAGs*{>AD?P&S0Ii>ls+y`CfmH=Yv$ZO+j*r1VzBb1! zhO|dLb>RH9CmA9#FtmC_y?7sE$Ry>FuEl@?9)lsJ(R|LTg=&StXAl*eev5$TAkI{XND= zYOjMqwS?9zii)k^CgKV!K$O?fc{hm_;7VN{HD_T3RoMD_vW{9?+=v{leO%pol(W_I zJ;)x77zcU|vRCWK#Zx|GN36{w%a6dAn+W!fYZRQdz>1!Ct`}lloOP;p?@=08sF*i2 z4`J1t*fKle*sJ7i@{MXs92t>PGY8tVk7}^Mmh2^m+2kuR<~LkhjH=|QgfcNUgL9ta;_KmWUgCDo9xf1nSHL>blelR%yIGHOn9 z&iOu#Gtun4qi!5P&eCRDnV-jUjV5ky10&wIDe$GzlA*$bjrv8ak-{Ghi)`dnJX)hI zwnV(Vxc%sRgt1?(`(QUy0$SERe<}JKUD=W*E~Lt)m~8**r!nkBBs2W*DHA= z<6xh-$l_WSt0?7jbJA87g_c&&dv&J~@OTt$5y6c3c(9Q1OQZJ2&Bb8YORL`-C$5W( zpPw4P5>Ljk)KoI0euJ9Ix$dJ!Vir!Dr!Viwh$L;B*#fVLj_XMSN1mx6GrsP9uwzYIi#PU%JUiv z?>G>s(jGc<#aYaNh^@NCK)gC$iy||61bP&zEOou(dJG(xiHQuK+FE6#$F`DY-J;h5 z$CZ6Mz?MuENRo;4YsHbeTwaPuY#=Ip(9oFr4sx}2PJN&nuwUZrRROZSEG6g1Y>nCB zwVDxkQCr36IDf2c5LMd1sG5}Boo%X6$2Cx>xRbB<~fFPyU)&2d(@nl?}aWkN8#O0jI@Uxl=a2A(VE~Z z`%0}9y{0YHe=s`hyj33>^)UV*&l%lv+g^j_@j55Ovd86-SvhtL4$&gXEBc3OB)Lf5 z@+wU&o%T+xoy(G6!Kh!SDpRBBiHJ#~D#1~DyGPlVD2nmQ)G(%=WmpWI~AY<7x&bVL>^;T4Q+G~}-f$A%tTb!X* z+gLp!`xpn1f1*l6d*}OB^0}t@WTWcd0nlye#mP-ty|V0E^oXX=;RSeQRe*?6DO(Ys zrV5><;xdO)Bw6;bc5<}r<2(}^`6|ZvfPEmgR9yavEiIcBGWs<7XmW%s7VTW>LoMJ{ zKF`Od*b*C|_w@VZQ|E#$ux0hS{;3{E_#GmwEbEFXnbugT>dzxE2H_I5V2-6%@M;N< zf;cUqnt3nJ!9QMEz75WbtfFdLUoEt_wk{%_dVN~9i13DObF0P(WF%*uoUJVm3ug>i zUUx>>gZcepwMYJYUNn zL;1+{v3~TQ*ZBsQMs2*2Trnh;Jj;leRHSd>IwV=wbCY>P)p}K={)Q?`9#GLmE<~oa zsq5t0&{(ooa8@X687$&ZfhLjV|7s)kzPib{rFhd5FdFCoUMn14u03Sb!!z|LWO0wj z>_ogP(v66Or(xgNyYiGX!VH4n^XjJj{tqlUSByGn6SXQL&wOc&oQg(W5O?wtP0qZ) zoZ3h3l3~K1R$ItxW@I8OlaD94&28Ai!aB2~20$K)SsvF3s#mmgBF8!4{SiV9`bsau z8Dcalvb^HKeh?}8xyG0D%6kBZH?FIYW zkM@tK_lWhYqbAi*?FT4jQ_nmO~h%PBN6d&^sM>P_IYetaqXfrA~2@j ziONqa=!_3Ul*ud0jdB?^@UA-QFxA)IWH(jY#ssu=fi_?1bNasiiCb4go=dp$EJG{k zqj=`VMdWm`6*|)lyy&twoS!1m9J`2doXlZ~DH+Sz>N&dZh4c;Al&S4GuSE7y-6^uH z&JFKBt`-hP)1%bi)^>V@pjSt@u0FSj(^7iHcpy_o3bo{OT=k$8F2zxZ8%Irs5LYoWX%86W-dogk9+<_blE7JeW89g1`%v8Cp%ZQgwA7Uyy%iABkG_H51ki& xp(qerKFePsMgPpWRzx%9Bx6cuV4`NxYeU3Q=%nxhPP0|-%@Rm8B6lY5{{!!htp)%9 literal 0 HcmV?d00001 diff --git a/extras/juce demo/src/binarydata/demo table data.xml b/extras/juce demo/src/binarydata/demo table data.xml new file mode 100644 index 0000000000..0cc79e3e16 --- /dev/null +++ b/extras/juce demo/src/binarydata/demo table data.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extras/juce demo/src/binarydata/icons.zip b/extras/juce demo/src/binarydata/icons.zip new file mode 100644 index 0000000000000000000000000000000000000000..d41b22108a42d4a28f6f8f571bec89b0a8f8a648 GIT binary patch literal 83876 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 literal 0 HcmV?d00001 diff --git a/extras/juce demo/src/binarydata/juce.png b/extras/juce demo/src/binarydata/juce.png new file mode 100644 index 0000000000000000000000000000000000000000..fcadf9097ca188c14386103ec38b718deeaeb209 GIT binary patch literal 15290 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

O5D(fw_wwgz1yzi*+Mu3M4*6*D=$q+?P0B*iSJq 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 Qvjv?xamMoXF?{_009nuiApigX literal 0 HcmV?d00001 diff --git a/extras/juce demo/src/binarydata/treedemo.xml b/extras/juce demo/src/binarydata/treedemo.xml new file mode 100644 index 0000000000..dcbb7d12f8 --- /dev/null +++ b/extras/juce demo/src/binarydata/treedemo.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extras/juce demo/src/demos/AudioDemo.cpp b/extras/juce demo/src/demos/AudioDemo.cpp new file mode 100644 index 0000000000..6642c94755 --- /dev/null +++ b/extras/juce demo/src/demos/AudioDemo.cpp @@ -0,0 +1,640 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +/** Our demo synth only has one type of sound, and it's very basic.. +*/ +class SineWaveSound : public SynthesiserSound +{ +public: + SineWaveSound (const BitArray& midiNotes_) + : midiNotes (midiNotes_) + { + } + + bool appliesToNote (const int midiNoteNumber) + { + return midiNotes [midiNoteNumber]; + } + + bool appliesToChannel (const int midiChannel) { return true; } + +private: + // this will contain the notes that this sound is attached to. + BitArray midiNotes; +}; + + +//============================================================================== +/** Our demo synth voice just plays a sine wave.. +*/ +class SineWaveVoice : public SynthesiserVoice +{ +public: + SineWaveVoice() + : angleDelta (0.0), + tailOff (0.0) + { + } + + bool canPlaySound (SynthesiserSound* sound) + { + return dynamic_cast (sound) != 0; + } + + void startNote (const int midiNoteNumber, const float velocity, + SynthesiserSound* sound, const int currentPitchWheelPosition) + { + currentAngle = 0.0; + level = velocity * 0.15; + tailOff = 0.0; + + double cyclesPerSecond = MidiMessage::getMidiNoteInHertz (midiNoteNumber); + double cyclesPerSample = cyclesPerSecond / getSampleRate(); + + angleDelta = cyclesPerSample * 2.0 * double_Pi; + } + + void stopNote (const bool allowTailOff) + { + if (allowTailOff) + { + // start a tail-off by setting this flag. The render callback will pick up on + // this and do a fade out, calling clearCurrentNote() when it's finished. + + if (tailOff == 0.0) // we only need to begin a tail-off if it's not already doing so - the + // stopNote method could be called more than once. + tailOff = 1.0; + } + else + { + // we're being told to stop playing immediately, so reset everything.. + + clearCurrentNote(); + angleDelta = 0.0; + } + } + + void pitchWheelMoved (const int newValue) + { + // can't be bothered implementing this for the demo! + } + + void controllerMoved (const int controllerNumber, const int newValue) + { + // not interested in controllers in this case. + } + + void renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples) + { + if (angleDelta != 0.0) + { + if (tailOff > 0) + { + while (--numSamples >= 0) + { + const float currentSample = (float) (sin (currentAngle) * level * tailOff); + + for (int i = outputBuffer.getNumChannels(); --i >= 0;) + *outputBuffer.getSampleData (i, startSample) += currentSample; + + currentAngle += angleDelta; + ++startSample; + + tailOff *= 0.99; + + if (tailOff <= 0.005) + { + clearCurrentNote(); + + angleDelta = 0.0; + break; + } + } + } + else + { + while (--numSamples >= 0) + { + const float currentSample = (float) (sin (currentAngle) * level); + + for (int i = outputBuffer.getNumChannels(); --i >= 0;) + *outputBuffer.getSampleData (i, startSample) += currentSample; + + currentAngle += angleDelta; + ++startSample; + } + } + } + } + +private: + double currentAngle, angleDelta, level, tailOff; +}; + +//============================================================================== +/** This is an audio source that streams the output of our demo synth. +*/ +class SynthAudioSource : public AudioSource +{ +public: + //============================================================================== + // this collects real-time midi messages from the midi input device, and + // turns them into blocks that we can process in our audio callback + MidiMessageCollector midiCollector; + + // this represents the state of which keys on our on-screen keyboard are held + // down. When the mouse is clicked on the keyboard component, this object also + // generates midi messages for this, which we can pass on to our synth. + MidiKeyboardState keyboardState; + + // the synth itself! + Synthesiser synth; + + //============================================================================== + SynthAudioSource() + { + // we'll be mixing two different types of sound, so here we'll create two + // sets of note maps, putting each sound on a different octave of the keyboard: + BitArray sinewaveNotes, samplerNotes; + + int i; + for (i = 0; i < 128; ++i) + { + if (((i / 12) & 1) != 0) + sinewaveNotes.setBit (i); + else + samplerNotes.setBit (i); + } + + // add a wave sound, which will get applied to some of the notes.. + synth.addSound (new SineWaveSound (sinewaveNotes)); + + // give our synth a few voices that can play the wave sound.. + for (i = 4; --i >= 0;) + synth.addVoice (new SineWaveVoice()); + + WavAudioFormat wavFormat; + AudioFormatReader* audioReader + = wavFormat.createReaderFor (new MemoryInputStream (BinaryData::cello_wav, + BinaryData::cello_wavSize, + false), + true); + + synth.addSound (new SamplerSound (T("demo sound"), + *audioReader, + samplerNotes, + 74, // root midi note + 0.1, // attack time + 0.1, // release time + 10.0 // maximum sample length + )); + + delete audioReader; + + // and give the synth some sampler voices to play the sampled sound.. + for (i = 4; --i >= 0;) + synth.addVoice (new SamplerVoice()); + } + + void prepareToPlay (int samplesPerBlockExpected, + double sampleRate) + { + midiCollector.reset (sampleRate); + + synth.setCurrentPlaybackSampleRate (sampleRate); + } + + void releaseResources() + { + } + + void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) + { + // the synth always adds its output to the audio buffer, so we have to clear it + // first.. + bufferToFill.clearActiveBufferRegion(); + + // fill a midi buffer with incoming messages from the midi input. + MidiBuffer incomingMidi; + midiCollector.removeNextBlockOfMessages (incomingMidi, bufferToFill.numSamples); + + // pass these messages to the keyboard state so that it can update the component + // to show on-screen which keys are being pressed on the physical midi keyboard. + // This call will also add midi messages to the buffer which were generated by + // the mouse-clicking on the on-screen keyboard. + keyboardState.processNextMidiBuffer (incomingMidi, 0, bufferToFill.numSamples, true); + + // and now get the synth to process the midi events and generate its output. + synth.renderNextBlock (*bufferToFill.buffer, incomingMidi, 0, bufferToFill.numSamples); + } +}; + +//============================================================================== +class AudioInputWaveformDisplay : public Component, + public Timer, + public AudioIODeviceCallback +{ +public: + AudioInputWaveformDisplay() + { + bufferPos = 0; + bufferSize = 2048; + circularBuffer = (float*) juce_calloc (sizeof (float) * bufferSize); + currentInputLevel = 0.0f; + numSamplesIn = 0; + + setOpaque (true); + startTimer (1000 / 50); // repaint every 1/50 of a second + } + + ~AudioInputWaveformDisplay() + { + juce_free (circularBuffer); + } + + void paint (Graphics& g) + { + g.fillAll (Colours::black); + g.setColour (Colours::lightgreen); + + const float halfHeight = getHeight() * 0.5f; + + int bp = bufferPos; + + for (int x = getWidth(); --x >= 0;) + { + const int samplesAgo = getWidth() - x; + const float level = circularBuffer [(bp + bufferSize - samplesAgo) % bufferSize]; + + if (level > 0.01f) + g.drawLine ((float) x, halfHeight - halfHeight * level, + (float) x, halfHeight + halfHeight * level); + } + } + + void timerCallback() + { + repaint(); + } + + void addSample (const float sample) + { + currentInputLevel += fabsf (sample); + + const int samplesToAverage = 128; + + if (++numSamplesIn > samplesToAverage) + { + circularBuffer [bufferPos++ % bufferSize] = currentInputLevel / samplesToAverage; + + numSamplesIn = 0; + currentInputLevel = 0.0f; + } + } + + void audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) + { + for (int i = 0; i < totalNumInputChannels; ++i) + { + if (inputChannelData [i] != 0) + { + for (int j = 0; j < numSamples; ++j) + addSample (inputChannelData [i][j]); + + break; + } + } + } + + void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock) + { + zeromem (circularBuffer, sizeof (float) * bufferSize); + } + + void audioDeviceStopped() + { + zeromem (circularBuffer, sizeof (float) * bufferSize); + } + +private: + float* circularBuffer; + float currentInputLevel; + int volatile bufferPos, bufferSize, numSamplesIn; +}; + + +//============================================================================== +class AudioDemo : public Component, + public FilenameComponentListener, + public ButtonListener, + public ChangeListener, + public AudioIODeviceCallback +{ + //============================================================================== + FilenameComponent* fileChooser; + TextButton* playButton; + TextButton* stopButton; + TextButton* audioSettingsButton; + + MidiKeyboardComponent* keyboardComponent; + AudioInputWaveformDisplay* waveformComponent; + + //============================================================================== + // this wraps the actual audio device + AudioDeviceManager audioDeviceManager; + + // this allows an audio source to be streamed to the IO device + AudioSourcePlayer audioSourcePlayer; + + // this controls the playback of a positionable audio stream, handling the + // starting/stopping and sample-rate conversion + AudioTransportSource transportSource; + + // this source contains our synth, and generates its output + SynthAudioSource synthSource; + + // this source is used to mix together the output from our synth source + // and wave player source + MixerAudioSource mixerSource; + + // this is the actual stream that's going to read from the audio file. + AudioFormatReaderSource* currentAudioFileSource; + + File currentFile; + +public: + //============================================================================== + AudioDemo() + { + setName (T("Audio")); + + currentAudioFileSource = 0; + + //============================================================================== + AudioFormatManager formatManager; + formatManager.registerBasicFormats(); + + addAndMakeVisible (fileChooser = new FilenameComponent (T("audiofile"), + File::nonexistent, + true, false, false, + formatManager.getWildcardForAllFormats(), + String::empty, + T("(choose a WAV or AIFF file to play)"))); + fileChooser->addListener (this); + fileChooser->setBrowseButtonText (T("browse")); + + addAndMakeVisible (playButton = new TextButton (T("play"), + T("click here to play the current audio file"))); + playButton->addButtonListener (this); + playButton->setColour (TextButton::buttonColourId, Colours::lightgreen); + playButton->setColour (TextButton::buttonOnColourId, Colours::lightgreen); + playButton->setConnectedEdges (Button::ConnectedOnRight); + + addAndMakeVisible (stopButton = new TextButton (T("stop"), + T("click here to play the current audio file"))); + stopButton->addButtonListener (this); + stopButton->setColour (TextButton::buttonColourId, Colours::red); + stopButton->setColour (TextButton::buttonOnColourId, Colours::red); + stopButton->setConnectedEdges (Button::ConnectedOnLeft); + + addAndMakeVisible (audioSettingsButton = new TextButton (T("show audio settings..."), + T("click here to change the audio device settings"))); + audioSettingsButton->addButtonListener (this); + + addAndMakeVisible (keyboardComponent = new MidiKeyboardComponent (synthSource.keyboardState, + MidiKeyboardComponent::horizontalKeyboard)); + + + addAndMakeVisible (waveformComponent = new AudioInputWaveformDisplay()); + + //============================================================================== + // register for start/stop messages from the transport source.. + transportSource.addChangeListener (this); + + // and initialise the device manager with no settings so that it picks a + // default device to use. + const String error (audioDeviceManager.initialise (1, /* number of input channels */ + 2, /* number of output channels */ + 0, /* no XML settings.. */ + true /* select default device on failure */)); + + if (error.isNotEmpty()) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Audio Demo"), + T("Couldn't open an output device!\n\n") + error); + } + else + { + // add the two audio sources to our mixer.. + mixerSource.addInputSource (&transportSource, false); + mixerSource.addInputSource (&synthSource, false); + + // ..and connect the mixer to our source player. + audioSourcePlayer.setSource (&mixerSource); + + // start the IO device pulling its data from our callback.. + audioDeviceManager.setAudioCallback (this); + + // and we need to send midi input to our synth for processing + audioDeviceManager.addMidiInputCallback (String::empty, &synthSource.midiCollector); + } + } + + ~AudioDemo() + { + audioDeviceManager.removeMidiInputCallback (&synthSource.midiCollector); + audioDeviceManager.setAudioCallback (0); + + transportSource.removeChangeListener (this); + + transportSource.setSource (0); + deleteAndZero (currentAudioFileSource); + + audioSourcePlayer.setSource (0); + + deleteAllChildren(); + } + + //============================================================================== + void audioDeviceIOCallback (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples) + { + // pass the audio callback on to our player source, and also the waveform display comp + audioSourcePlayer.audioDeviceIOCallback (inputChannelData, totalNumInputChannels, outputChannelData, totalNumOutputChannels, numSamples); + waveformComponent->audioDeviceIOCallback (inputChannelData, totalNumInputChannels, outputChannelData, totalNumOutputChannels, numSamples); + } + + void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock) + { + audioSourcePlayer.audioDeviceAboutToStart (sampleRate, numSamplesPerBlock); + waveformComponent->audioDeviceAboutToStart (sampleRate, numSamplesPerBlock); + } + + void audioDeviceStopped() + { + audioSourcePlayer.audioDeviceStopped(); + waveformComponent->audioDeviceStopped(); + } + + //============================================================================== + void paint (Graphics& g) + { + // print some text to explain what state we're in. + + g.setColour (Colours::black); + g.setFont (14.0f); + + String s; + + if (transportSource.isPlaying()) + s = T("playing"); + else + s = T("stopped"); + + if (currentAudioFileSource == 0) + s += T(" - no source file selected"); + else + s += T(" - file: \"") + currentFile.getFullPathName() + T("\""); + + g.drawText (s, 250, 50, getWidth() - 250, 24, Justification::centredLeft, true); + } + + void resized() + { + fileChooser->setBounds (10, 10, getWidth() - 20, 24); + playButton->setBounds (10, 50, 100, 24); + stopButton->setBounds (110, 50, 100, 24); + audioSettingsButton->setBounds (10, 120, 200, 24); + audioSettingsButton->changeWidthToFitText(); + keyboardComponent->setBounds (10, 200, getWidth() - 20, 60); + waveformComponent->setBounds (10, 300, 400, 80); + + updateButtons(); + } + + void updateButtons() + { + playButton->setEnabled (currentAudioFileSource != 0 && ! transportSource.isPlaying()); + stopButton->setEnabled (transportSource.isPlaying()); + repaint(); + } + + void buttonClicked (Button* button) + { + if (button == playButton) + { + transportSource.setPosition (0.0); + transportSource.start(); + } + else if (button == stopButton) + { + transportSource.stop(); + } + else if (button == audioSettingsButton) + { + // Create an AudioDeviceSelectorComponent which contains the audio choice widgets... + + AudioDeviceSelectorComponent audioSettingsComp (audioDeviceManager, + 0, 1, + 2, 2, + true); + + // ...and show it in a DialogWindow... + audioSettingsComp.setSize (500, 400); + + DialogWindow::showModalDialog (T("Audio Settings"), + &audioSettingsComp, + this, + Colours::azure, + true); + } + } + + void filenameComponentChanged (FilenameComponent*) + { + // this is called when the user changes the filename in the file chooser box + + File audioFile (fileChooser->getCurrentFile()); + + // unload the previous file source and delete it.. + transportSource.stop(); + transportSource.setSource (0); + deleteAndZero (currentAudioFileSource); + + // create a new file source from the file.. + + // get a format manager and set it up with the basic types (wav and aiff). + AudioFormatManager formatManager; + formatManager.registerBasicFormats(); + + AudioFormatReader* reader = formatManager.createReaderFor (audioFile); + + if (reader != 0) + { + currentFile = audioFile; + + currentAudioFileSource = new AudioFormatReaderSource (reader, true); + + // ..and plug it into our transport source + transportSource.setSource (currentAudioFileSource, + 32768, // tells it to buffer this many samples ahead + reader->sampleRate); + } + + updateButtons(); + } + + void changeListenerCallback (void*) + { + // callback from the transport source to tell us that play has + // started or stopped, so update our buttons.. + updateButtons(); + } +}; + + +//============================================================================== +Component* createAudioDemo() +{ + return new AudioDemo(); +} diff --git a/extras/juce demo/src/demos/DragAndDropDemo.cpp b/extras/juce demo/src/demos/DragAndDropDemo.cpp new file mode 100644 index 0000000000..1496c339bf --- /dev/null +++ b/extras/juce demo/src/demos/DragAndDropDemo.cpp @@ -0,0 +1,239 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + +//============================================================================== +// this is the listbox containing the draggable source components.. + +class DragAndDropDemoSource : public ListBox, + public ListBoxModel +{ +public: + //============================================================================== + DragAndDropDemoSource() + : ListBox (T("d+d source"), 0) + { + // tells the ListBox that this object supplies the info about + // its rows. + setModel (this); + + setMultipleSelectionEnabled (true); + } + + ~DragAndDropDemoSource() + { + } + + //============================================================================== + // The following methods implement the necessary virtual functions from ListBoxModel, + // telling the listbox how many rows there are, painting them, etc. + int getNumRows() + { + return 30; + } + + void paintListBoxItem (int rowNumber, + Graphics& g, + int width, int height, + bool rowIsSelected) + { + if (rowIsSelected) + g.fillAll (Colours::lightblue); + + g.setColour (Colours::black); + g.setFont (height * 0.7f); + + g.drawText (T("Row Number ") + String (rowNumber + 1), + 5, 0, width, height, + Justification::centredLeft, true); + } + + const String getDragSourceDescription (const SparseSet& selectedRows) + { + // for our drag desctription, we'll just make a list of the selected + // row numbers - this will be picked up by the drag target and displayed in + // its box. + String desc; + + for (int i = 0; i < selectedRows.size(); ++i) + desc << (selectedRows [i] + 1) << T(" "); + + return desc.trim(); + } + + //============================================================================== + // this just fills in the background of the listbox + void paint (Graphics& g) + { + g.fillAll (Colours::white.withAlpha (0.7f)); + } + + /*void listBoxItemClicked (int row, const MouseEvent& e) + { + PopupMenu m; + m.addItem (1, "sdfsdfs"); + + m.show(); + + //AlertWindow::showMessageBox (AlertWindow::InfoIcon, "asdfsadfads", "srdfsdfa"); + DocumentWindow* dw = new DocumentWindow ("sfdsd", Colours::white, DocumentWindow::allButtons, true); + dw->setBounds (100, 100, 500, 500); + dw->setVisible (true); + }*/ +}; + + +//============================================================================== +// and this is a component that can have things dropped onto it.. + +class DragAndDropDemoTarget : public Component, + public DragAndDropTarget +{ + bool somethingIsBeingDraggedOver; + String message; + +public: + //============================================================================== + DragAndDropDemoTarget() + { + somethingIsBeingDraggedOver = false; + + message = T("Drag-and-drop some rows from the top-left box onto this component!"); + } + + ~DragAndDropDemoTarget() + { + } + + //============================================================================== + void paint (Graphics& g) + { + g.fillAll (Colours::green.withAlpha (0.2f)); + + // draw a red line around the comp if the user's currently dragging something over it.. + if (somethingIsBeingDraggedOver) + { + g.setColour (Colours::red); + g.drawRect (0, 0, getWidth(), getHeight(), 3); + } + + g.setColour (Colours::black); + g.setFont (14.0f); + g.drawFittedText (message, 10, 0, getWidth() - 20, getHeight(), Justification::centred, 4); + } + + //============================================================================== + bool isInterestedInDragSource (const String& sourceDescription) + { + // normally you'd check the sourceDescription value to see if it's the + // sort of object that you're interested in before returning true, but for + // the demo, we'll say yes to anything.. + return true; + } + + void itemDragEnter (const String& sourceDescription, + Component* sourceComponent, + int x, int y) + { + somethingIsBeingDraggedOver = true; + repaint(); + } + + void itemDragMove (const String& sourceDescription, + Component* sourceComponent, + int x, int y) + { + } + + void itemDragExit (const String& sourceDescription, + Component* sourceComponent) + { + somethingIsBeingDraggedOver = false; + repaint(); + } + + void itemDropped (const String& sourceDescription, + Component* sourceComponent, + int x, int y) + { + message = T("last rows dropped: ") + sourceDescription; + + somethingIsBeingDraggedOver = false; + repaint(); + } +}; + + +//============================================================================== +class DragAndDropDemo : public Component, + public DragAndDropContainer +{ + //============================================================================== + DragAndDropDemoSource* source; + DragAndDropDemoTarget* target; + +public: + //============================================================================== + DragAndDropDemo() + { + setName (T("Drag-and-Drop")); + + source = new DragAndDropDemoSource(); + addAndMakeVisible (source); + + target = new DragAndDropDemoTarget(); + addAndMakeVisible (target); + } + + ~DragAndDropDemo() + { + deleteAllChildren(); + } + + void resized() + { + source->setBounds (10, 10, 250, 150); + target->setBounds (getWidth() - 260, getHeight() - 160, 250, 150); + } + + //============================================================================== + // (need to put this in to disambiguate the new/delete operators used in the + // two base classes). + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +Component* createDragAndDropDemo() +{ + return new DragAndDropDemo(); +} diff --git a/extras/juce demo/src/demos/FontsAndTextDemo.cpp b/extras/juce demo/src/demos/FontsAndTextDemo.cpp new file mode 100644 index 0000000000..7de327ce42 --- /dev/null +++ b/extras/juce demo/src/demos/FontsAndTextDemo.cpp @@ -0,0 +1,215 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class FontsAndTextDemo : public Component, + public ListBoxModel, + public ButtonListener, + public SliderListener +{ + OwnedArray fonts; + ListBox* listBox; + TextEditor* textBox; + ToggleButton* boldButton; + ToggleButton* italicButton; + Slider* sizeSlider; + + StretchableLayoutManager verticalLayout; + StretchableLayoutManager horizontalLayout; + + StretchableLayoutResizerBar* verticalDividerBar; + StretchableLayoutResizerBar* horizontalDividerBar; + +public: + //============================================================================== + FontsAndTextDemo() + { + setName (T("Fonts")); + + Font::findFonts (fonts); + + addAndMakeVisible (listBox = new ListBox (T("fonts"), this)); + listBox->setRowHeight (28); + + addAndMakeVisible (textBox = new TextEditor()); + + textBox->setColour (TextEditor::backgroundColourId, Colours::white); + textBox->setColour (TextEditor::outlineColourId, Colours::black.withAlpha (0.5f)); + + textBox->setMultiLine (true, true); + textBox->setReturnKeyStartsNewLine (true); + textBox->setText (T("The Quick Brown Fox Jumped Over The Lazy Dog\n\nAa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz 0123456789")); + + addAndMakeVisible (boldButton = new ToggleButton (T("bold"))); + boldButton->addButtonListener (this); + + addAndMakeVisible (italicButton = new ToggleButton (T("italic"))); + italicButton->addButtonListener (this); + + addAndMakeVisible (sizeSlider = new Slider (T("size"))); + sizeSlider->setRange (3.0, 50.0, 0.1); + sizeSlider->setValue (20.0); + sizeSlider->addListener (this); + + listBox->selectRow (0); + listBox->setColour (ListBox::outlineColourId, Colours::black.withAlpha (0.5f)); + listBox->setOutlineThickness (1); + + // set up the layout and resizer bars.. + + verticalLayout.setItemLayout (0, -0.2, -0.8, -0.5); // width of the font list must be + // between 20% and 80%, preferably 50% + verticalLayout.setItemLayout (1, 8, 8, 8); // the vertical divider drag-bar thing is always 8 pixels wide + verticalLayout.setItemLayout (2, 150, -1.0, -0.5); // the components on the right must be + // at least 150 pixels wide, preferably 50% of the total width + + verticalDividerBar = new StretchableLayoutResizerBar (&verticalLayout, 1, true); + addAndMakeVisible (verticalDividerBar); + + horizontalLayout.setItemLayout (0, -0.2, -1.0, -0.4); // height of the font text box must be + // between 20% and 100%, preferably 40% + horizontalLayout.setItemLayout (1, 8, 8, 8); // the horizontal divider drag-bar thing is always 8 pixels high + horizontalLayout.setItemLayout (2, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (3, 15, 20, 20); // the italic button would like to be 20 pixels high + horizontalLayout.setItemLayout (4, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (5, 15, 20, 20); // the bold button would like to be 20 pixels high + horizontalLayout.setItemLayout (6, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (7, 15, 20, 20); // the italic button would like to be 20 pixels high + horizontalLayout.setItemLayout (8, 2, 5, 5); // a gap between the controls + horizontalLayout.setItemLayout (9, 15, 20, 20); // the copy code button would like to be 20 pixels high + horizontalLayout.setItemLayout (10, 5, -1.0, 5); // add a gap at the bottom that will fill up any + // space left over - this will stop the + // sliders from always sticking to the + // bottom of the window + + horizontalDividerBar = new StretchableLayoutResizerBar (&horizontalLayout, 1, false); + addAndMakeVisible (horizontalDividerBar); + } + + ~FontsAndTextDemo() + { + deleteAllChildren(); + } + + void resized() + { + // lay out the list box and vertical divider.. + Component* vcomps[] = { listBox, verticalDividerBar, 0 }; + + verticalLayout.layOutComponents (vcomps, 3, + 4, 4, getWidth() - 8, getHeight() - 8, + false, // lay out side-by-side + true); // resize the components' heights as well as widths + + // now lay out the text box and the controls below it.. + Component* hcomps[] = { textBox, horizontalDividerBar, 0, + boldButton, 0, + italicButton, 0, + sizeSlider }; + + horizontalLayout.layOutComponents (hcomps, 8, + 4 + verticalLayout.getItemCurrentPosition (2), // for their widths, refer to the vertical layout state + 4, + verticalLayout.getItemCurrentAbsoluteSize (2), + getHeight() - 8, + true, // lay out above each other + true); // resize the components' widths as well as heights + } + + // implements the ListBoxModel method + int getNumRows() + { + return fonts.size(); + } + + // implements the ListBoxModel method + void paintListBoxItem (int rowNumber, + Graphics& g, + int width, int height, + bool rowIsSelected) + { + if (rowIsSelected) + g.fillAll (Colours::lightblue); + + if (fonts [rowNumber] != 0) + { + Font font (*fonts [rowNumber]); + font.setHeight (height * 0.7f); + + g.setFont (font); + g.drawText (font.getTypefaceName(), + 4, 0, width - 4, height, + Justification::centredLeft, true); + } + } + + void updatePreviewBoxText() + { + Font* f = fonts [listBox->getSelectedRow()]; + + if (f != 0) + { + Font font (*f); + + font.setHeight ((float) sizeSlider->getValue()); + font.setBold (boldButton->getToggleState()); + font.setItalic (italicButton->getToggleState()); + + textBox->applyFontToAllText (font); + } + } + + void selectedRowsChanged (int lastRowselected) + { + updatePreviewBoxText(); + } + + void buttonClicked (Button* button) + { + updatePreviewBoxText(); + } + + void sliderValueChanged (Slider*) + { + // (this is called when the size slider is moved) + updatePreviewBoxText(); + } +}; + + +//============================================================================== +Component* createFontsAndTextDemo() +{ + return new FontsAndTextDemo(); +} diff --git a/extras/juce demo/src/demos/InterprocessCommsDemo.cpp b/extras/juce demo/src/demos/InterprocessCommsDemo.cpp new file mode 100644 index 0000000000..ae7fe623f2 --- /dev/null +++ b/extras/juce demo/src/demos/InterprocessCommsDemo.cpp @@ -0,0 +1,334 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class InterprocessCommsDemo : public Component, + public ButtonListener, + public ComboBoxListener +{ +public: + //============================================================================== + InterprocessCommsDemo() + { + server = new DemoInterprocessConnectionServer (*this); + + setName (T("Interprocess Communication")); + + // create all our UI bits and pieces.. + addAndMakeVisible (modeSelector = new ComboBox (T("mode:"))); + modeSelector->setBounds (100, 25, 200, 24); + (new Label (modeSelector->getName(), modeSelector->getName()))->attachToComponent (modeSelector, true); + + modeSelector->addItem (T("(Disconnected)"), 8); + modeSelector->addSeparator(); + modeSelector->addItem (T("Named pipe (listening)"), 1); + modeSelector->addItem (T("Named pipe (connect to existing pipe)"), 5); + modeSelector->addSeparator(); + modeSelector->addItem (T("Socket (listening)"), 2); + modeSelector->addItem (T("Socket (connect to existing socket)"), 6); + + modeSelector->setSelectedId (8); + modeSelector->addListener (this); + + addAndMakeVisible (pipeName = new TextEditor (T("pipe name:"))); + pipeName->setBounds (100, 60, 130, 24); + pipeName->setMultiLine (false); + pipeName->setText (T("juce demo pipe")); + (new Label (pipeName->getName(), pipeName->getName()))->attachToComponent (pipeName, true); + + addAndMakeVisible (socketNumber = new TextEditor (T("socket port:"))); + socketNumber->setBounds (350, 60, 80, 24); + socketNumber->setMultiLine (false); + socketNumber->setText (T("12345")); + socketNumber->setInputRestrictions (5, T("0123456789")); + (new Label (socketNumber->getName(), socketNumber->getName()))->attachToComponent (socketNumber, true); + + addAndMakeVisible (socketHost = new TextEditor (T("socket host:"))); + socketHost->setBounds (530, 60, 130, 24); + socketHost->setMultiLine (false); + socketHost->setText (T("localhost")); + socketNumber->setInputRestrictions (512); + (new Label (socketHost->getName(), socketHost->getName()))->attachToComponent (socketHost, true); + + addChildComponent (sendText = new TextEditor (T("sendtext"))); + sendText->setBounds (30, 120, 200, 24); + sendText->setMultiLine (false); + sendText->setReadOnly (false); + sendText->setText (T("testing 1234")); + + addChildComponent (sendButton = new TextButton (T("send"), T("Fires off the message"))); + sendButton->setBounds (240, 120, 200, 24); + sendButton->changeWidthToFitText(); + sendButton->addButtonListener (this); + + addChildComponent (incomingMessages = new TextEditor (T("messages"))); + incomingMessages->setReadOnly (true); + incomingMessages->setMultiLine (true); + incomingMessages->setBounds (30, 150, 500, 250); + + // call this to set up everything's state correctly. + comboBoxChanged (0); + } + + ~InterprocessCommsDemo() + { + close(); + delete server; + + deleteAllChildren(); + } + + void buttonClicked (Button* button) + { + if (button == sendButton) + { + // The send button has been pressed, so write out the contents of the + // text box to the socket or pipe, depending on which is active. + const String text (sendText->getText()); + MemoryBlock messageData ((const char*) text, text.length()); + + for (int i = activeConnections.size(); --i >= 0;) + { + if (! activeConnections[i]->sendMessage (messageData)) + { + // the write failed, so indicate that the connection has broken.. + appendMessage (T("send message failed!")); + } + } + } + } + + void comboBoxChanged (ComboBox*) + { + // This is called when the user picks a different mode from the drop-down list.. + const int modeId = modeSelector->getSelectedId(); + + close(); + + if (modeId < 8) + { + open ((modeId & 2) != 0, + (modeId & 4) != 0); + } + } + + //============================================================================== + // Just closes any connections that are currently open. + void close() + { + server->stop(); + activeConnections.clear(); + + // Reset the UI stuff to a disabled state. + sendText->setVisible (false); + sendButton->setVisible (false); + incomingMessages->setText (String::empty, false); + incomingMessages->setVisible (true); + + appendMessage ( + "To demonstrate named pipes, you'll need to run two instances of the JuceDemo application on this machine. On " + "one of them, select \"named pipe (listening)\", and then on the other, select \"named pipe (connect to existing pipe)\". Then messages that you " + "send from the 'sender' app should appear on the listener app. The \"pipe name\" field lets you choose a name for the pipe\n\n" + "To demonstrate sockets, you can either run two instances of the app on the same machine, or on different " + "machines on your network. In each one enter a socket number, then on one of the apps, select the " + "\"Socket (listening)\" mode. On the other, enter the host address of the listening app, and select \"Socket (connect to existing socket)\". " + "Messages should then be be sent between the apps in the same way as through the named pipes."); + } + + void open (bool asSocket, bool asSender) + { + close(); + + // Make the appropriate bits of UI visible.. + sendText->setVisible (true); + sendButton->setVisible (true); + + incomingMessages->setText (String::empty, false); + incomingMessages->setVisible (true); + + // and try to open the socket or pipe... + bool openedOk = false; + + if (asSender) + { + // if we're connecting to an existing server, we can just create a connection object + // directly. + DemoInterprocessConnection* newConnection = new DemoInterprocessConnection (*this); + + if (asSocket) + { + openedOk = newConnection->connectToSocket (socketHost->getText(), + socketNumber->getText().getIntValue(), + 1000); + } + else + { + openedOk = newConnection->connectToPipe (pipeName->getText()); + } + + if (openedOk) + activeConnections.add (newConnection); + else + delete newConnection; + } + else + { + // if we're starting up a server, we need to tell the server to start waiting for + // clients to connect. It'll then create connection objects for us when clients arrive. + if (asSocket) + { + openedOk = server->beginWaitingForSocket (socketNumber->getText().getIntValue()); + + if (openedOk) + appendMessage (T("Waiting for another app to connect to this socket..")); + } + else + { + DemoInterprocessConnection* newConnection = new DemoInterprocessConnection (*this); + + openedOk = newConnection->createPipe (pipeName->getText()); + + if (openedOk) + { + appendMessage (T("Waiting for another app to connect to this pipe..")); + activeConnections.add (newConnection); + } + else + { + delete newConnection; + } + } + } + + if (! openedOk) + { + modeSelector->setSelectedId (8); + + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Interprocess Comms Demo"), + T("Failed to open the socket or pipe...")); + } + } + + void appendMessage (const String& message) + { + incomingMessages->setCaretPosition (INT_MAX); + incomingMessages->insertTextAtCursor (message + T("\n")); + incomingMessages->setCaretPosition (INT_MAX); + } + + //============================================================================== + class DemoInterprocessConnection : public InterprocessConnection + { + InterprocessCommsDemo& owner; + int ourNumber; + + public: + DemoInterprocessConnection (InterprocessCommsDemo& owner_) + : InterprocessConnection (true), + owner (owner_) + { + static int totalConnections = 0; + ourNumber = ++totalConnections; + } + + ~DemoInterprocessConnection() + { + } + + void connectionMade() + { + owner.appendMessage (T("Connection #") + String (ourNumber) + T(" - connection started")); + } + + void connectionLost() + { + owner.appendMessage (T("Connection #") + String (ourNumber) + T(" - connection lost")); + } + + void messageReceived (const MemoryBlock& message) + { + owner.appendMessage (T("Connection #") + String (ourNumber) + T(" - message received: ") + message.toString()); + } + }; + + //============================================================================== + class DemoInterprocessConnectionServer : public InterprocessConnectionServer + { + InterprocessCommsDemo& owner; + + public: + DemoInterprocessConnectionServer (InterprocessCommsDemo& owner_) + : owner (owner_) + { + } + + ~DemoInterprocessConnectionServer() + { + } + + InterprocessConnection* createConnectionObject() + { + DemoInterprocessConnection* newConnection = new DemoInterprocessConnection (owner); + + owner.activeConnections.add (newConnection); + return newConnection; + } + }; + + OwnedArray activeConnections; + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + ComboBox* modeSelector; + TextEditor* sendText; + TextButton* sendButton; + TextEditor* incomingMessages; + + TextEditor* pipeName; + TextEditor* socketNumber; + TextEditor* socketHost; + + DemoInterprocessConnectionServer* server; +}; + + +//============================================================================== +Component* createInterprocessCommsDemo() +{ + return new InterprocessCommsDemo(); +} diff --git a/extras/juce demo/src/demos/OpenGLDemo.cpp b/extras/juce demo/src/demos/OpenGLDemo.cpp new file mode 100644 index 0000000000..7dadef9e06 --- /dev/null +++ b/extras/juce demo/src/demos/OpenGLDemo.cpp @@ -0,0 +1,257 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifdef _WIN32 + #include +#elif ! defined (LINUX) + #include + #include +#endif + +#include "../jucedemo_headers.h" + +#if JUCE_OPENGL + +#ifdef _WIN32 + #include + #include + #ifdef _MSC_VER + #pragma comment(lib, "OpenGL32.Lib") + #pragma comment(lib, "GlU32.Lib") + #endif +#elif defined (LINUX) + #include + #include + #undef KeyPress +#else + #include + #include +#endif + +#ifndef GL_BGRA_EXT + #define GL_BGRA_EXT 0x80e1 +#endif + +//============================================================================== +class DemoOpenGLCanvas : public OpenGLComponent, + public Timer +{ + float rotation, delta; + Image* image; + +public: + DemoOpenGLCanvas() + { + rotation = 0.0f; + delta = 1.0f; + + Image* im = ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize); + image = new Image (Image::RGB, 512, 512, true); + Graphics g (*image); + g.fillAll (Colours::white); + g.drawImage (im, 0, 0, 512, 512, 0, 0, im->getWidth(), im->getHeight()); + delete im; + + startTimer (20); + } + + ~DemoOpenGLCanvas() + { + delete image; + } + + // when the component creates a new internal context, this is called, and + // we'll use the opportunity to create the textures needed. + void newOpenGLContextCreated() + { + // (no need to call makeCurrentContextActive(), as that will have + // been done for us before the method call). + glClearColor (0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth (1.0); + + glDepthFunc (GL_LESS); + glEnable (GL_DEPTH_TEST); + glEnable (GL_TEXTURE_2D); + glEnable (GL_BLEND); + glShadeModel (GL_SMOOTH); + + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glPixelStorei (GL_UNPACK_ALIGNMENT, 4); + + int stride, pixStride; + const void* pixels = image->lockPixelDataReadOnly (0, 0, image->getWidth(), image->getHeight(), stride, pixStride); + + glTexImage2D (GL_TEXTURE_2D, 0, 4, image->getWidth(), image->getHeight(), + 0, GL_RGB, + GL_UNSIGNED_BYTE, pixels); + image->releasePixelDataReadOnly (pixels); + + glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint (GL_POINT_SMOOTH_HINT, GL_NICEST); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + void mouseDrag (const MouseEvent& e) + { + delta = e.getDistanceFromDragStartX() / 100.0f; + repaint(); + } + + void renderOpenGL() + { + glClearColor (0.8f, 0.0f, 0.4f, 0.0f); + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho (0.0, getWidth(), 0.0, getHeight(), 0, 1); + + glColor4f (1.0f, 1.0f, 1.0f, fabsf (sinf (rotation / 100.0f))); + glBegin(GL_QUADS); + glTexCoord2i (0, 0); glVertex2f (50.0f, getHeight() - 50.0f); + glTexCoord2i (1, 0); glVertex2f (getWidth() - 50.0f, getHeight() - 50.0f); + glTexCoord2i (1, 1); glVertex2f (getWidth() - 50.0f, 50.0f); + glTexCoord2i (0, 1); glVertex2f (50.0f, 50.0f); + glEnd(); + + glMatrixMode (GL_PROJECTION); + glLoadIdentity(); + + glClear (GL_DEPTH_BUFFER_BIT); + gluPerspective (45.0f, + getWidth() / (GLfloat) getHeight(), + 0.1f, + 100.0f); + + glMatrixMode (GL_MODELVIEW); + + glLoadIdentity(); + glPushMatrix(); + + glTranslatef (0.0f, 0.0f, -5.0f); + glRotatef (rotation, 0.5f, 1.0f, 0.0f); + + glBegin (GL_QUADS); + + glColor3f (0.0f, 1.0f, 0.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + + glColor3f (1.0f, 0.0f, 0.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + + glColor3f (0.0f, 0.0f, 1.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + + glColor3f (1.0f, 1.0f, 0.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + + glColor3f (0.0f, 1.0f, 1.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + + glColor3f (1.0f, 0.0f, 1.0f); + + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + + glEnd(); + + glPopMatrix(); + } + + void timerCallback() + { + rotation += delta; + + repaint(); + } +}; + +//============================================================================== +class OpenGLDemo : public Component +{ + //============================================================================== + DemoOpenGLCanvas* canvas; + +public: + //============================================================================== + OpenGLDemo() + { + setName (T("OpenGL")); + + canvas = new DemoOpenGLCanvas(); + addAndMakeVisible (canvas); + } + + ~OpenGLDemo() + { + deleteAllChildren(); + } + + void resized() + { + canvas->setBounds (10, 10, getWidth() - 20, getHeight() - 50); + } +}; + + +//============================================================================== +Component* createOpenGLDemo() +{ + return new OpenGLDemo(); +} + +#endif diff --git a/extras/juce demo/src/demos/PathsAndTransformsDemo.cpp b/extras/juce demo/src/demos/PathsAndTransformsDemo.cpp new file mode 100644 index 0000000000..d2cee55ccd --- /dev/null +++ b/extras/juce demo/src/demos/PathsAndTransformsDemo.cpp @@ -0,0 +1,384 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +static float randomNumber() +{ + return Random::getSystemRandom().nextFloat() * 300.0f - 150.0f; +} + + +//============================================================================== +class PathsAndTransformsDemo : public Component, + public SliderListener, + public ComboBoxListener +{ +public: + //============================================================================== + PathsAndTransformsDemo() + { + setName (T("Paths")); + + // No parts of this component are semi-transparent, so calling setOpaque() + // allows the redraw system to exploit this fact and optimise repainting. + setOpaque (true); + + generateRandomShape(); + generateImage(); + generateDrawable(); + generateSVGDrawable(); + + addAndMakeVisible (typeChooser = new ComboBox (T("type"))); + addAndMakeVisible (scaleSlider = new Slider (T("scale"))); + addAndMakeVisible (angleSlider = new Slider (T("angle"))); + addAndMakeVisible (xSlider = new Slider (T("x"))); + addAndMakeVisible (ySlider = new Slider (T("y"))); + addAndMakeVisible (opacitySlider = new Slider (T("opacity"))); + + (new Label (String::empty, T("type:"))) ->attachToComponent (typeChooser, true); + (new Label (String::empty, T("scale:"))) ->attachToComponent (scaleSlider, true); + (new Label (String::empty, T("angle:"))) ->attachToComponent (angleSlider, true); + (new Label (String::empty, T("x offset:"))) ->attachToComponent (xSlider, true); + (new Label (String::empty, T("y offset:"))) ->attachToComponent (ySlider, true); + (new Label (String::empty, T("opacity:"))) ->attachToComponent (opacitySlider, true); + + typeChooser->addItem (T("random shape - solid colour"), 1); + typeChooser->addItem (T("random shape - linear gradient fill"), 2); + typeChooser->addItem (T("random shape - radial gradient fill"), 3); + typeChooser->addItem (T("random shape - tiled image fill"), 8); + typeChooser->addItem (T("image - low quality"), 4); + typeChooser->addItem (T("image - high quality"), 5); + typeChooser->addItem (T("image - colour-filled alpha channel"), 6); + typeChooser->addItem (T("image - gradient-filled alpha channel"), 7); + typeChooser->addItem (T("image - alphamap-filled alpha channel"), 9); + typeChooser->addItem (T("drawable object"), 10); + typeChooser->addItem (T("SVG object"), 11); + typeChooser->setSelectedId (11); + typeChooser->addListener (this); + + scaleSlider ->addListener (this); + angleSlider ->addListener (this); + xSlider ->addListener (this); + ySlider ->addListener (this); + opacitySlider ->addListener (this); + + scaleSlider->setRange (0.01, 10.0, 0.001); + scaleSlider->setValue (1.0); + + angleSlider->setRange (-1.0, 1.0, 0.001); + angleSlider->setValue (0); + + xSlider->setRange (-10, 10, 0.001); + xSlider->setValue (0); + + ySlider->setRange (-10, 10, 0.001); + ySlider->setValue (0); + + opacitySlider->setRange (0, 1, 0.01); + opacitySlider->setValue (1.0); + } + + ~PathsAndTransformsDemo() + { + if (image != 0) + delete image; + + delete drawable; + delete svgDrawable; + + deleteAllChildren(); + } + + void paint (Graphics& g) + { + g.fillCheckerBoard (0, 0, getWidth(), getHeight(), + 50, 50, + Colour (0xffe0e0e0), + Colours::white); + + const int type = typeChooser->getSelectedId(); + + if (type == 1) + { + g.setColour (Colours::blue.withAlpha ((float) opacitySlider->getValue())); + g.fillPath (shape, getTransform()); + } + else if (type == 2 || type == 3) + { + GradientBrush gb (Colours::blue.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.5f, getHeight() * 0.5f, + Colours::red.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.6f, getHeight() * 0.7f, + type == 3); + + g.setBrush (&gb); + g.fillPath (shape, getTransform()); + } + else if (type == 8) + { + ImageBrush ib (image, 100, 100, (float) opacitySlider->getValue()); + + g.setBrush (&ib); + g.fillPath (shape, getTransform()); + } + else if (type == 4 || type == 5) + { + if (type == 4) + g.setImageResamplingQuality (Graphics::lowResamplingQuality); + else + g.setImageResamplingQuality (Graphics::mediumResamplingQuality); + + g.setOpacity ((float) opacitySlider->getValue()); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), -0.5f * image->getHeight()) + .followedBy (getTransform()), + false); + } + } + else if (type == 6) + { + g.setColour (Colours::blue.withAlpha ((float) opacitySlider->getValue())); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), -0.5f * image->getHeight()) + .followedBy (getTransform()), + true); + } + } + else if (type == 7) + { + GradientBrush gb (Colours::blue.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.5f, getHeight() * 0.5f, + Colours::red.withAlpha ((float) opacitySlider->getValue()), + getWidth() * 0.6f, getHeight() * 0.7f, + false); + + g.setBrush (&gb); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), -0.5f * image->getHeight()) + .followedBy (getTransform()), + true); + } + } + else if (type == 9) + { + ImageBrush ib (image, 100, 100, (float) opacitySlider->getValue()); + g.setBrush (&ib); + + if (image != 0) + { + g.drawImageTransformed (image, + 0, 0, image->getWidth(), image->getHeight(), + AffineTransform::translation (-0.5f * image->getWidth(), + -0.5f * image->getHeight()) + .followedBy (getTransform()), + true); + } + } + else if (type == 10) + { + g.setOpacity ((float) opacitySlider->getValue()); + + float x, y, w, h; + drawable->getBounds (x, y, w, h); + + drawable->draw (g, AffineTransform::translation (-x - 0.5f * w, + -y - 0.5f * h) + .followedBy (getTransform())); + } + else if (type == 11) + { + g.setOpacity ((float) opacitySlider->getValue()); + + float x, y, w, h; + svgDrawable->getBounds (x, y, w, h); + + svgDrawable->draw (g, AffineTransform::translation (-x - 0.5f * w, + -y - 0.5f * h) + .followedBy (getTransform())); + } + } + + void resized() + { + const int x = 100; + int y = 4; + typeChooser->setBounds (x, y, 300, 24); + y += 28; + scaleSlider->setBounds (x, y, 300, 24); + y += 28; + angleSlider->setBounds (x, y, 300, 24); + y += 28; + xSlider->setBounds (x, y, 300, 24); + y += 28; + ySlider->setBounds (x, y, 300, 24); + y += 28; + opacitySlider->setBounds (x, y, 300, 24); + } + + void sliderValueChanged (Slider*) + { + repaint(); + } + + void comboBoxChanged (ComboBox*) + { + repaint(); + } + +private: + Path shape; + Image* image; + Drawable* drawable; + DrawableComposite* svgDrawable; + + ComboBox* typeChooser; + Slider* scaleSlider; + Slider* angleSlider; + Slider* xSlider; + Slider* ySlider; + Slider* opacitySlider; + + void generateRandomShape() + { + shape.startNewSubPath (randomNumber(), randomNumber()); + + for (int i = 0; i < 7; ++i) + { + shape.lineTo (randomNumber(), randomNumber()); + + shape.quadraticTo (randomNumber(), randomNumber(), + randomNumber(), randomNumber()); + } + + shape.closeSubPath(); + } + + void generateImage() + { + image = ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize); + } + + void generateDrawable() + { + // create a composite drawable object.. + DrawableComposite* dc = new DrawableComposite(); + drawable = dc; + + // ..add a paths drawable to it... + DrawablePath dp; + dp.setPath (shape); + + dp.setOutline (4.0f, Colours::blue); + + GradientBrush gb (ColourGradient (Colours::red.withAlpha (0.4f), -100.0f, -100.0f, + Colours::green.withAlpha (0.6f), 100.0f, 100.0f, false)); + + dp.setFillBrush (gb); + + dc->insertDrawable (dp); + + // ..add an image drawable.. + DrawableImage di; + di.setImage (image, false); + + dc->insertDrawable (di, AffineTransform::scale (0.3f, 0.8f)); + + // ..and a text object + DrawableText dt; + dt.setText (T("JUCE Drawables"), Font (30.0f, Font::bold)); + dt.setColour (Colours::green); + + dc->insertDrawable (dt, AffineTransform::translation (-80.0f, -20.0f) + .scaled (2.0f, 0.8f) + .rotated (-1.3f)); + } + + void generateSVGDrawable() + { + svgDrawable = 0; + + MemoryInputStream iconsFileStream (BinaryData::icons_zip, BinaryData::icons_zipSize, false); + ZipFile icons (&iconsFileStream, false); + + // Load a random SVG file from our embedded icons.zip file. + InputStream* svgFileStream + = icons.createStreamForEntry (Random::getSystemRandom().nextInt (icons.getNumEntries())); + + if (svgFileStream != 0) + { + Drawable* loadedSVG = Drawable::createFromImageDataStream (*svgFileStream); + + if (loadedSVG != 0) + { + // to make our icon the right size, we'll put it inside a DrawableComposite, and apply + // a transform to get it to the size we want. + + float x, y, w, h; + loadedSVG->getBounds (x, y, w, h); + const float scaleFactor = 300.0f / jmax (w, h); + + svgDrawable = new DrawableComposite(); + svgDrawable->insertDrawable (loadedSVG, AffineTransform::scale (scaleFactor, scaleFactor)); + } + + delete svgFileStream; + } + } + + const AffineTransform getTransform() const + { + return AffineTransform::rotation (float_Pi * 2.0f * (float) angleSlider->getValue()) + .scaled ((float) scaleSlider->getValue(), + (float) scaleSlider->getValue()) + .translated (getWidth() * 0.5f + (float) xSlider->getValue(), + getHeight() * 0.5f + (float) ySlider->getValue()); + } +}; + +Component* createPathsAndTransformsDemo() +{ + return new PathsAndTransformsDemo(); +} diff --git a/extras/juce demo/src/demos/QuickTimeDemo.cpp b/extras/juce demo/src/demos/QuickTimeDemo.cpp new file mode 100644 index 0000000000..eb22f6c846 --- /dev/null +++ b/extras/juce demo/src/demos/QuickTimeDemo.cpp @@ -0,0 +1,129 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + +#if JUCE_QUICKTIME && ! JUCE_LINUX + +//============================================================================== +// so that we can easily have two QT windows each with a file browser, wrap this up as a class.. +class QuickTimeWindowWithFileBrowser : public Component, + public FilenameComponentListener +{ +public: + QuickTimeWindowWithFileBrowser() + { + addAndMakeVisible (qtComp = new QuickTimeMovieComponent()); + + // and a file-chooser.. + addAndMakeVisible (fileChooser = new FilenameComponent (T("movie"), + File::nonexistent, + true, false, false, + T("*.*"), + String::empty, + T("(choose a video file to play)"))); + fileChooser->addListener (this); + fileChooser->setBrowseButtonText (T("browse")); + } + + ~QuickTimeWindowWithFileBrowser() + { + deleteAllChildren(); + } + + void resized() + { + qtComp->setBounds (0, 0, getWidth(), getHeight() - 30); + fileChooser->setBounds (0, getHeight() - 24, getWidth(), 24); + } + + void filenameComponentChanged (FilenameComponent*) + { + // this is called when the user changes the filename in the file chooser box + if (qtComp->loadMovie (fileChooser->getCurrentFile(), true)) + { + // loaded the file ok, so let's start it playing.. + + qtComp->play(); + } + else + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Couldn't load the file!"), + T("Sorry, QuickTime didn't manage to load that file!")); + } + } + +private: + QuickTimeMovieComponent* qtComp; + FilenameComponent* fileChooser; +}; + + +//============================================================================== +class QuickTimeDemo : public Component +{ +public: + //============================================================================== + QuickTimeDemo() + { + setName (T("QuickTime")); + + // add a movie component.. + addAndMakeVisible (qtComp1 = new QuickTimeWindowWithFileBrowser()); + addAndMakeVisible (qtComp2 = new QuickTimeWindowWithFileBrowser()); + } + + ~QuickTimeDemo() + { + deleteAllChildren(); + } + + void resized() + { + qtComp1->setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f); + qtComp2->setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f); + } + +private: + //============================================================================== + QuickTimeWindowWithFileBrowser* qtComp1; + QuickTimeWindowWithFileBrowser* qtComp2; +}; + + +//============================================================================== +Component* createQuickTimeDemo() +{ + return new QuickTimeDemo(); +} + +#endif diff --git a/extras/juce demo/src/demos/TableDemo.cpp b/extras/juce demo/src/demos/TableDemo.cpp new file mode 100644 index 0000000000..5207b26df0 --- /dev/null +++ b/extras/juce demo/src/demos/TableDemo.cpp @@ -0,0 +1,329 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +/** + This class shows how to implement a TableListBoxModel to show in a TableListBox. +*/ +class TableDemoComponent : public Component, + public TableListBoxModel +{ +public: + //============================================================================== + TableDemoComponent() + : font (14.0f), + demoData (0) + { + // Load some data from an embedded XML file.. + loadData(); + + // Create our table component and add it to this component.. + addAndMakeVisible (table = new TableListBox (T("demo table"), this)); + + // give it a border + table->setColour (ListBox::outlineColourId, Colours::grey); + table->setOutlineThickness (1); + + // Add some columns to the table header, based on the column list in our database.. + forEachXmlChildElement (*columnList, columnXml) + { + table->getHeader()->addColumn (columnXml->getStringAttribute T("name"), + columnXml->getIntAttribute T("columnId"), + columnXml->getIntAttribute T("width"), + 50, 400, + TableHeaderComponent::defaultFlags); + } + + // we could now change some initial settings.. + table->getHeader()->setSortColumnId (1, true); // sort forwards by the ID column + table->getHeader()->setColumnVisible (7, false); // hide the "length" column until the user shows it + + // un-comment this line to have a go of stretch-to-fit mode + // table->getHeader()->setStretchToFitActive (true); + } + + ~TableDemoComponent() + { + deleteAllChildren(); + + delete demoData; + } + + //============================================================================== + // This is overloaded from TableListBoxModel, and must return the total number of rows in our table + int getNumRows() + { + return numRows; + } + + // This is overloaded from TableListBoxModel, and should fill in the background of the whole row + void paintRowBackground (Graphics& g, int rowNumber, int width, int height, bool rowIsSelected) + { + if (rowIsSelected) + g.fillAll (Colours::lightblue); + } + + // This is overloaded from TableListBoxModel, and must paint any cells that aren't using custom + // components. + void paintCell (Graphics& g, + int rowNumber, + int columnId, + int width, int height, + bool rowIsSelected) + { + g.setColour (Colours::black); + g.setFont (font); + + const XmlElement* rowElement = dataList->getChildElement (rowNumber); + + if (rowElement != 0) + { + const String text (rowElement->getStringAttribute (getAttributeNameForColumnId (columnId))); + + g.drawText (text, 2, 0, width - 4, height, Justification::centredLeft, true); + } + + g.setColour (Colours::black.withAlpha (0.2f)); + g.fillRect (width - 1, 0, 1, height); + } + + // This is overloaded from TableListBoxModel, and tells us that the user has clicked a table header + // to change the sort order. + void sortOrderChanged (int newSortColumnId, const bool isForwards) + { + if (newSortColumnId != 0) + { + DemoDataSorter sorter (getAttributeNameForColumnId (newSortColumnId), isForwards); + dataList->sortChildElements (sorter); + + table->updateContent(); + } + } + + // This is overloaded from TableListBoxModel, and must update any custom components that we're using + Component* refreshComponentForCell (int rowNumber, int columnId, bool isRowSelected, + Component* existingComponentToUpdate) + { + if (columnId == 5) // If it's the ratings column, we'll return our custom component.. + { + RatingColumnCustomComponent* ratingsBox = (RatingColumnCustomComponent*) existingComponentToUpdate; + + // If an existing component is being passed-in for updating, we'll re-use it, but + // if not, we'll have to create one. + if (ratingsBox == 0) + ratingsBox = new RatingColumnCustomComponent (*this); + + ratingsBox->setRowAndColumn (rowNumber, columnId); + + return ratingsBox; + } + else + { + // for any other column, just return 0, as we'll be painting these columns directly. + + jassert (existingComponentToUpdate == 0); + return 0; + } + } + + // This is overloaded from TableListBoxModel, and should choose the best width for the specified + // column. + int getColumnAutoSizeWidth (int columnId) + { + if (columnId == 5) + return 100; // (this is the ratings column, containing a custom component) + + int widest = 32; + + // find the widest bit of text in this column.. + for (int i = getNumRows(); --i >= 0;) + { + const XmlElement* rowElement = dataList->getChildElement (i); + + if (rowElement != 0) + { + const String text (rowElement->getStringAttribute (getAttributeNameForColumnId (columnId))); + + widest = jmax (widest, font.getStringWidth (text)); + } + } + + return widest + 8; + } + + // A couple of quick methods to set and get the "rating" value when the user + // changes the combo box + int getRating (const int rowNumber, const int columnId) const + { + return dataList->getChildElement (rowNumber)->getIntAttribute (T("Rating")); + } + + void setRating (const int rowNumber, const int columnId, const int newRating) + { + dataList->getChildElement (rowNumber)->setAttribute (T("Rating"), newRating); + } + + //============================================================================== + void resized() + { + // position our table with a gap around its edge + table->setBoundsInset (BorderSize (8)); + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + TableListBox* table; // the table component itself + Font font; + + XmlElement* demoData; // This is the XML document loaded from the embedded file "demo table data.xml" + XmlElement* columnList; // A pointer to the sub-node of demoData that contains the list of columns + XmlElement* dataList; // A pointer to the sub-node of demoData that contains the list of data rows + int numRows; // The number of rows of data we've got + + //============================================================================== + // This is a custom component containing a combo box, which we're going to put inside + // our table's "rating" column. + class RatingColumnCustomComponent : public Component, + public ComboBoxListener + { + public: + RatingColumnCustomComponent (TableDemoComponent& owner_) + : owner (owner_) + { + // just put a combo box inside this component + addAndMakeVisible (comboBox = new ComboBox (String::empty)); + comboBox->addItem (T("fab"), 1); + comboBox->addItem (T("groovy"), 2); + comboBox->addItem (T("hep"), 3); + comboBox->addItem (T("neat"), 4); + comboBox->addItem (T("wild"), 5); + comboBox->addItem (T("swingin"), 6); + comboBox->addItem (T("mad for it"), 7); + + // when the combo is changed, we'll get a callback. + comboBox->addListener (this); + comboBox->setWantsKeyboardFocus (false); + } + + ~RatingColumnCustomComponent() + { + deleteAllChildren(); + } + + void resized() + { + comboBox->setBoundsInset (BorderSize (2)); + } + + // Our demo code will call this when we may need to update our contents + void setRowAndColumn (const int newRow, const int newColumn) + { + row = newRow; + columnId = newColumn; + comboBox->setSelectedId (owner.getRating (row, columnId), true); + } + + void comboBoxChanged (ComboBox* comboBoxThatHasChanged) + { + owner.setRating (row, columnId, comboBox->getSelectedId()); + } + + private: + TableDemoComponent& owner; + ComboBox* comboBox; + int row, columnId; + }; + + //============================================================================== + // A comparator used to sort our data when the user clicks a column header + class DemoDataSorter + { + public: + DemoDataSorter (const String attributeToSort_, bool forwards) + : attributeToSort (attributeToSort_), + direction (forwards ? 1 : -1) + { + } + + int compareElements (XmlElement* first, XmlElement* second) const + { + int result = first->getStringAttribute (attributeToSort) + .compareLexicographically (second->getStringAttribute (attributeToSort)); + + if (result == 0) + result = first->getStringAttribute (T("ID")) + .compareLexicographically (second->getStringAttribute (T("ID"))); + + return direction * result; + } + + private: + const String attributeToSort; + const int direction; + }; + + //============================================================================== + // this loads the embedded database XML file into memory + void loadData() + { + XmlDocument dataDoc (String ((const char*) BinaryData::demo_table_data_xml)); + demoData = dataDoc.getDocumentElement(); + + dataList = demoData->getChildByName (T("DATA")); + columnList = demoData->getChildByName (T("COLUMNS")); + + numRows = dataList->getNumChildElements(); + } + + // (a utility method to search our XML for the attribute that matches a column ID) + const String getAttributeNameForColumnId (const int columnId) const + { + forEachXmlChildElement (*columnList, columnXml) + { + if (columnXml->getIntAttribute T("columnId") == columnId) + return columnXml->getStringAttribute T("name"); + } + + return String::empty; + } +}; + + +//============================================================================== +Component* createTableDemo() +{ + return new TableDemoComponent(); +} diff --git a/extras/juce demo/src/demos/ThreadingDemo.cpp b/extras/juce demo/src/demos/ThreadingDemo.cpp new file mode 100644 index 0000000000..361203a1b3 --- /dev/null +++ b/extras/juce demo/src/demos/ThreadingDemo.cpp @@ -0,0 +1,354 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class BouncingBallComp : public Component, + public AsyncUpdater +{ + float x, y, size, dx, dy, w, h, parentWidth, parentHeight; + float innerX, innerY; + Colour colour; + CriticalSection lock; + int threadId; + +public: + BouncingBallComp() + { + x = Random::getSystemRandom().nextFloat() * 200.0f; + y = Random::getSystemRandom().nextFloat() * 200.0f; + parentWidth = 50; + parentHeight = 50; + innerX = 0; + innerY = 0; + threadId = 0; + + const float speed = 5.0f; // give each ball a fixed speed so we can + // see the effects of thread priority on how fast + // they actually go. + const float angle = Random::getSystemRandom().nextFloat() * float_Pi * 2.0f; + + dx = sinf (angle) * speed; + dy = cosf (angle) * speed; + + size = Random::getSystemRandom().nextFloat() * 30.0f + 30.0f; + + colour = Colour (Random::getSystemRandom().nextInt()) + .withAlpha (0.5f) + .withBrightness (0.7f); + } + + ~BouncingBallComp() + { + } + + void paint (Graphics& g) + { + g.setColour (colour); + g.fillEllipse (innerX, innerY, size, size); + + g.setColour (Colours::black); + g.setFont (10.0f); + g.drawText (String::toHexString (threadId), 0, 0, getWidth(), getHeight(), Justification::centred, false); + } + + void parentSizeChanged() + { + parentWidth = getParentWidth() - size; + parentHeight = getParentHeight() - size; + } + + void handleAsyncUpdate() + { + const ScopedLock sl (lock); + + setBounds (((int) x) - 2, + ((int) y) - 2, + ((int) size) + 4, + ((int) size) + 4); + + innerX = x - getX(); + innerY = y - getY(); + + repaint(); + } + + void moveBall() + { + const ScopedLock sl (lock); + + threadId = Thread::getCurrentThreadId(); // this is so the component can print the thread ID inside the ball + + x += dx; + y += dy; + + if (x < 0) + dx = fabsf (dx); + + if (x > parentWidth) + dx = -fabsf (dx); + + if (y < 0) + dy = fabsf (dy); + + if (y > parentHeight) + dy = -fabsf (dy); + + // this is called on a background thread, so we don't want to call + // any UI code from here - instead we'll trigger an event that will update + // the component's position later. This is a safe way to avoid deadlocks + triggerAsyncUpdate(); + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +class DemoThread : public BouncingBallComp, + public Thread +{ + int interval; + +public: + DemoThread() + : Thread (T("Juce Demo Thread")) + { + interval = Random::getSystemRandom().nextInt (50) + 6; + + // give the threads a random priority, so some will move more + // smoothly than others.. + startThread (Random::getSystemRandom().nextInt (3) + 3); + } + + ~DemoThread() + { + // allow the thread 2 seconds to stop cleanly - should be plenty of time. + stopThread (2000); + } + + void run() + { + // this is the code that runs this thread - we'll loop continuously, + // updating the co-ordinates of our blob. + + // threadShouldExit() returns true when the stopThread() method has been + // called, so we should check it often, and exit as soon as it gets flagged. + while (! threadShouldExit()) + { + moveBall(); + + // sleep a bit so the threads don't all grind the CPU to a halt.. + wait (interval); + } + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +class DemoThreadPoolJob : public BouncingBallComp, + public ThreadPoolJob +{ +public: + DemoThreadPoolJob() + : ThreadPoolJob (T("Demo Threadpool Job")) + { + } + + ~DemoThreadPoolJob() + { + } + + JobStatus runJob() + { + // this is the code that runs this job. It'll be repeatedly called until we return + // jobHasFinished instead of jobNeedsRunningAgain. + + moveBall(); + Thread::sleep (30); + + return jobNeedsRunningAgain; + } + + void removedFromQueue() + { + // This is called to tell us that our job has been removed from the pool. + // In this case there's no need to do anything here. + } + + juce_UseDebuggingNewOperator +}; + +//============================================================================== +class ThreadingDemo : public Component, + public Timer, + public ButtonListener +{ + bool isUsingPool; + ThreadPool pool; + TextButton* controlButton; + +public: + //============================================================================== + ThreadingDemo() + : pool (3) + { + isUsingPool = false; + + setName (T("Multithreading")); + + setOpaque (true); + } + + ~ThreadingDemo() + { + pool.removeAllJobs (true, 2000); + + deleteAllChildren(); + } + + // this gets called when a component is added or removed from a parent component. + void parentHierarchyChanged() + { + // we'll use this as an opportunity to start and stop the threads, so that + // we don't leave them going when the component's not actually visible. + stopTimer(); + + pool.removeAllJobs (true, 4000); + deleteAllChildren(); + + addAndMakeVisible (controlButton = new TextButton (T("Thread type"))); + controlButton->changeWidthToFitText (20); + controlButton->setTopLeftPosition (20, 20); + controlButton->setTriggeredOnMouseDown (true); + controlButton->setAlwaysOnTop (true); + controlButton->addButtonListener (this); + + if (isShowing()) + { + while (getNumChildComponents() < 5) + addABall(); + + startTimer (2000); + } + } + + void paint (Graphics& g) + { + g.fillAll (Colours::white); + } + + void setUsingPool (bool usePool) + { + isUsingPool = usePool; + parentHierarchyChanged(); // resets everything + } + + void addABall() + { + if (isUsingPool) + { + DemoThreadPoolJob* newComp = new DemoThreadPoolJob(); + addAndMakeVisible (newComp); + newComp->parentSizeChanged(); + + pool.addJob (newComp); + } + else + { + DemoThread* newComp = new DemoThread(); + addAndMakeVisible (newComp); + newComp->parentSizeChanged(); + } + } + + void removeABall() + { + if (isUsingPool) + { + ThreadPoolJob* jobToRemove = pool.getJob (Random::getSystemRandom().nextInt (pool.getNumJobs())); + + if (jobToRemove != 0) + { + pool.removeJob (jobToRemove, true, 4000); + delete jobToRemove; + } + } + else + { + if (getNumChildComponents() > 1) + { + Component* ball = getChildComponent (1 + Random::getSystemRandom().nextInt (getNumChildComponents() - 1)); + + if (dynamic_cast (ball) == 0) // don't delete our button! + delete ball; + } + } + } + + void timerCallback() + { + if (Random::getSystemRandom().nextBool()) + { + if (getNumChildComponents() <= 10) + addABall(); + } + else + { + if (getNumChildComponents() > 3) + removeABall(); + } + } + + void buttonClicked (Button* button) + { + PopupMenu m; + m.addItem (1, T("Use one thread per ball"), true, ! isUsingPool); + m.addItem (2, T("Use a thread pool"), true, isUsingPool); + + const int res = m.showAt (button); + + if (res != 0) + setUsingPool (res == 2); + } +}; + + + +//============================================================================== +Component* createThreadingDemo() +{ + return new ThreadingDemo(); +} diff --git a/extras/juce demo/src/demos/TreeViewDemo.cpp b/extras/juce demo/src/demos/TreeViewDemo.cpp new file mode 100644 index 0000000000..d0b53a9373 --- /dev/null +++ b/extras/juce demo/src/demos/TreeViewDemo.cpp @@ -0,0 +1,184 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class TreeViewDemoItem : public TreeViewItem +{ + XmlElement* xml; + +public: + TreeViewDemoItem (XmlElement* const xml_) + : xml (xml_) + { + } + + ~TreeViewDemoItem() + { + } + + int getItemWidth() const + { + return xml->getIntAttribute (T("width"), -1); + } + + const String getUniqueName() const + { + if (xml != 0) + return xml->getTagName(); + else + return String::empty; + } + + bool mightContainSubItems() + { + return xml != 0 + && xml->getFirstChildElement() != 0; + } + + void paintItem (Graphics& g, int width, int height) + { + if (xml != 0) + { + // if this item is selected, fill it with a background colour.. + if (isSelected()) + g.fillAll (Colours::blue.withAlpha (0.3f)); + + // use a "colour" attribute in the xml tag for this node to set the text colour.. + g.setColour (Colour (xml->getStringAttribute (T("colour"), T("ff000000")).getHexValue32())); + + g.setFont (height * 0.7f); + + // draw the xml element's tag name.. + g.drawText (xml->getTagName(), + 4, 0, width - 4, height, + Justification::centredLeft, true); + } + } + + void itemOpennessChanged (bool isNowOpen) + { + if (isNowOpen) + { + // if we've not already done so, we'll now add the tree's sub-items. You could + // also choose to delete the existing ones and refresh them if that's more suitable + // in your app. + if (getNumSubItems() == 0) + { + // create and add sub-items to this node of the tree, corresponding to + // each sub-element in the XML.. + + if (xml != 0) + { + forEachXmlChildElement (*xml, child) + { + addSubItem (new TreeViewDemoItem (child)); + } + } + } + } + else + { + // in this case, we'll leave any sub-items in the tree when the node gets closed, + // though you could choose to delete them if that's more appropriate for + // your application. + } + } + + const String getDragSourceDescription() + { + return T("TreeView Items"); + } +}; + +//============================================================================== +class TreeViewDemo : public Component, + public DragAndDropContainer +{ + XmlElement* treeXml; + + TreeViewItem* rootItem; + TreeView* treeView; + +public: + //============================================================================== + TreeViewDemo() + { + setName (T("Tree Views")); + + const String treeXmlString (BinaryData::treedemo_xml); + + XmlDocument parser (treeXmlString); + + treeXml = parser.getDocumentElement(); + + rootItem = new TreeViewDemoItem (treeXml); + rootItem->setOpen (true); + + addAndMakeVisible (treeView = new TreeView()); + + treeView->setRootItem (rootItem); + } + + ~TreeViewDemo() + { + deleteAllChildren(); + + if (rootItem != 0) + delete rootItem; + + if (treeXml != 0) + delete treeXml; + } + + void paint (Graphics& g) + { + g.setColour (Colours::grey); + g.drawRect (treeView->getX(), treeView->getY(), + treeView->getWidth(), treeView->getHeight()); + } + + void resized() + { + treeView->setBoundsRelative (0.05f, 0.05f, 0.9f, 0.9f); + } + + juce_UseDebuggingNewOperator +}; + + +//============================================================================== +Component* createTreeViewDemo() +{ + return new TreeViewDemo(); +} diff --git a/extras/juce demo/src/demos/WidgetsDemo.cpp b/extras/juce demo/src/demos/WidgetsDemo.cpp new file mode 100644 index 0000000000..62d69dbe30 --- /dev/null +++ b/extras/juce demo/src/demos/WidgetsDemo.cpp @@ -0,0 +1,1335 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../jucedemo_headers.h" + + +//============================================================================== +class BouncingBallComponent : public Component, + public Timer +{ + Colour colour; + float x, y, dx, dy; + +public: + BouncingBallComponent() + { + x = Random::getSystemRandom().nextFloat() * 100.0f; + y = Random::getSystemRandom().nextFloat() * 100.0f; + + dx = Random::getSystemRandom().nextFloat() * 8.0f - 4.0f; + dy = Random::getSystemRandom().nextFloat() * 8.0f - 4.0f; + + colour = Colour (Random::getSystemRandom().nextInt()) + .withAlpha (0.5f) + .withBrightness (0.7f); + + int size = 10 + Random::getSystemRandom().nextInt (30); + setSize (size, size); + + startTimer (60); + } + + ~BouncingBallComponent() + { + } + + void paint (Graphics& g) + { + g.setColour (colour); + g.fillEllipse (x - getX(), y - getY(), getWidth() - 2.0f, getHeight() - 2.0f); + } + + void timerCallback() + { + x += dx; + y += dy; + + if (x < 0) + dx = fabsf (dx); + + if (x > getParentWidth()) + dx = -fabsf (dx); + + if (y < 0) + dy = fabsf (dy); + + if (y > getParentHeight()) + dy = -fabsf (dy); + + setTopLeftPosition ((int) x, (int) y); + } + + bool hitTest (int x, int y) + { + return false; + } +}; + +//============================================================================== +class DragOntoDesktopDemoComp : public Component +{ + Component* parent; + ComponentDragger dragger; + +public: + DragOntoDesktopDemoComp (Component* p) + : parent (p) + { + // show off semi-transparency if it's supported by the current OS. + setOpaque (! Desktop::canUseSemiTransparentWindows()); + + for (int i = 3; --i >= 0;) + addAndMakeVisible (new BouncingBallComponent()); + } + + ~DragOntoDesktopDemoComp() + { + deleteAllChildren(); + } + + void mouseDown (const MouseEvent& e) + { + dragger.startDraggingComponent (this, 0); + } + + void mouseDrag (const MouseEvent& e) + { + if (! parent->isValidComponent()) + { + delete this; + } + else + { + MouseEvent e2 (e.getEventRelativeTo (parent)); + + // if the mouse is inside the parent component, we'll make that the + // parent - otherwise, we'll put this comp on the desktop. + if (e2.x >= 0 && e2.y >= 0 && e2.x < parent->getWidth() && e2.y < parent->getHeight()) + { + // re-add this component to a parent component, which will + // remove it from the desktop.. + parent->addChildComponent (this); + } + else + { + // add the component to the desktop, which will remove it + // from its current parent component.. + addToDesktop (ComponentPeer::windowIsTemporary); + } + + dragger.dragComponent (this, e); + } + } + + void paint (Graphics& g) + { + if (isOpaque()) + g.fillAll (Colours::white); + else + g.fillAll (Colours::blue.withAlpha (0.2f)); + + String desc (T("drag this box onto the desktop to show how the same component can move from being lightweight to being a separate window")); + + g.setFont (15.0f); + g.setColour (Colours::black); + g.drawFittedText (desc, 4, 0, getWidth() - 8, getHeight(), Justification::horizontallyJustified, 5); + + g.drawRect (0, 0, getWidth(), getHeight()); + } +}; + +//============================================================================== +class CustomMenuComponent : public PopupMenuCustomComponent, + public Timer +{ + int blobX, blobY; + +public: + CustomMenuComponent() + { + // set off a timer to move a blob around on this component every + // 300 milliseconds - see the timerCallback() method. + startTimer (300); + } + + ~CustomMenuComponent() + { + } + + void getIdealSize (int& idealWidth, + int& idealHeight) + { + // tells the menu how big we'd like to be.. + idealWidth = 200; + idealHeight = 60; + } + + void paint (Graphics& g) + { + g.fillAll (Colours::yellow.withAlpha (0.3f)); + + g.setColour (Colours::pink); + g.fillEllipse ((float) blobX, (float) blobY, 30.0f, 40.0f); + + g.setFont (14.0f, Font::italic); + g.setColour (Colours::black); + + g.drawFittedText (T("this is a customised menu item (also demonstrating the Timer class)..."), + 4, 0, getWidth() - 8, getHeight(), + Justification::centred, 3); + } + + void timerCallback() + { + blobX = Random::getSystemRandom().nextInt (getWidth()); + blobY = Random::getSystemRandom().nextInt (getHeight()); + repaint(); + } +}; + +//============================================================================== +/** To demonstrate how sliders can have custom snapping applied to their values, + this simple class snaps the value to 50 if it comes near. +*/ +class SnappingSlider : public Slider +{ +public: + SnappingSlider (const String& name) + : Slider (name) + { + } + + double snapValue (double attemptedValue, const bool userIsDragging) + { + if (! userIsDragging) + return attemptedValue; // if they're entering the value in the text-box, don't mess with it. + + if (attemptedValue > 40 && attemptedValue < 60) + return 50.0; + else + return attemptedValue; + } +}; + +/** A TextButton that pops up a colour chooser to change its colours. */ +class ColourChangeButton : public TextButton, + public ChangeListener +{ +public: + ColourChangeButton() + : TextButton (T("click to change colour...")) + { + setSize (10, 24); + changeWidthToFitText(); + } + + ~ColourChangeButton() + { + } + + void clicked() + { + // create two colour selector components for our background and + // text colour.. + ColourSelector colourSelector1; + colourSelector1.setName (T("background")); + colourSelector1.setCurrentColour (findColour (TextButton::buttonColourId)); + colourSelector1.addChangeListener (this); + + ColourSelector colourSelector2; + colourSelector2.setName (T("text")); + colourSelector2.setCurrentColour (findColour (TextButton::textColourId)); + colourSelector2.addChangeListener (this); + + // and add the selectors as custom menu items to a PopupMenu, putting + // them in two different sub-menus.. + PopupMenu m, sub1, sub2; + + sub1.addCustomItem (1234, &colourSelector1, 300, 300, false); + m.addSubMenu (T("background colour"), sub1); + + sub2.addCustomItem (1234, &colourSelector2, 300, 300, false); + m.addSubMenu (T("text colour"), sub2); + + // and show the menu (modally).. + m.showAt (this); + } + + void changeListenerCallback (void* source) + { + ColourSelector* cs = (ColourSelector*) source; + + if (cs->getName() == T("text")) + setColour (TextButton::textColourId, cs->getCurrentColour()); + else + setColour (TextButton::buttonColourId, cs->getCurrentColour()); + } +}; + +//============================================================================== +// just a component that deletes all its children, to use for the tabbed pages to avoid +// memory leaks when they're deleted +class DemoPageComp : public Component +{ +public: + DemoPageComp() + { + } + + ~DemoPageComp() + { + deleteAllChildren(); + } +}; + +//============================================================================== +static Component* createSlidersPage() +{ + DemoPageComp* page = new DemoPageComp(); + + const int numSliders = 11; + Slider* sliders [numSliders]; + + int i; + for (i = 0; i < numSliders; ++i) + { + if (i == 2) + page->addAndMakeVisible (sliders[i] = new SnappingSlider (T("slider"))); + else + page->addAndMakeVisible (sliders[i] = new Slider (T("slider"))); + + sliders[i]->setRange (0.0, 100.0, 0.1); + sliders[i]->setPopupMenuEnabled (true); + sliders[i]->setValue (Random::getSystemRandom().nextDouble() * 100.0, false, false); + } + + sliders[0]->setSliderStyle (Slider::LinearVertical); + sliders[0]->setTextBoxStyle (Slider::TextBoxBelow, false, 100, 20); + sliders[0]->setBounds (10, 25, 70, 200); + sliders[0]->setDoubleClickReturnValue (true, 50.0); // double-clicking this slider will set it to 50.0 + sliders[0]->setTextValueSuffix (T(" units")); + + sliders[1]->setSliderStyle (Slider::LinearVertical); + sliders[1]->setVelocityBasedMode (true); + sliders[1]->setSkewFactor (0.5); + sliders[1]->setTextBoxStyle (Slider::TextBoxAbove, true, 100, 20); + sliders[1]->setBounds (85, 25, 70, 200); + sliders[1]->setTextValueSuffix (T(" rels")); + + sliders[2]->setSliderStyle (Slider::LinearHorizontal); + sliders[2]->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + sliders[2]->setBounds (180, 35, 150, 20); + + sliders[3]->setSliderStyle (Slider::LinearHorizontal); + sliders[3]->setTextBoxStyle (Slider::NoTextBox, false, 0, 0); + sliders[3]->setBounds (180, 65, 150, 20); + sliders[3]->setPopupDisplayEnabled (true, page); + sliders[3]->setTextValueSuffix (T(" nuns required to change a lightbulb")); + + sliders[4]->setSliderStyle (Slider::IncDecButtons); + sliders[4]->setTextBoxStyle (Slider::TextBoxLeft, false, 50, 20); + sliders[4]->setBounds (180, 105, 100, 20); + sliders[4]->setIncDecButtonsMode (Slider::incDecButtonsDraggable_Vertical); + + sliders[5]->setSliderStyle (Slider::Rotary); + sliders[5]->setRotaryParameters (float_Pi * 1.2f, float_Pi * 2.8f, false); + sliders[5]->setTextBoxStyle (Slider::TextBoxRight, false, 70, 20); + sliders[5]->setBounds (190, 145, 120, 40); + sliders[5]->setTextValueSuffix (T(" mm")); + + sliders[6]->setSliderStyle (Slider::LinearBar); + sliders[6]->setBounds (180, 195, 100, 30); + sliders[6]->setTextValueSuffix (T(" gallons")); + + sliders[7]->setSliderStyle (Slider::TwoValueHorizontal); + sliders[7]->setBounds (360, 20, 160, 40); + + sliders[8]->setSliderStyle (Slider::TwoValueVertical); + sliders[8]->setBounds (360, 110, 40, 160); + + sliders[9]->setSliderStyle (Slider::ThreeValueHorizontal); + sliders[9]->setBounds (360, 70, 160, 40); + + sliders[10]->setSliderStyle (Slider::ThreeValueVertical); + sliders[10]->setBounds (440, 110, 40, 160); + + for (i = 7; i <= 10; ++i) + { + sliders[i]->setTextBoxStyle (Slider::NoTextBox, false, 0, 0); + sliders[i]->setMinValue (Random::getSystemRandom().nextDouble() * 100.0, false, false); + sliders[i]->setMaxValue (Random::getSystemRandom().nextDouble() * 100.0, false, false); + sliders[i]->setPopupDisplayEnabled (true, page); + } + + Label* label = new Label (T("hint"), T("Try right-clicking on a slider for an options menu. \n\nAlso, holding down CTRL while dragging will turn on a slider's velocity-sensitive mode")); + label->setBounds (20, 245, 350, 150); + page->addAndMakeVisible (label); + + return page; +} + +//============================================================================== +static Component* createRadioButtonPage() +{ + DemoPageComp* page = new DemoPageComp(); + + GroupComponent* group = new GroupComponent (T("group"), T("radio buttons")); + group->setBounds (20, 20, 220, 140); + page->addAndMakeVisible (group); + + int i; + for (i = 0; i < 4; ++i) + { + ToggleButton* tb = new ToggleButton (T("radio button #") + String (i + 1)); + page->addAndMakeVisible (tb); + tb->setRadioGroupId (1234); + tb->setBounds (45, 46 + i * 22, 180, 22); + tb->setTooltip (T("a set of mutually-exclusive radio buttons")); + + if (i == 0) + tb->setToggleState (true, false); + } + + for (i = 0; i < 4; ++i) + { + DrawablePath normal, over; + + Path p; + p.addStar (0.0f, 0.0f, i + 5, 20.0f, 50.0f, -0.2f); + normal.setPath (p); + normal.setSolidFill (Colours::lightblue); + normal.setOutline (4.0f, Colours::black); + + over.setPath (p); + over.setSolidFill (Colours::blue); + over.setOutline (4.0f, Colours::black); + + DrawableButton* db = new DrawableButton (String (i + 5) + T(" points"), DrawableButton::ImageAboveTextLabel); + db->setImages (&normal, &over, 0); + + page->addAndMakeVisible (db); + db->setClickingTogglesState (true); + db->setRadioGroupId (23456); + + const int buttonSize = 50; + db->setBounds (25 + i * buttonSize, 180, buttonSize, buttonSize); + + if (i == 0) + db->setToggleState (true, false); + } + + for (i = 0; i < 4; ++i) + { + TextButton* tb = new TextButton (T("button ") + String (i + 1)); + + page->addAndMakeVisible (tb); + tb->setClickingTogglesState (true); + tb->setRadioGroupId (34567); + tb->setColour (TextButton::buttonColourId, Colours::white); + tb->setColour (TextButton::buttonOnColourId, Colours::blueviolet.brighter()); + + tb->setBounds (20 + i * 55, 260, 55, 24); + tb->setConnectedEdges (((i != 0) ? Button::ConnectedOnLeft : 0) + | ((i != 3) ? Button::ConnectedOnRight : 0)); + + if (i == 0) + tb->setToggleState (true, false); + } + + return page; +} + +//============================================================================== +class ButtonsPage : public Component, + public ButtonListener +{ +public: + ButtonsPage (ButtonListener* buttonListener) + { + //============================================================================== + // create some drawables to use for our drawable buttons... + DrawablePath normal, over; + + Path p; + p.addStar (0.0f, 0.0f, 5, 20.0f, 50.0f, 0.2f); + normal.setPath (p); + normal.setSolidFill (Colours::red); + + p.clear(); + p.addStar (0.0f, 0.0f, 7, 30.0f, 50.0f, 0.0f); + over.setPath (p); + over.setSolidFill (Colours::pink); + over.setOutline (5.0f, Colours::black); + + DrawableImage down; + down.setImage (ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize), true); + down.setOverlayColour (Colours::black.withAlpha (0.3f)); + + //============================================================================== + // create an image-above-text button from these drawables.. + DrawableButton* db = new DrawableButton (T("Button 1"), DrawableButton::ImageAboveTextLabel); + db->setImages (&normal, &over, &down); + + addAndMakeVisible (db); + db->setBounds (10, 30, 80, 80); + db->setTooltip (T("this is a DrawableButton with a label")); + + //============================================================================== + // create an image-only button from these drawables.. + db = new DrawableButton (T("Button 2"), DrawableButton::ImageFitted); + db->setImages (&normal, &over, &down); + db->setClickingTogglesState (true); + + addAndMakeVisible (db); + db->setBounds (90, 30, 80, 80); + db->setTooltip (T("this is an image-only DrawableButton")); + db->addButtonListener (buttonListener); + + //============================================================================== + // create an image-on-button-shape button from the same drawables.. + db = new DrawableButton (T("Button 3"), DrawableButton::ImageOnButtonBackground); + db->setImages (&normal, 0, 0); + + addAndMakeVisible (db); + db->setBounds (200, 30, 110, 25); + db->setTooltip (T("this is a DrawableButton on a standard button background")); + + //============================================================================== + db = new DrawableButton (T("Button 4"), DrawableButton::ImageOnButtonBackground); + db->setImages (&normal, &over, &down); + db->setClickingTogglesState (true); + db->setBackgroundColours (Colours::white, Colours::yellow); + + addAndMakeVisible (db); + db->setBounds (200, 70, 50, 50); + db->setTooltip (T("this is a DrawableButton on a standard button background")); + db->addButtonListener (buttonListener); + + //============================================================================== + HyperlinkButton* hyperlink + = new HyperlinkButton (T("this is a HyperlinkButton"), + URL (T("http://www.rawmaterialsoftware.com/juce"))); + + hyperlink->setBounds (10, 130, 200, 24); + addAndMakeVisible (hyperlink); + + //============================================================================== + ImageButton* imageButton = new ImageButton (T("imagebutton")); + addAndMakeVisible (imageButton); + + Image* juceImage = ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize); + ImageCache::incReferenceCount (juceImage); + ImageCache::incReferenceCount (juceImage); + + imageButton->setImages (true, true, true, + juceImage, 0.7f, Colours::transparentBlack, + juceImage, 1.0f, Colours::transparentBlack, + juceImage, 1.0f, Colours::pink.withAlpha (0.8f), + 0.5f); + + imageButton->setTopLeftPosition (10, 160); + imageButton->setTooltip (T("image button - showing alpha-channel hit-testing and colour overlay when clicked")); + + //============================================================================== + ColourChangeButton* colourChangeButton = new ColourChangeButton(); + addAndMakeVisible (colourChangeButton); + colourChangeButton->setTopLeftPosition (350, 30); + + //============================================================================== + animateButton = new TextButton (T("click to animate...")); + addAndMakeVisible (animateButton); + animateButton->changeWidthToFitText (24); + animateButton->setTopLeftPosition (350, 70); + animateButton->addButtonListener (this); + } + + ~ButtonsPage() + { + deleteAllChildren(); + } + + void buttonClicked (Button*) + { + for (int i = getNumChildComponents(); --i >= 0;) + { + if (getChildComponent (i) != animateButton) + { + animator.animateComponent (getChildComponent (i), + Rectangle (Random::getSystemRandom().nextInt (getWidth() / 2), + Random::getSystemRandom().nextInt (getHeight() / 2), + 60 + Random::getSystemRandom().nextInt (getWidth() / 3), + 16 + Random::getSystemRandom().nextInt (getHeight() / 6)), + 500 + Random::getSystemRandom().nextInt (2000), + Random::getSystemRandom().nextDouble(), + Random::getSystemRandom().nextDouble()); + } + } + } + +private: + TextButton* animateButton; + ComponentAnimator animator; +}; + + +//============================================================================== +static Component* createMiscPage() +{ + DemoPageComp* page = new DemoPageComp(); + + TextEditor* textEditor = new TextEditor(); + page->addAndMakeVisible (textEditor); + textEditor->setBounds (10, 25, 200, 24); + textEditor->setText (T("single-line text box")); + + textEditor = new TextEditor (T("password"), (tchar) 0x2022); + page->addAndMakeVisible (textEditor); + textEditor->setBounds (10, 55, 200, 24); + textEditor->setText (T("password")); + + //============================================================================== + ComboBox* comboBox = new ComboBox (T("combo")); + page->addAndMakeVisible (comboBox); + comboBox->setBounds (300, 25, 200, 24); + comboBox->setEditableText (true); + comboBox->setJustificationType (Justification::centred); + + int i; + for (i = 1; i < 100; ++i) + comboBox->addItem (T("combo box item ") + String (i), i); + + comboBox->setSelectedId (1); + + DragOntoDesktopDemoComp* d = new DragOntoDesktopDemoComp (page); + page->addAndMakeVisible (d); + d->setBounds (20, 100, 200, 80); + + return page; +} + +//============================================================================== +class ToolbarDemoComp : public Component, + public SliderListener, + public ButtonListener +{ +public: + ToolbarDemoComp (ApplicationCommandManager* commandManager) + { + // Create and add the toolbar... + addAndMakeVisible (toolbar = new Toolbar()); + + // And use our item factory to add a set of default icons to it... + toolbar->addDefaultItems (factory); + + // Now we'll just create the other sliders and buttons on the demo page, which adjust + // the toolbar's properties... + Label* info = new Label (String::empty, + "As well as showing off toolbars, this demo illustrates how to store " + "a set of SVG files in a Zip file, embed that in your application, and read " + "them back in at runtime.\n\nThe icon images here are taken from the open-source " + "Tango icon project."); + + addAndMakeVisible (info); + info->setJustificationType (Justification::topLeft); + info->setBounds (80, 80, 450, 100); + info->setInterceptsMouseClicks (false, false); + + addAndMakeVisible (depthSlider = new Slider (T("toolbar depth:"))); + depthSlider->setRange (10.0, 200.0, 1.0); + depthSlider->setValue (50, false); + depthSlider->setSliderStyle (Slider::LinearHorizontal); + depthSlider->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + depthSlider->addListener (this); + depthSlider->setBounds (80, 210, 300, 22); + (new Label (depthSlider->getName(), depthSlider->getName()))->attachToComponent (depthSlider, false); + + addAndMakeVisible (orientationButton = new TextButton (T("vertical/horizontal"))); + orientationButton->addButtonListener (this); + orientationButton->changeWidthToFitText (22); + orientationButton->setTopLeftPosition (depthSlider->getX(), depthSlider->getBottom() + 20); + + addAndMakeVisible (customiseButton = new TextButton (T("customise..."))); + customiseButton->addButtonListener (this); + customiseButton->changeWidthToFitText (22); + customiseButton->setTopLeftPosition (orientationButton->getRight() + 20, orientationButton->getY()); + } + + ~ToolbarDemoComp() + { + deleteAllChildren(); + } + + void resized() + { + if (toolbar->isVertical()) + toolbar->setBounds (0, 0, (int) depthSlider->getValue(), getHeight()); + else + toolbar->setBounds (0, 0, getWidth(), (int) depthSlider->getValue()); + } + + void sliderValueChanged (Slider* slider) + { + resized(); + } + + void buttonClicked (Button* button) + { + if (button == orientationButton) + { + toolbar->setVertical (! toolbar->isVertical()); + resized(); + } + else if (button == customiseButton) + { + toolbar->showCustomisationDialog (factory); + } + } + +private: + Toolbar* toolbar; + Slider* depthSlider; + TextButton* orientationButton; + TextButton* customiseButton; + + //============================================================================== + class DemoToolbarItemFactory : public ToolbarItemFactory + { + public: + DemoToolbarItemFactory() {} + ~DemoToolbarItemFactory() {} + + //============================================================================== + // Each type of item a toolbar can contain must be given a unique ID. These + // are the ones we'll use in this demo. + enum DemoToolbarItemIds + { + doc_new = 1, + doc_open = 2, + doc_save = 3, + doc_saveAs = 4, + edit_copy = 5, + edit_cut = 6, + edit_paste = 7, + juceLogoButton = 8, + customComboBox = 9 + }; + + void getAllToolbarItemIds (Array & ids) + { + // This returns the complete list of all item IDs that are allowed to + // go in our toolbar. Any items you might want to add must be listed here. The + // order in which they are listed will be used by the toolbar customisation panel. + + ids.add (doc_new); + ids.add (doc_open); + ids.add (doc_save); + ids.add (doc_saveAs); + ids.add (edit_copy); + ids.add (edit_cut); + ids.add (edit_paste); + ids.add (juceLogoButton); + ids.add (customComboBox); + + // If you're going to use separators, then they must also be added explicitly + // to the list. + ids.add (separatorBarId); + ids.add (spacerId); + ids.add (flexibleSpacerId); + } + + void getDefaultItemSet (Array & ids) + { + // This returns an ordered list of the set of items that make up a + // toolbar's default set. Not all items need to be on this list, and + // items can appear multiple times (e.g. the separators used here). + ids.add (doc_new); + ids.add (doc_open); + ids.add (doc_save); + ids.add (doc_saveAs); + ids.add (spacerId); + ids.add (separatorBarId); + ids.add (edit_copy); + ids.add (edit_cut); + ids.add (edit_paste); + ids.add (separatorBarId); + ids.add (flexibleSpacerId); + ids.add (customComboBox); + ids.add (flexibleSpacerId); + ids.add (separatorBarId); + ids.add (juceLogoButton); + } + + ToolbarItemComponent* createItem (const int itemId) + { + switch (itemId) + { + case doc_new: + return createButtonFromZipFileSVG (itemId, T("new"), T("document-new.svg")); + + case doc_open: + return createButtonFromZipFileSVG (itemId, T("open"), T("document-open.svg")); + + case doc_save: + return createButtonFromZipFileSVG (itemId, T("save"), T("document-save.svg")); + + case doc_saveAs: + return createButtonFromZipFileSVG (itemId, T("save as"), T("document-save-as.svg")); + + case edit_copy: + return createButtonFromZipFileSVG (itemId, T("copy"), T("edit-copy.svg")); + + case edit_cut: + return createButtonFromZipFileSVG (itemId, T("cut"), T("edit-cut.svg")); + + case edit_paste: + return createButtonFromZipFileSVG (itemId, T("paste"), T("edit-paste.svg")); + + case juceLogoButton: + return new ToolbarButton (itemId, T("juce!"), Drawable::createFromImageData (BinaryData::juce_png, BinaryData::juce_pngSize), 0); + + case customComboBox: + return new CustomToolbarComboBox (itemId); + + default: + break; + } + + return 0; + } + + private: + StringArray iconNames; + OwnedArray iconsFromZipFile; + + // This is a little utility to create a button with one of the SVG images in + // our embedded ZIP file "icons.zip" + ToolbarButton* createButtonFromZipFileSVG (const int itemId, const String& text, const String& filename) + { + if (iconsFromZipFile.size() == 0) + { + // If we've not already done so, load all the images from the zip file.. + MemoryInputStream iconsFileStream (BinaryData::icons_zip, BinaryData::icons_zipSize, false); + ZipFile icons (&iconsFileStream, false); + + for (int i = 0; i < icons.getNumEntries(); ++i) + { + InputStream* svgFileStream = icons.createStreamForEntry (i); + + if (svgFileStream != 0) + { + iconNames.add (icons.getEntry(i)->filename); + iconsFromZipFile.add (Drawable::createFromImageDataStream (*svgFileStream)); + + delete svgFileStream; + } + } + } + + Drawable* image = iconsFromZipFile [iconNames.indexOf (filename)]->createCopy(); + return new ToolbarButton (itemId, text, image, 0); + + return 0; + } + + // Demonstrates how to put a custom component into a toolbar - this one contains + // a ComboBox. + class CustomToolbarComboBox : public ToolbarItemComponent + { + public: + CustomToolbarComboBox (const int toolbarItemId) + : ToolbarItemComponent (toolbarItemId, T("Custom Toolbar Item"), false) + { + addAndMakeVisible (comboBox = new ComboBox (T("demo toolbar combo box"))); + + for (int i = 1; i < 20; ++i) + comboBox->addItem (T("Toolbar ComboBox item ") + String (i), i); + + comboBox->setSelectedId (1); + comboBox->setEditableText (true); + } + + ~CustomToolbarComboBox() + { + delete comboBox; + } + + bool getToolbarItemSizes (int toolbarDepth, + bool isToolbarVertical, + int& preferredSize, int& minSize, int& maxSize) + { + if (isToolbarVertical) + return false; + + preferredSize = 250; + minSize = 80; + maxSize = 300; + return true; + } + + void paintButtonArea (Graphics&, int, int, bool, bool) + { + } + + void contentAreaChanged (const Rectangle& contentArea) + { + comboBox->setSize (contentArea.getWidth() - 2, + jmin (contentArea.getHeight() - 2, 22)); + + comboBox->setCentrePosition (contentArea.getCentreX(), contentArea.getCentreY()); + } + + private: + ComboBox* comboBox; + }; + }; + + DemoToolbarItemFactory factory; +}; + +//============================================================================== +class DemoTabbedComponent : public TabbedComponent, + public ButtonListener +{ +public: + DemoTabbedComponent (ApplicationCommandManager* commandManager) + : TabbedComponent (TabbedButtonBar::TabsAtTop) + { + addTab (T("sliders"), getRandomBrightColour(), createSlidersPage(), true); + addTab (T("toolbars"), getRandomBrightColour(), new ToolbarDemoComp (commandManager), true); + addTab (T("buttons"), getRandomBrightColour(), new ButtonsPage (this), true); + addTab (T("radio buttons"), getRandomBrightColour(), createRadioButtonPage(), true); + addTab (T("misc widgets"), getRandomBrightColour(), createMiscPage(), true); + } + + ~DemoTabbedComponent() + { + } + + void buttonClicked (Button* button) + { + BubbleMessageComponent* bmc = new BubbleMessageComponent(); + + if (Desktop::canUseSemiTransparentWindows()) + { + bmc->setAlwaysOnTop (true); + bmc->addToDesktop (0); + } + else + { + addChildComponent (bmc); + } + + bmc->showAt (button, T("This is a demo of the BubbleMessageComponent, which lets you pop up a message pointing at a component or somewhere on the screen.\n\nThe message bubbles will disappear after a timeout period, or when the mouse is clicked."), + 2000, true, true); + } + + static const Colour getRandomBrightColour() + { + return Colour (Random::getSystemRandom().nextFloat(), 0.1f, 0.97f, 1.0f); + } +}; + + +//============================================================================== +class DemoBackgroundThread : public ThreadWithProgressWindow +{ +public: + DemoBackgroundThread() + : ThreadWithProgressWindow (T("busy doing some important things..."), + true, + true) + { + setStatusMessage (T("Getting ready...")); + } + + ~DemoBackgroundThread() + { + } + + void run() + { + const int thingsToDo = 10; + + for (int i = 0; i < thingsToDo; ++i) + { + // must check this as often as possible, because this is + // how we know if the user's pressed 'cancel' + if (threadShouldExit()) + break; + + // this will update the progress bar on the dialog box + setProgress (i / (double) thingsToDo); + + wait (500); + + setStatusMessage (String (thingsToDo - i) + T(" things left to do...")); + } + } +}; + +//============================================================================== +/** A DialogWindow containing a ColourSelector component */ +class ColourSelectorDialogWindow : public DialogWindow +{ +public: + ColourSelectorDialogWindow() + : DialogWindow (T("Colour selector demo"), + Colours::lightgrey, + true) + { + setContentComponent (new ColourSelector()); + centreWithSize (400, 400); + setResizable (true, true); + } + + ~ColourSelectorDialogWindow() + { + } + + void closeButtonPressed() + { + // we expect this component to be run within a modal loop, so when the close + // button is clicked, we can make it invisible to cause the loop to exit and the + // calling code will delete this object. + setVisible (false); + } +}; + +//============================================================================== +const int numGroups = 4; + +class WidgetsDemo : public Component, + public ButtonListener +{ + TextButton* menuButton; + ToggleButton* enableButton; + + DemoTabbedComponent* tabs; + +public: + //============================================================================== + WidgetsDemo (ApplicationCommandManager* commandManager) + { + setName (T("Widgets")); + + addAndMakeVisible (tabs = new DemoTabbedComponent (commandManager)); + + //============================================================================== + menuButton = new TextButton (T("click for a popup menu.."), + T("click for a demo of the different types of item you can put into a popup menu...")); + + addAndMakeVisible (menuButton); + menuButton->setBounds (10, 10, 200, 24); + menuButton->addButtonListener (this); + menuButton->setTriggeredOnMouseDown (true); // because this button pops up a menu, this lets us + // hold down the button and drag straight onto the menu + + //============================================================================== + enableButton = new ToggleButton (T("enable/disable components")); + addAndMakeVisible (enableButton); + enableButton->setBounds (230, 10, 180, 24); + enableButton->setTooltip (T("toggle button")); + enableButton->setToggleState (true, false); + enableButton->addButtonListener (this); + } + + ~WidgetsDemo() + { + deleteAllChildren(); + } + + void resized() + { + tabs->setBounds (10, 40, getWidth() - 20, getHeight() - 50); + } + + //============================================================================== + void buttonClicked (Button* button) + { + if (button == enableButton) + { + const bool enabled = enableButton->getToggleState(); + + menuButton->setEnabled (enabled); + tabs->setEnabled (enabled); + } + else if (button == menuButton) + { + PopupMenu m; + m.addItem (1, T("normal item")); + m.addItem (2, T("disabled item"), false); + m.addItem (3, T("ticked item"), true, true); + m.addColouredItem (4, T("coloured item"), Colours::green); + m.addSeparator(); + m.addCustomItem (5, new CustomMenuComponent()); + + m.addSeparator(); + + PopupMenu tabsMenu; + tabsMenu.addItem (1001, T("show tabs at the top"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtTop); + tabsMenu.addItem (1002, T("show tabs at the bottom"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtBottom); + tabsMenu.addItem (1003, T("show tabs at the left"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtLeft); + tabsMenu.addItem (1004, T("show tabs at the right"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtRight); + m.addSubMenu (T("tab position"), tabsMenu); + + m.addSeparator(); + + PopupMenu dialogMenu; + dialogMenu.addItem (100, T("show a plain alert-window...")); + dialogMenu.addItem (101, T("show an alert-window with a 'warning' icon...")); + dialogMenu.addItem (102, T("show an alert-window with an 'info' icon...")); + dialogMenu.addItem (103, T("show an alert-window with a 'question' icon...")); + + dialogMenu.addSeparator(); + + dialogMenu.addItem (110, T("show an ok/cancel alert-window...")); + + dialogMenu.addSeparator(); + + dialogMenu.addItem (111, T("show an alert-window with some extra components...")); + + dialogMenu.addSeparator(); + + dialogMenu.addItem (112, T("show a ThreadWithProgressWindow demo...")); + + m.addSubMenu (T("AlertWindow demonstrations"), dialogMenu); + + dialogMenu.addSeparator(); + + m.addItem (120, T("show a colour selector demo...")); + + dialogMenu.addSeparator(); + + PopupMenu nativeFileChoosers; + nativeFileChoosers.addItem (121, T("'load' file browser...")); + nativeFileChoosers.addItem (124, T("'load' file browser with an image file preview...")); + nativeFileChoosers.addItem (122, T("'save' file browser...")); + nativeFileChoosers.addItem (123, T("choose directory file browser...")); + + PopupMenu juceFileChoosers; + juceFileChoosers.addItem (131, T("'load' file browser...")); + juceFileChoosers.addItem (134, T("'load' file browser with an image file preview...")); + juceFileChoosers.addItem (132, T("'save' file browser...")); + juceFileChoosers.addItem (133, T("choose directory file browser...")); + + PopupMenu fileChoosers; + fileChoosers.addSubMenu (T("Operating system dialogs"), nativeFileChoosers); + fileChoosers.addSubMenu (T("Juce dialogs"), juceFileChoosers); + + m.addSubMenu (T("file chooser dialogs"), fileChoosers); + + int result = m.showAt (menuButton); + + if (result != 0) + { + // user chose something from the menu.. + + if (result >= 100 && result < 105) + { + AlertWindow::AlertIconType icon = AlertWindow::NoIcon; + + if (result == 101) + icon = AlertWindow::WarningIcon; + else if (result == 102) + icon = AlertWindow::InfoIcon; + else if (result == 103) + icon = AlertWindow::QuestionIcon; + + AlertWindow::showMessageBox (icon, + T("This is an AlertWindow"), + T("And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah."), + T("ok")); + } + else if (result == 110) + { + bool userPickedOk + = AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon, + T("This is an ok/cancel AlertWindow"), + T("And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.")); + } + else if (result == 111) + { + AlertWindow w (T("AlertWindow demo.."), + T("This AlertWindow has a couple of extra components added to show how to add drop-down lists and text entry boxes."), + AlertWindow::QuestionIcon); + + w.addTextEditor (T("text"), T("enter some text here"), T("text field:")); + + StringArray options; + options.add (T("option 1")); + options.add (T("option 2")); + options.add (T("option 3")); + options.add (T("option 4")); + w.addComboBox (T("option"), options, T("some options")); + + w.addButton (T("ok"), 1, KeyPress (KeyPress::returnKey, 0, 0)); + w.addButton (T("cancel"), 0, KeyPress (KeyPress::escapeKey, 0, 0)); + + if (w.runModalLoop() != 0) // is they picked 'ok' + { + // this is the item they chose in the drop-down list.. + const int optionIndexChosen = w.getComboBoxComponent (T("option"))->getSelectedItemIndex(); + + // this is the text they entered.. + String text = w.getTextEditorContents (T("text")); + + } + } + else if (result == 112) + { + DemoBackgroundThread demoThread; + + if (demoThread.runThread()) + { + // thread finished normally.. + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Progress window"), + T("Thread finished ok!")); + } + else + { + // user pressed the cancel button.. + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + T("Progress window"), + T("You pressed cancel!")); + } + + } + else if (result == 120) + { + ColourSelectorDialogWindow colourDialog; + + // this will run an event loop until the dialog's closeButtonPressed() + // method causes the loop to exit. + colourDialog.runModalLoop(); + } + else if (result >= 121 && result < 139) + { + const bool useNativeVersion = result < 130; + if (result > 130) + result -= 10; + + if (result == 121) + { + FileChooser fc (T("Choose a file to open..."), + File::getCurrentWorkingDirectory(), + T("*"), + useNativeVersion); + + if (fc.browseForFileToOpen()) + { + File chosenFile = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenFile.getFullPathName()); + } + } + else if (result == 124) + { + ImagePreviewComponent imagePreview; + imagePreview.setSize (200, 200); + + FileChooser fc (T("Choose an image to open..."), + File::getCurrentWorkingDirectory(), + T("*.jpg;*.jpeg;*.png;*.gif"), + useNativeVersion); + + if (fc.browseForFileToOpen (&imagePreview)) + { + File chosenFile = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenFile.getFullPathName()); + } + } + else if (result == 122) + { + FileChooser fc (T("Choose a file to save..."), + File::getCurrentWorkingDirectory(), + T("*"), + useNativeVersion); + + if (fc.browseForFileToSave (true)) + { + File chosenFile = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenFile.getFullPathName()); + } + } + else if (result == 123) + { + FileChooser fc (T("Choose a directory..."), + File::getCurrentWorkingDirectory(), + T("*"), + useNativeVersion); + + if (fc.browseForDirectory()) + { + File chosenDirectory = fc.getResult(); + + AlertWindow::showMessageBox (AlertWindow::InfoIcon, + T("File Chooser..."), + T("You picked: ") + chosenDirectory.getFullPathName()); + } + } + } + else if (result == 1001) + { + tabs->setOrientation (TabbedButtonBar::TabsAtTop); + } + else if (result == 1002) + { + tabs->setOrientation (TabbedButtonBar::TabsAtBottom); + } + else if (result == 1003) + { + tabs->setOrientation (TabbedButtonBar::TabsAtLeft); + } + else if (result == 1004) + { + tabs->setOrientation (TabbedButtonBar::TabsAtRight); + } + } + } + } +}; + + +//============================================================================== +Component* createWidgetsDemo (ApplicationCommandManager* commandManager) +{ + return new WidgetsDemo (commandManager); +} diff --git a/extras/juce demo/src/jucedemo_headers.h b/extras/juce demo/src/jucedemo_headers.h new file mode 100644 index 0000000000..46cb2e4e19 --- /dev/null +++ b/extras/juce demo/src/jucedemo_headers.h @@ -0,0 +1,62 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCEDEMO_HEADERS_JUCEHEADER__ +#define __JUCEDEMO_HEADERS_JUCEHEADER__ + + +// include the JUCE headers.. +#include "../../../juce.h" + +// this declares the binary resources that we're building into the +// application - i.e. images, sounds, etc that the demos use +#include "BinaryData.h" + +// Pre-declare the functions that create each of the demo components.. +Component* createFontsAndTextDemo(); +Component* createPathsAndTransformsDemo(); +Component* createWidgetsDemo (ApplicationCommandManager* commandManager); +Component* createThreadingDemo(); +Component* createTreeViewDemo(); +Component* createTableDemo(); +Component* createAudioDemo(); +Component* createDragAndDropDemo(); +Component* createInterprocessCommsDemo(); + +#if JUCE_QUICKTIME && ! JUCE_LINUX + Component* createQuickTimeDemo(); +#endif + +#if JUCE_OPENGL + Component* createOpenGLDemo(); +#endif + +#endif // __JUCEDEMO_HEADERS_JUCEHEADER__ diff --git a/extras/the jucer/Jucer To Do list.txt b/extras/the jucer/Jucer To Do list.txt new file mode 100644 index 0000000000..000f0856d4 --- /dev/null +++ b/extras/the jucer/Jucer To Do list.txt @@ -0,0 +1,28 @@ + +Jucer things to do: +==================== + +- add tooltips when testing components +- add password character option to textboxes +- add a field for specifying constructor parameters for the component's base class +- add textbox font settings +- ability to change some properties when more than one item is selected +- a treeview of sub-objects and graphics elements, which can be selected +- creation of more event handling callback code for the various types of component +- polygon editing needs to be better and to support creating sub-paths +- gradient points should probably be relative to the shape they're in rather than the whole component (not sure about this though) +- look-and-feel editing +- add lots of code comments explaining how it all works! +- add UI help tips for the various property editors +- grouping components +- component effects like drop-shadows, etc +- some way of selecting things that are behind other things +- add callbacks for embedded jucer comps that are buttons +- flip + rotate of shapes +- editor for setting component properties on any component +- hit test alpha channel options +- auto-scrolling when you drag the mouse +- allow gradients to have more intermediate colours +- menu editor +- options for making font sizes, rounded rect corners, etc proportional +- allow standard widgets to specify a custom sub-class which will be created instead of the normal classname diff --git a/extras/the jucer/build/linux/Jucer.make b/extras/the jucer/build/linux/Jucer.make new file mode 100644 index 0000000000..7ced18551a --- /dev/null +++ b/extras/the jucer/build/linux/Jucer.make @@ -0,0 +1,255 @@ +# C++ Windowed Executable Makefile autogenerated by premake +# Don't edit this file! Instead edit `premake.lua` then rerun `make` + +ifndef CONFIG + CONFIG=Debug +endif + +ifeq ($(CONFIG),Debug) + BINDIR := build + LIBDIR := build + OBJDIR := build/intermediate/Debug + OUTDIR := build + CPPFLAGS := -MD -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -I "/usr/include" + CFLAGS += $(CPPFLAGS) -g -D_DEBUG -ggdb + CXXFLAGS := $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -L "/usr/X11R6/lib/" -L "../../../../bin" -lfreetype -lpthread -lX11 -lGL -lGLU -lXinerama -lasound -ljuce_debug + LDDEPS := + TARGET := jucer +endif + +ifeq ($(CONFIG),Release) + BINDIR := build + LIBDIR := build + OBJDIR := build/intermediate/Release + OUTDIR := build + CPPFLAGS := -MD -D "LINUX=1" -D "NDEBUG=1" -I "/usr/include" + CFLAGS += $(CPPFLAGS) -O2 + CXXFLAGS := $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -s -L "/usr/X11R6/lib/" -L "../../../../bin" -lfreetype -lpthread -lX11 -lGL -lGLU -lXinerama -lasound -ljuce + LDDEPS := + TARGET := jucer +endif + +OBJECTS := \ + $(OBJDIR)/BinaryData.o \ + $(OBJDIR)/jucer_Main.o \ + $(OBJDIR)/jucer_ComponentLayoutEditor.o \ + $(OBJDIR)/jucer_ComponentLayoutPanel.o \ + $(OBJDIR)/jucer_ComponentOverlayComponent.o \ + $(OBJDIR)/jucer_EditingPanelBase.o \ + $(OBJDIR)/jucer_JucerDocumentHolder.o \ + $(OBJDIR)/jucer_MainWindow.o \ + $(OBJDIR)/jucer_PaintRoutineEditor.o \ + $(OBJDIR)/jucer_PaintRoutinePanel.o \ + $(OBJDIR)/jucer_PrefsPanel.o \ + $(OBJDIR)/jucer_ResourceEditorPanel.o \ + $(OBJDIR)/jucer_SnapGridPainter.o \ + $(OBJDIR)/jucer_TestComponent.o \ + $(OBJDIR)/jucer_StoredSettings.o \ + $(OBJDIR)/jucer_UtilityFunctions.o \ + $(OBJDIR)/jucer_FilePropertyComponent.o \ + $(OBJDIR)/jucer_FontPropertyComponent.o \ + $(OBJDIR)/jucer_BinaryResources.o \ + $(OBJDIR)/jucer_ComponentLayout.o \ + $(OBJDIR)/jucer_GeneratedCode.o \ + $(OBJDIR)/jucer_JucerDocument.o \ + $(OBJDIR)/jucer_ObjectTypes.o \ + $(OBJDIR)/jucer_PaintRoutine.o \ + $(OBJDIR)/jucer_ComponentTypeHandler.o \ + $(OBJDIR)/jucer_ButtonDocument.o \ + $(OBJDIR)/jucer_ComponentDocument.o \ + $(OBJDIR)/jucer_ColouredElement.o \ + $(OBJDIR)/jucer_FillType.o \ + $(OBJDIR)/jucer_PaintElement.o \ + $(OBJDIR)/jucer_PaintElementPath.o \ + $(OBJDIR)/jucer_StrokeType.o \ + +CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) +ifeq (,$(CMD)) + CMD_MKBINDIR := mkdir -p $(BINDIR) + CMD_MKLIBDIR := mkdir -p $(LIBDIR) + CMD_MKOUTDIR := mkdir -p $(OUTDIR) + CMD_MKOBJDIR := mkdir -p $(OBJDIR) +else + CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) + CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) + CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) + CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) +endif + +.PHONY: clean + +$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) + @echo Linking Jucer + -@$(CMD_MKBINDIR) + -@$(CMD_MKLIBDIR) + -@$(CMD_MKOUTDIR) + @$(CXX) -o $@ $(OBJECTS) $(LDFLAGS) $(RESOURCES) + +clean: + @echo Cleaning Jucer + -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) + +$(OBJDIR)/BinaryData.o: ../../src/BinaryData.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_Main.o: ../../src/jucer_Main.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ComponentLayoutEditor.o: ../../src/ui/jucer_ComponentLayoutEditor.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ComponentLayoutPanel.o: ../../src/ui/jucer_ComponentLayoutPanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ComponentOverlayComponent.o: ../../src/ui/jucer_ComponentOverlayComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_EditingPanelBase.o: ../../src/ui/jucer_EditingPanelBase.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_JucerDocumentHolder.o: ../../src/ui/jucer_JucerDocumentHolder.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_MainWindow.o: ../../src/ui/jucer_MainWindow.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_PaintRoutineEditor.o: ../../src/ui/jucer_PaintRoutineEditor.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_PaintRoutinePanel.o: ../../src/ui/jucer_PaintRoutinePanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_PrefsPanel.o: ../../src/ui/jucer_PrefsPanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ResourceEditorPanel.o: ../../src/ui/jucer_ResourceEditorPanel.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_SnapGridPainter.o: ../../src/ui/jucer_SnapGridPainter.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_TestComponent.o: ../../src/ui/jucer_TestComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_StoredSettings.o: ../../src/utility/jucer_StoredSettings.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_UtilityFunctions.o: ../../src/utility/jucer_UtilityFunctions.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_FilePropertyComponent.o: ../../src/properties/jucer_FilePropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_FontPropertyComponent.o: ../../src/properties/jucer_FontPropertyComponent.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_BinaryResources.o: ../../src/model/jucer_BinaryResources.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ComponentLayout.o: ../../src/model/jucer_ComponentLayout.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_GeneratedCode.o: ../../src/model/jucer_GeneratedCode.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_JucerDocument.o: ../../src/model/jucer_JucerDocument.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ObjectTypes.o: ../../src/model/jucer_ObjectTypes.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_PaintRoutine.o: ../../src/model/jucer_PaintRoutine.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ComponentTypeHandler.o: ../../src/model/components/jucer_ComponentTypeHandler.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ButtonDocument.o: ../../src/model/documents/jucer_ButtonDocument.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ComponentDocument.o: ../../src/model/documents/jucer_ComponentDocument.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_ColouredElement.o: ../../src/model/paintelements/jucer_ColouredElement.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_FillType.o: ../../src/model/paintelements/jucer_FillType.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_PaintElement.o: ../../src/model/paintelements/jucer_PaintElement.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_PaintElementPath.o: ../../src/model/paintelements/jucer_PaintElementPath.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/jucer_StrokeType.o: ../../src/model/paintelements/jucer_StrokeType.cpp + -@$(CMD_MKOBJDIR) + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJECTS:%.o=%.d) + diff --git a/extras/the jucer/build/linux/Makefile b/extras/the jucer/build/linux/Makefile new file mode 100644 index 0000000000..99d707d0e6 --- /dev/null +++ b/extras/the jucer/build/linux/Makefile @@ -0,0 +1,25 @@ +# Makefile autogenerated by premake +# Don't edit this file! Instead edit `premake.lua` then rerun `make` +# Options: +# CONFIG=[Debug|Release] + +ifndef CONFIG + CONFIG=Debug +endif + +export CONFIG + +.PHONY: all clean Jucer + +all: Jucer + +Makefile: jucer_premake.lua + @echo ==== Regenerating Makefiles ==== + @premake --file $^ --cc gcc --target gnu + +Jucer: + @echo ==== Building Jucer ==== + @$(MAKE) --no-print-directory -C . -f Jucer.make + +clean: + @$(MAKE) --no-print-directory -C . -f Jucer.make clean diff --git a/extras/the jucer/build/linux/jucer_premake.lua b/extras/the jucer/build/linux/jucer_premake.lua new file mode 100644 index 0000000000..1db930c8f9 --- /dev/null +++ b/extras/the jucer/build/linux/jucer_premake.lua @@ -0,0 +1,61 @@ + +project.name = "Jucer" +project.bindir = "build" +project.libdir = "build" + +project.configs = { "Debug", "Release" } + +package = newpackage() +package.name = "Jucer" +package.kind = "winexe" +package.language = "c++" + +package.objdir = "build/intermediate" +package.config["Debug"].objdir = "build/intermediate/Debug" +package.config["Release"].objdir = "build/intermediate/Release" + +package.config["Debug"].defines = { "LINUX=1", "DEBUG=1", "_DEBUG=1" }; +package.config["Debug"].buildoptions = { "-D_DEBUG -ggdb" } + +package.config["Release"].defines = { "LINUX=1", "NDEBUG=1" }; + +package.target = "jucer" + +package.includepaths = { + "/usr/include" +} + +package.libpaths = { + "/usr/X11R6/lib/", + "../../../../bin" +} + +package.config["Debug"].links = { + "freetype", "pthread", "X11", "GL", "GLU", "Xinerama", "asound", "juce_debug" +} + +package.config["Release"].links = { + "freetype", "pthread", "X11", "GL", "GLU", "Xinerama", "asound", "juce" +} + +package.linkflags = { "static-runtime" } + +package.files = { matchfiles ( + "../../src/*.h", + "../../src/*.cpp", + "../../src/ui/*.h", + "../../src/ui/*.cpp", + "../../src/utility/*.h", + "../../src/utility/*.cpp", + "../../src/properties/*.h", + "../../src/properties/*.cpp", + "../../src/model/*.h", + "../../src/model/*.cpp", + "../../src/model/components/*.h", + "../../src/model/components/*.cpp", + "../../src/model/documents/*.h", + "../../src/model/documents/*.cpp", + "../../src/model/paintelements/*.h", + "../../src/model/paintelements/*.cpp" + ) +} diff --git a/extras/the jucer/build/linux/runpremake b/extras/the jucer/build/linux/runpremake new file mode 100644 index 0000000000..ad1b7a8e4d --- /dev/null +++ b/extras/the jucer/build/linux/runpremake @@ -0,0 +1 @@ +premake --file jucer_premake.lua --cc gcc --target gnu \ No newline at end of file diff --git a/extras/the jucer/build/mac/English.lproj/InfoPlist.strings b/extras/the jucer/build/mac/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..22f07dba592b23480da3f94e16a13d1c0c61ed9e GIT binary patch literal 212 zcmW-b&kn(G5QM*TpF$iPK^$Df$%O=m_6drX#-BEA5#Gp4;>$0a?Cj3YO!oU@L`;u0 z6?-x+l)T9~$UVe{R;J=6_Qb-zax0vN)Is0U$(~ief+{vMvbLlwxpOu5M&dm)H)E$O vXJJCEqcQ);DP+ve>GQEC>Yn08?7| + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + jucer_icon.icns + CFBundleIdentifier + com.rawmaterialsoftware.Jucer + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + + + diff --git a/extras/the jucer/build/mac/Jucer.xcodeproj/project.pbxproj b/extras/the jucer/build/mac/Jucer.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..d8234d99cd --- /dev/null +++ b/extras/the jucer/build/mac/Jucer.xcodeproj/project.pbxproj @@ -0,0 +1,642 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 846929140A49DB9C00314975 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 846929130A49DB9C00314975 /* juce.xcconfig */; }; + 84F1769F0A271BBD00908B2F /* jucer_StoredSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1769B0A271BBD00908B2F /* jucer_StoredSettings.cpp */; }; + 84F176A00A271BBD00908B2F /* jucer_UtilityFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1769D0A271BBD00908B2F /* jucer_UtilityFunctions.cpp */; }; + 84F176BA0A271BD000908B2F /* jucer_ComponentLayoutEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176A20A271BD000908B2F /* jucer_ComponentLayoutEditor.cpp */; }; + 84F176BB0A271BD000908B2F /* jucer_ComponentLayoutPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176A40A271BD000908B2F /* jucer_ComponentLayoutPanel.cpp */; }; + 84F176BC0A271BD000908B2F /* jucer_ComponentOverlayComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176A60A271BD000908B2F /* jucer_ComponentOverlayComponent.cpp */; }; + 84F176BD0A271BD000908B2F /* jucer_EditingPanelBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176A80A271BD000908B2F /* jucer_EditingPanelBase.cpp */; }; + 84F176BE0A271BD000908B2F /* jucer_JucerDocumentHolder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176AA0A271BD000908B2F /* jucer_JucerDocumentHolder.cpp */; }; + 84F176BF0A271BD000908B2F /* jucer_MainWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176AC0A271BD000908B2F /* jucer_MainWindow.cpp */; }; + 84F176C00A271BD000908B2F /* jucer_PaintRoutineEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176AE0A271BD000908B2F /* jucer_PaintRoutineEditor.cpp */; }; + 84F176C10A271BD000908B2F /* jucer_PaintRoutinePanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176B00A271BD000908B2F /* jucer_PaintRoutinePanel.cpp */; }; + 84F176C20A271BD000908B2F /* jucer_PrefsPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176B20A271BD000908B2F /* jucer_PrefsPanel.cpp */; }; + 84F176C30A271BD000908B2F /* jucer_ResourceEditorPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176B40A271BD000908B2F /* jucer_ResourceEditorPanel.cpp */; }; + 84F176C40A271BD000908B2F /* jucer_SnapGridPainter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176B60A271BD000908B2F /* jucer_SnapGridPainter.cpp */; }; + 84F176C50A271BD000908B2F /* jucer_TestComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176B80A271BD000908B2F /* jucer_TestComponent.cpp */; }; + 84F176D20A271BE800908B2F /* jucer_FilePropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176CC0A271BE800908B2F /* jucer_FilePropertyComponent.cpp */; }; + 84F176D30A271BE800908B2F /* jucer_FontPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176CE0A271BE800908B2F /* jucer_FontPropertyComponent.cpp */; }; + 84F1771C0A271C2F00908B2F /* jucer_ComponentTypeHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176EA0A271C2E00908B2F /* jucer_ComponentTypeHandler.cpp */; }; + 84F1771D0A271C2F00908B2F /* jucer_ButtonDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176FA0A271C2E00908B2F /* jucer_ButtonDocument.cpp */; }; + 84F1771E0A271C2F00908B2F /* jucer_ComponentDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176FC0A271C2E00908B2F /* jucer_ComponentDocument.cpp */; }; + 84F1771F0A271C2F00908B2F /* jucer_BinaryResources.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F176FE0A271C2E00908B2F /* jucer_BinaryResources.cpp */; }; + 84F177200A271C2F00908B2F /* jucer_ComponentLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177000A271C2E00908B2F /* jucer_ComponentLayout.cpp */; }; + 84F177210A271C2F00908B2F /* jucer_GeneratedCode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177020A271C2E00908B2F /* jucer_GeneratedCode.cpp */; }; + 84F177220A271C2F00908B2F /* jucer_JucerDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177040A271C2E00908B2F /* jucer_JucerDocument.cpp */; }; + 84F177230A271C2F00908B2F /* jucer_ObjectTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177060A271C2E00908B2F /* jucer_ObjectTypes.cpp */; }; + 84F177240A271C2F00908B2F /* jucer_PaintRoutine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177080A271C2E00908B2F /* jucer_PaintRoutine.cpp */; }; + 84F177250A271C2F00908B2F /* jucer_ColouredElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1770B0A271C2E00908B2F /* jucer_ColouredElement.cpp */; }; + 84F177260A271C2F00908B2F /* jucer_PaintElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177100A271C2E00908B2F /* jucer_PaintElement.cpp */; }; + 84F177270A271C2F00908B2F /* jucer_PaintElementPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F177140A271C2F00908B2F /* jucer_PaintElementPath.cpp */; }; + 84F43CC30A2B5EF500284072 /* jucer_FillType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F43CC00A2B5EF500284072 /* jucer_FillType.cpp */; }; + 84F43CC40A2B5EF500284072 /* jucer_StrokeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F43CC20A2B5EF500284072 /* jucer_StrokeType.cpp */; }; + 84F43CC60A2B5F3700284072 /* jucer_icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 84F43CC50A2B5F3700284072 /* jucer_icon.icns */; }; + 84F555CF0A22381100A8311C /* Jucer To Do list.txt in Resources */ = {isa = PBXBuildFile; fileRef = 84F5556A0A22381000A8311C /* Jucer To Do list.txt */; }; + 84F555D30A22381100A8311C /* BinaryData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F555700A22381000A8311C /* BinaryData.cpp */; }; + 84F555D40A22381100A8311C /* jucer_Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F555730A22381000A8311C /* jucer_Main.cpp */; }; + 84F5592D0A223B0E00A8311C /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F559250A223B0E00A8311C /* AGL.framework */; }; + 84F5592E0A223B0E00A8311C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F559260A223B0E00A8311C /* Carbon.framework */; }; + 84F5592F0A223B0E00A8311C /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F559270A223B0E00A8311C /* CoreAudio.framework */; }; + 84F559300A223B0E00A8311C /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F559280A223B0E00A8311C /* CoreMIDI.framework */; }; + 84F559310A223B0E00A8311C /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F559290A223B0E00A8311C /* CoreServices.framework */; }; + 84F559320A223B0E00A8311C /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F5592A0A223B0E00A8311C /* IOKit.framework */; }; + 84F559330A223B0E00A8311C /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F5592B0A223B0E00A8311C /* OpenGL.framework */; }; + 84F559340A223B0E00A8311C /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F5592C0A223B0E00A8311C /* QuickTime.framework */; }; + 84FDB1B50C15C24F00CD0087 /* libjuce.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FDB1B20C15C24300CD0087 /* libjuce.a */; }; + 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 84FDB1B10C15C24300CD0087 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 84F559480A223B8400A8311C /* Juce.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC046055464E500DB518D /* libjuce.a */; + remoteInfo = Juce; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0867D6ABFE840B52C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 846929130A49DB9C00314975 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; + 84F176990A271BBD00908B2F /* jucer_ColourEditorComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ColourEditorComponent.h; sourceTree = ""; }; + 84F1769A0A271BBD00908B2F /* jucer_Colours.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_Colours.h; sourceTree = ""; }; + 84F1769B0A271BBD00908B2F /* jucer_StoredSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_StoredSettings.cpp; sourceTree = ""; }; + 84F1769C0A271BBD00908B2F /* jucer_StoredSettings.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_StoredSettings.h; sourceTree = ""; }; + 84F1769D0A271BBD00908B2F /* jucer_UtilityFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_UtilityFunctions.cpp; sourceTree = ""; }; + 84F1769E0A271BBD00908B2F /* jucer_UtilityFunctions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_UtilityFunctions.h; sourceTree = ""; }; + 84F176A10A271BD000908B2F /* jucer_CommandIDs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_CommandIDs.h; sourceTree = ""; }; + 84F176A20A271BD000908B2F /* jucer_ComponentLayoutEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ComponentLayoutEditor.cpp; sourceTree = ""; }; + 84F176A30A271BD000908B2F /* jucer_ComponentLayoutEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentLayoutEditor.h; sourceTree = ""; }; + 84F176A40A271BD000908B2F /* jucer_ComponentLayoutPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ComponentLayoutPanel.cpp; sourceTree = ""; }; + 84F176A50A271BD000908B2F /* jucer_ComponentLayoutPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentLayoutPanel.h; sourceTree = ""; }; + 84F176A60A271BD000908B2F /* jucer_ComponentOverlayComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ComponentOverlayComponent.cpp; sourceTree = ""; }; + 84F176A70A271BD000908B2F /* jucer_ComponentOverlayComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentOverlayComponent.h; sourceTree = ""; }; + 84F176A80A271BD000908B2F /* jucer_EditingPanelBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_EditingPanelBase.cpp; sourceTree = ""; }; + 84F176A90A271BD000908B2F /* jucer_EditingPanelBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_EditingPanelBase.h; sourceTree = ""; }; + 84F176AA0A271BD000908B2F /* jucer_JucerDocumentHolder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_JucerDocumentHolder.cpp; sourceTree = ""; }; + 84F176AB0A271BD000908B2F /* jucer_JucerDocumentHolder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_JucerDocumentHolder.h; sourceTree = ""; }; + 84F176AC0A271BD000908B2F /* jucer_MainWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_MainWindow.cpp; sourceTree = ""; }; + 84F176AD0A271BD000908B2F /* jucer_MainWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_MainWindow.h; sourceTree = ""; }; + 84F176AE0A271BD000908B2F /* jucer_PaintRoutineEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_PaintRoutineEditor.cpp; sourceTree = ""; }; + 84F176AF0A271BD000908B2F /* jucer_PaintRoutineEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintRoutineEditor.h; sourceTree = ""; }; + 84F176B00A271BD000908B2F /* jucer_PaintRoutinePanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_PaintRoutinePanel.cpp; sourceTree = ""; }; + 84F176B10A271BD000908B2F /* jucer_PaintRoutinePanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintRoutinePanel.h; sourceTree = ""; }; + 84F176B20A271BD000908B2F /* jucer_PrefsPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_PrefsPanel.cpp; sourceTree = ""; }; + 84F176B30A271BD000908B2F /* jucer_PrefsPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PrefsPanel.h; sourceTree = ""; }; + 84F176B40A271BD000908B2F /* jucer_ResourceEditorPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ResourceEditorPanel.cpp; sourceTree = ""; }; + 84F176B50A271BD000908B2F /* jucer_ResourceEditorPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ResourceEditorPanel.h; sourceTree = ""; }; + 84F176B60A271BD000908B2F /* jucer_SnapGridPainter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_SnapGridPainter.cpp; sourceTree = ""; }; + 84F176B70A271BD000908B2F /* jucer_SnapGridPainter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_SnapGridPainter.h; sourceTree = ""; }; + 84F176B80A271BD000908B2F /* jucer_TestComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_TestComponent.cpp; sourceTree = ""; }; + 84F176B90A271BD000908B2F /* jucer_TestComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_TestComponent.h; sourceTree = ""; }; + 84F176C60A271BE800908B2F /* jucer_ColourPropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ColourPropertyComponent.h; sourceTree = ""; }; + 84F176C70A271BE800908B2F /* jucer_ComponentChoiceProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentChoiceProperty.h; sourceTree = ""; }; + 84F176C80A271BE800908B2F /* jucer_ComponentColourProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentColourProperty.h; sourceTree = ""; }; + 84F176CA0A271BE800908B2F /* jucer_ComponentTextProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentTextProperty.h; sourceTree = ""; }; + 84F176CC0A271BE800908B2F /* jucer_FilePropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_FilePropertyComponent.cpp; sourceTree = ""; }; + 84F176CD0A271BE800908B2F /* jucer_FilePropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_FilePropertyComponent.h; sourceTree = ""; }; + 84F176CE0A271BE800908B2F /* jucer_FontPropertyComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_FontPropertyComponent.cpp; sourceTree = ""; }; + 84F176CF0A271BE800908B2F /* jucer_FontPropertyComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_FontPropertyComponent.h; sourceTree = ""; }; + 84F176D00A271BE800908B2F /* jucer_JustificationProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_JustificationProperty.h; sourceTree = ""; }; + 84F176D10A271BE800908B2F /* jucer_PositionPropertyBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PositionPropertyBase.h; sourceTree = ""; }; + 84F176E70A271C2E00908B2F /* jucer_ButtonHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ButtonHandler.h; sourceTree = ""; }; + 84F176E80A271C2E00908B2F /* jucer_ComboBoxHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComboBoxHandler.h; sourceTree = ""; }; + 84F176E90A271C2E00908B2F /* jucer_ComponentNameProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentNameProperty.h; sourceTree = ""; }; + 84F176EA0A271C2E00908B2F /* jucer_ComponentTypeHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ComponentTypeHandler.cpp; sourceTree = ""; }; + 84F176EB0A271C2E00908B2F /* jucer_ComponentTypeHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentTypeHandler.h; sourceTree = ""; }; + 84F176EC0A271C2E00908B2F /* jucer_ComponentUndoableAction.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentUndoableAction.h; sourceTree = ""; }; + 84F176ED0A271C2E00908B2F /* jucer_GenericComponentHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_GenericComponentHandler.h; sourceTree = ""; }; + 84F176EE0A271C2E00908B2F /* jucer_GroupComponentHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_GroupComponentHandler.h; sourceTree = ""; }; + 84F176EF0A271C2E00908B2F /* jucer_HyperlinkButtonHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_HyperlinkButtonHandler.h; sourceTree = ""; }; + 84F176F00A271C2E00908B2F /* jucer_JucerComponentHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_JucerComponentHandler.h; sourceTree = ""; }; + 84F176F10A271C2E00908B2F /* jucer_LabelHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_LabelHandler.h; sourceTree = ""; }; + 84F176F20A271C2E00908B2F /* jucer_SliderHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_SliderHandler.h; sourceTree = ""; }; + 84F176F30A271C2E00908B2F /* jucer_TabbedComponentHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_TabbedComponentHandler.h; sourceTree = ""; }; + 84F176F40A271C2E00908B2F /* jucer_TextButtonHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_TextButtonHandler.h; sourceTree = ""; }; + 84F176F50A271C2E00908B2F /* jucer_TextEditorHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_TextEditorHandler.h; sourceTree = ""; }; + 84F176F60A271C2E00908B2F /* jucer_ToggleButtonHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ToggleButtonHandler.h; sourceTree = ""; }; + 84F176F70A271C2E00908B2F /* jucer_TreeViewHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_TreeViewHandler.h; sourceTree = ""; }; + 84F176F80A271C2E00908B2F /* jucer_ViewportHandler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ViewportHandler.h; sourceTree = ""; }; + 84F176FA0A271C2E00908B2F /* jucer_ButtonDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ButtonDocument.cpp; sourceTree = ""; }; + 84F176FB0A271C2E00908B2F /* jucer_ButtonDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ButtonDocument.h; sourceTree = ""; }; + 84F176FC0A271C2E00908B2F /* jucer_ComponentDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ComponentDocument.cpp; sourceTree = ""; }; + 84F176FD0A271C2E00908B2F /* jucer_ComponentDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentDocument.h; sourceTree = ""; }; + 84F176FE0A271C2E00908B2F /* jucer_BinaryResources.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_BinaryResources.cpp; sourceTree = ""; }; + 84F176FF0A271C2E00908B2F /* jucer_BinaryResources.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_BinaryResources.h; sourceTree = ""; }; + 84F177000A271C2E00908B2F /* jucer_ComponentLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ComponentLayout.cpp; sourceTree = ""; }; + 84F177010A271C2E00908B2F /* jucer_ComponentLayout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentLayout.h; sourceTree = ""; }; + 84F177020A271C2E00908B2F /* jucer_GeneratedCode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_GeneratedCode.cpp; sourceTree = ""; }; + 84F177030A271C2E00908B2F /* jucer_GeneratedCode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_GeneratedCode.h; sourceTree = ""; }; + 84F177040A271C2E00908B2F /* jucer_JucerDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_JucerDocument.cpp; sourceTree = ""; }; + 84F177050A271C2E00908B2F /* jucer_JucerDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_JucerDocument.h; sourceTree = ""; }; + 84F177060A271C2E00908B2F /* jucer_ObjectTypes.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ObjectTypes.cpp; sourceTree = ""; }; + 84F177070A271C2E00908B2F /* jucer_ObjectTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ObjectTypes.h; sourceTree = ""; }; + 84F177080A271C2E00908B2F /* jucer_PaintRoutine.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_PaintRoutine.cpp; sourceTree = ""; }; + 84F177090A271C2E00908B2F /* jucer_PaintRoutine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintRoutine.h; sourceTree = ""; }; + 84F1770B0A271C2E00908B2F /* jucer_ColouredElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_ColouredElement.cpp; sourceTree = ""; }; + 84F1770C0A271C2E00908B2F /* jucer_ColouredElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ColouredElement.h; sourceTree = ""; }; + 84F1770D0A271C2E00908B2F /* jucer_ElementSiblingComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ElementSiblingComponent.h; sourceTree = ""; }; + 84F1770E0A271C2E00908B2F /* jucer_FillType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_FillType.h; sourceTree = ""; }; + 84F1770F0A271C2E00908B2F /* jucer_GradientPointComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_GradientPointComponent.h; sourceTree = ""; }; + 84F177100A271C2E00908B2F /* jucer_PaintElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_PaintElement.cpp; sourceTree = ""; }; + 84F177110A271C2F00908B2F /* jucer_PaintElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElement.h; sourceTree = ""; }; + 84F177120A271C2F00908B2F /* jucer_PaintElementEllipse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementEllipse.h; sourceTree = ""; }; + 84F177130A271C2F00908B2F /* jucer_PaintElementImage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementImage.h; sourceTree = ""; }; + 84F177140A271C2F00908B2F /* jucer_PaintElementPath.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_PaintElementPath.cpp; sourceTree = ""; }; + 84F177150A271C2F00908B2F /* jucer_PaintElementPath.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementPath.h; sourceTree = ""; }; + 84F177160A271C2F00908B2F /* jucer_PaintElementRectangle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementRectangle.h; sourceTree = ""; }; + 84F177170A271C2F00908B2F /* jucer_PaintElementRoundedRectangle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementRoundedRectangle.h; sourceTree = ""; }; + 84F177180A271C2F00908B2F /* jucer_PaintElementText.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementText.h; sourceTree = ""; }; + 84F177190A271C2F00908B2F /* jucer_PaintElementUndoableAction.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementUndoableAction.h; sourceTree = ""; }; + 84F1771A0A271C2F00908B2F /* jucer_PointComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PointComponent.h; sourceTree = ""; }; + 84F1771B0A271C2F00908B2F /* jucer_StrokeType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_StrokeType.h; sourceTree = ""; }; + 84F1F08B0A36D0EE008CCC5E /* jucer_PaintElementGroup.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_PaintElementGroup.h; sourceTree = ""; }; + 84F1F08C0A36D102008CCC5E /* jucer_ComponentBooleanProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ComponentBooleanProperty.h; sourceTree = ""; }; + 84F43CC00A2B5EF500284072 /* jucer_FillType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_FillType.cpp; sourceTree = ""; }; + 84F43CC10A2B5EF500284072 /* jucer_ImageResourceProperty.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = jucer_ImageResourceProperty.h; sourceTree = ""; }; + 84F43CC20A2B5EF500284072 /* jucer_StrokeType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = jucer_StrokeType.cpp; sourceTree = ""; }; + 84F43CC50A2B5F3700284072 /* jucer_icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = jucer_icon.icns; sourceTree = ""; }; + 84F5556A0A22381000A8311C /* Jucer To Do list.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "Jucer To Do list.txt"; path = "../../Jucer To Do list.txt"; sourceTree = SOURCE_ROOT; }; + 84F555700A22381000A8311C /* BinaryData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../src/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; + 84F555710A22381000A8311C /* BinaryData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../src/BinaryData.h; sourceTree = SOURCE_ROOT; }; + 84F555720A22381000A8311C /* jucer_Headers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jucer_Headers.h; path = ../../src/jucer_Headers.h; sourceTree = SOURCE_ROOT; }; + 84F555730A22381000A8311C /* jucer_Main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_Main.cpp; path = ../../src/jucer_Main.cpp; sourceTree = SOURCE_ROOT; }; + 84F555B00A22381000A8311C /* jucer_ComponentTemplate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentTemplate.h; path = ../../src/templates/jucer_ComponentTemplate.h; sourceTree = SOURCE_ROOT; }; + 84F559250A223B0E00A8311C /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + 84F559260A223B0E00A8311C /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 84F559270A223B0E00A8311C /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 84F559280A223B0E00A8311C /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = /System/Library/Frameworks/CoreMIDI.framework; sourceTree = ""; }; + 84F559290A223B0E00A8311C /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; + 84F5592A0A223B0E00A8311C /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; + 84F5592B0A223B0E00A8311C /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + 84F5592C0A223B0E00A8311C /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + 84F559480A223B8400A8311C /* Juce.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Juce.xcodeproj; path = ../../../../build/macosx/Juce.xcodeproj; sourceTree = SOURCE_ROOT; }; + 8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D0C4E970486CD37000505A6 /* Jucer.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Jucer.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D0C4E910486CD37000505A6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84FDB1B50C15C24F00CD0087 /* libjuce.a in Frameworks */, + 84F5592D0A223B0E00A8311C /* AGL.framework in Frameworks */, + 84F5592E0A223B0E00A8311C /* Carbon.framework in Frameworks */, + 84F5592F0A223B0E00A8311C /* CoreAudio.framework in Frameworks */, + 84F559300A223B0E00A8311C /* CoreMIDI.framework in Frameworks */, + 84F559310A223B0E00A8311C /* CoreServices.framework in Frameworks */, + 84F559320A223B0E00A8311C /* IOKit.framework in Frameworks */, + 84F559330A223B0E00A8311C /* OpenGL.framework in Frameworks */, + 84F559340A223B0E00A8311C /* QuickTime.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 195DF8CFFE9D517E11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D0C4E970486CD37000505A6 /* Jucer.app */, + ); + name = Products; + sourceTree = ""; + }; + 20286C29FDCF999611CA2CEA /* Jucer */ = { + isa = PBXGroup; + children = ( + 20286C2AFDCF999611CA2CEA /* Sources */, + 846929130A49DB9C00314975 /* juce.xcconfig */, + 84F5556A0A22381000A8311C /* Jucer To Do list.txt */, + 20286C2CFDCF999611CA2CEA /* Resources */, + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, + 195DF8CFFE9D517E11CA2CBB /* Products */, + ); + name = Jucer; + sourceTree = ""; + }; + 20286C2AFDCF999611CA2CEA /* Sources */ = { + isa = PBXGroup; + children = ( + 84F5556B0A22381000A8311C /* src */, + ); + name = Sources; + sourceTree = ""; + }; + 20286C2CFDCF999611CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 84F43CC50A2B5F3700284072 /* jucer_icon.icns */, + 8D0C4E960486CD37000505A6 /* Info.plist */, + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 84F559480A223B8400A8311C /* Juce.xcodeproj */, + 84F559250A223B0E00A8311C /* AGL.framework */, + 84F559260A223B0E00A8311C /* Carbon.framework */, + 84F559270A223B0E00A8311C /* CoreAudio.framework */, + 84F559280A223B0E00A8311C /* CoreMIDI.framework */, + 84F559290A223B0E00A8311C /* CoreServices.framework */, + 84F5592A0A223B0E00A8311C /* IOKit.framework */, + 84F5592B0A223B0E00A8311C /* OpenGL.framework */, + 84F5592C0A223B0E00A8311C /* QuickTime.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 84F176E60A271C2E00908B2F /* components */ = { + isa = PBXGroup; + children = ( + 84F176E70A271C2E00908B2F /* jucer_ButtonHandler.h */, + 84F176E80A271C2E00908B2F /* jucer_ComboBoxHandler.h */, + 84F176E90A271C2E00908B2F /* jucer_ComponentNameProperty.h */, + 84F176EA0A271C2E00908B2F /* jucer_ComponentTypeHandler.cpp */, + 84F176EB0A271C2E00908B2F /* jucer_ComponentTypeHandler.h */, + 84F176EC0A271C2E00908B2F /* jucer_ComponentUndoableAction.h */, + 84F176ED0A271C2E00908B2F /* jucer_GenericComponentHandler.h */, + 84F176EE0A271C2E00908B2F /* jucer_GroupComponentHandler.h */, + 84F176EF0A271C2E00908B2F /* jucer_HyperlinkButtonHandler.h */, + 84F176F00A271C2E00908B2F /* jucer_JucerComponentHandler.h */, + 84F176F10A271C2E00908B2F /* jucer_LabelHandler.h */, + 84F176F20A271C2E00908B2F /* jucer_SliderHandler.h */, + 84F176F30A271C2E00908B2F /* jucer_TabbedComponentHandler.h */, + 84F176F40A271C2E00908B2F /* jucer_TextButtonHandler.h */, + 84F176F50A271C2E00908B2F /* jucer_TextEditorHandler.h */, + 84F176F60A271C2E00908B2F /* jucer_ToggleButtonHandler.h */, + 84F176F70A271C2E00908B2F /* jucer_TreeViewHandler.h */, + 84F176F80A271C2E00908B2F /* jucer_ViewportHandler.h */, + ); + path = components; + sourceTree = ""; + }; + 84F176F90A271C2E00908B2F /* documents */ = { + isa = PBXGroup; + children = ( + 84F176FA0A271C2E00908B2F /* jucer_ButtonDocument.cpp */, + 84F176FB0A271C2E00908B2F /* jucer_ButtonDocument.h */, + 84F176FC0A271C2E00908B2F /* jucer_ComponentDocument.cpp */, + 84F176FD0A271C2E00908B2F /* jucer_ComponentDocument.h */, + ); + path = documents; + sourceTree = ""; + }; + 84F1770A0A271C2E00908B2F /* paintelements */ = { + isa = PBXGroup; + children = ( + 84F1770B0A271C2E00908B2F /* jucer_ColouredElement.cpp */, + 84F1770C0A271C2E00908B2F /* jucer_ColouredElement.h */, + 84F1770D0A271C2E00908B2F /* jucer_ElementSiblingComponent.h */, + 84F43CC00A2B5EF500284072 /* jucer_FillType.cpp */, + 84F1770E0A271C2E00908B2F /* jucer_FillType.h */, + 84F1770F0A271C2E00908B2F /* jucer_GradientPointComponent.h */, + 84F43CC10A2B5EF500284072 /* jucer_ImageResourceProperty.h */, + 84F177100A271C2E00908B2F /* jucer_PaintElement.cpp */, + 84F177110A271C2F00908B2F /* jucer_PaintElement.h */, + 84F177120A271C2F00908B2F /* jucer_PaintElementEllipse.h */, + 84F1F08B0A36D0EE008CCC5E /* jucer_PaintElementGroup.h */, + 84F177130A271C2F00908B2F /* jucer_PaintElementImage.h */, + 84F177140A271C2F00908B2F /* jucer_PaintElementPath.cpp */, + 84F177150A271C2F00908B2F /* jucer_PaintElementPath.h */, + 84F177160A271C2F00908B2F /* jucer_PaintElementRectangle.h */, + 84F177170A271C2F00908B2F /* jucer_PaintElementRoundedRectangle.h */, + 84F177180A271C2F00908B2F /* jucer_PaintElementText.h */, + 84F177190A271C2F00908B2F /* jucer_PaintElementUndoableAction.h */, + 84F1771A0A271C2F00908B2F /* jucer_PointComponent.h */, + 84F43CC20A2B5EF500284072 /* jucer_StrokeType.cpp */, + 84F1771B0A271C2F00908B2F /* jucer_StrokeType.h */, + ); + path = paintelements; + sourceTree = ""; + }; + 84F5556B0A22381000A8311C /* src */ = { + isa = PBXGroup; + children = ( + 84F555740A22381000A8311C /* model */, + 84F5559F0A22381000A8311C /* properties */, + 84F555AE0A22381000A8311C /* templates */, + 84F555B10A22381000A8311C /* ui */, + 84F555C90A22381000A8311C /* utility */, + 84F555700A22381000A8311C /* BinaryData.cpp */, + 84F555710A22381000A8311C /* BinaryData.h */, + 84F555720A22381000A8311C /* jucer_Headers.h */, + 84F555730A22381000A8311C /* jucer_Main.cpp */, + ); + name = src; + path = ../../src; + sourceTree = SOURCE_ROOT; + }; + 84F555740A22381000A8311C /* model */ = { + isa = PBXGroup; + children = ( + 84F176E60A271C2E00908B2F /* components */, + 84F176F90A271C2E00908B2F /* documents */, + 84F1770A0A271C2E00908B2F /* paintelements */, + 84F176FE0A271C2E00908B2F /* jucer_BinaryResources.cpp */, + 84F176FF0A271C2E00908B2F /* jucer_BinaryResources.h */, + 84F177000A271C2E00908B2F /* jucer_ComponentLayout.cpp */, + 84F177010A271C2E00908B2F /* jucer_ComponentLayout.h */, + 84F177020A271C2E00908B2F /* jucer_GeneratedCode.cpp */, + 84F177030A271C2E00908B2F /* jucer_GeneratedCode.h */, + 84F177040A271C2E00908B2F /* jucer_JucerDocument.cpp */, + 84F177050A271C2E00908B2F /* jucer_JucerDocument.h */, + 84F177060A271C2E00908B2F /* jucer_ObjectTypes.cpp */, + 84F177070A271C2E00908B2F /* jucer_ObjectTypes.h */, + 84F177080A271C2E00908B2F /* jucer_PaintRoutine.cpp */, + 84F177090A271C2E00908B2F /* jucer_PaintRoutine.h */, + ); + name = model; + path = ../../src/model; + sourceTree = SOURCE_ROOT; + }; + 84F5559F0A22381000A8311C /* properties */ = { + isa = PBXGroup; + children = ( + 84F176C60A271BE800908B2F /* jucer_ColourPropertyComponent.h */, + 84F1F08C0A36D102008CCC5E /* jucer_ComponentBooleanProperty.h */, + 84F176C70A271BE800908B2F /* jucer_ComponentChoiceProperty.h */, + 84F176C80A271BE800908B2F /* jucer_ComponentColourProperty.h */, + 84F176CA0A271BE800908B2F /* jucer_ComponentTextProperty.h */, + 84F176CC0A271BE800908B2F /* jucer_FilePropertyComponent.cpp */, + 84F176CD0A271BE800908B2F /* jucer_FilePropertyComponent.h */, + 84F176CE0A271BE800908B2F /* jucer_FontPropertyComponent.cpp */, + 84F176CF0A271BE800908B2F /* jucer_FontPropertyComponent.h */, + 84F176D00A271BE800908B2F /* jucer_JustificationProperty.h */, + 84F176D10A271BE800908B2F /* jucer_PositionPropertyBase.h */, + ); + name = properties; + path = ../../src/properties; + sourceTree = SOURCE_ROOT; + }; + 84F555AE0A22381000A8311C /* templates */ = { + isa = PBXGroup; + children = ( + 84F555B00A22381000A8311C /* jucer_ComponentTemplate.h */, + ); + name = templates; + path = ../../src/templates; + sourceTree = SOURCE_ROOT; + }; + 84F555B10A22381000A8311C /* ui */ = { + isa = PBXGroup; + children = ( + 84F176A10A271BD000908B2F /* jucer_CommandIDs.h */, + 84F176A20A271BD000908B2F /* jucer_ComponentLayoutEditor.cpp */, + 84F176A30A271BD000908B2F /* jucer_ComponentLayoutEditor.h */, + 84F176A40A271BD000908B2F /* jucer_ComponentLayoutPanel.cpp */, + 84F176A50A271BD000908B2F /* jucer_ComponentLayoutPanel.h */, + 84F176A60A271BD000908B2F /* jucer_ComponentOverlayComponent.cpp */, + 84F176A70A271BD000908B2F /* jucer_ComponentOverlayComponent.h */, + 84F176A80A271BD000908B2F /* jucer_EditingPanelBase.cpp */, + 84F176A90A271BD000908B2F /* jucer_EditingPanelBase.h */, + 84F176AA0A271BD000908B2F /* jucer_JucerDocumentHolder.cpp */, + 84F176AB0A271BD000908B2F /* jucer_JucerDocumentHolder.h */, + 84F176AC0A271BD000908B2F /* jucer_MainWindow.cpp */, + 84F176AD0A271BD000908B2F /* jucer_MainWindow.h */, + 84F176AE0A271BD000908B2F /* jucer_PaintRoutineEditor.cpp */, + 84F176AF0A271BD000908B2F /* jucer_PaintRoutineEditor.h */, + 84F176B00A271BD000908B2F /* jucer_PaintRoutinePanel.cpp */, + 84F176B10A271BD000908B2F /* jucer_PaintRoutinePanel.h */, + 84F176B20A271BD000908B2F /* jucer_PrefsPanel.cpp */, + 84F176B30A271BD000908B2F /* jucer_PrefsPanel.h */, + 84F176B40A271BD000908B2F /* jucer_ResourceEditorPanel.cpp */, + 84F176B50A271BD000908B2F /* jucer_ResourceEditorPanel.h */, + 84F176B60A271BD000908B2F /* jucer_SnapGridPainter.cpp */, + 84F176B70A271BD000908B2F /* jucer_SnapGridPainter.h */, + 84F176B80A271BD000908B2F /* jucer_TestComponent.cpp */, + 84F176B90A271BD000908B2F /* jucer_TestComponent.h */, + ); + name = ui; + path = ../../src/ui; + sourceTree = SOURCE_ROOT; + }; + 84F555C90A22381000A8311C /* utility */ = { + isa = PBXGroup; + children = ( + 84F176990A271BBD00908B2F /* jucer_ColourEditorComponent.h */, + 84F1769A0A271BBD00908B2F /* jucer_Colours.h */, + 84F1769B0A271BBD00908B2F /* jucer_StoredSettings.cpp */, + 84F1769C0A271BBD00908B2F /* jucer_StoredSettings.h */, + 84F1769D0A271BBD00908B2F /* jucer_UtilityFunctions.cpp */, + 84F1769E0A271BBD00908B2F /* jucer_UtilityFunctions.h */, + ); + name = utility; + path = ../../src/utility; + sourceTree = SOURCE_ROOT; + }; + 84FDB1AE0C15C24300CD0087 /* Products */ = { + isa = PBXGroup; + children = ( + 84FDB1B20C15C24300CD0087 /* libjuce.a */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D0C4E890486CD37000505A6 /* Jucer */ = { + isa = PBXNativeTarget; + buildConfigurationList = C0E91AC508A95435008D54AB /* Build configuration list for PBXNativeTarget "Jucer" */; + buildPhases = ( + 8D0C4E8C0486CD37000505A6 /* Resources */, + 8D0C4E8F0486CD37000505A6 /* Sources */, + 8D0C4E910486CD37000505A6 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Jucer; + productInstallPath = "$(HOME)/Applications"; + productName = Jucer; + productReference = 8D0C4E970486CD37000505A6 /* Jucer.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 20286C28FDCF999611CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "Jucer" */; + hasScannedForEncodings = 1; + mainGroup = 20286C29FDCF999611CA2CEA /* Jucer */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 84FDB1AE0C15C24300CD0087 /* Products */; + ProjectRef = 84F559480A223B8400A8311C /* Juce.xcodeproj */; + }, + ); + targets = ( + 8D0C4E890486CD37000505A6 /* Jucer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 84FDB1B20C15C24300CD0087 /* libjuce.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjuce.a; + remoteRef = 84FDB1B10C15C24300CD0087 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D0C4E8C0486CD37000505A6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */, + 84F555CF0A22381100A8311C /* Jucer To Do list.txt in Resources */, + 84F43CC60A2B5F3700284072 /* jucer_icon.icns in Resources */, + 846929140A49DB9C00314975 /* juce.xcconfig in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D0C4E8F0486CD37000505A6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84F555D30A22381100A8311C /* BinaryData.cpp in Sources */, + 84F555D40A22381100A8311C /* jucer_Main.cpp in Sources */, + 84F1769F0A271BBD00908B2F /* jucer_StoredSettings.cpp in Sources */, + 84F176A00A271BBD00908B2F /* jucer_UtilityFunctions.cpp in Sources */, + 84F176BA0A271BD000908B2F /* jucer_ComponentLayoutEditor.cpp in Sources */, + 84F176BB0A271BD000908B2F /* jucer_ComponentLayoutPanel.cpp in Sources */, + 84F176BC0A271BD000908B2F /* jucer_ComponentOverlayComponent.cpp in Sources */, + 84F176BD0A271BD000908B2F /* jucer_EditingPanelBase.cpp in Sources */, + 84F176BE0A271BD000908B2F /* jucer_JucerDocumentHolder.cpp in Sources */, + 84F176BF0A271BD000908B2F /* jucer_MainWindow.cpp in Sources */, + 84F176C00A271BD000908B2F /* jucer_PaintRoutineEditor.cpp in Sources */, + 84F176C10A271BD000908B2F /* jucer_PaintRoutinePanel.cpp in Sources */, + 84F176C20A271BD000908B2F /* jucer_PrefsPanel.cpp in Sources */, + 84F176C30A271BD000908B2F /* jucer_ResourceEditorPanel.cpp in Sources */, + 84F176C40A271BD000908B2F /* jucer_SnapGridPainter.cpp in Sources */, + 84F176C50A271BD000908B2F /* jucer_TestComponent.cpp in Sources */, + 84F176D20A271BE800908B2F /* jucer_FilePropertyComponent.cpp in Sources */, + 84F176D30A271BE800908B2F /* jucer_FontPropertyComponent.cpp in Sources */, + 84F1771C0A271C2F00908B2F /* jucer_ComponentTypeHandler.cpp in Sources */, + 84F1771D0A271C2F00908B2F /* jucer_ButtonDocument.cpp in Sources */, + 84F1771E0A271C2F00908B2F /* jucer_ComponentDocument.cpp in Sources */, + 84F1771F0A271C2F00908B2F /* jucer_BinaryResources.cpp in Sources */, + 84F177200A271C2F00908B2F /* jucer_ComponentLayout.cpp in Sources */, + 84F177210A271C2F00908B2F /* jucer_GeneratedCode.cpp in Sources */, + 84F177220A271C2F00908B2F /* jucer_JucerDocument.cpp in Sources */, + 84F177230A271C2F00908B2F /* jucer_ObjectTypes.cpp in Sources */, + 84F177240A271C2F00908B2F /* jucer_PaintRoutine.cpp in Sources */, + 84F177250A271C2F00908B2F /* jucer_ColouredElement.cpp in Sources */, + 84F177260A271C2F00908B2F /* jucer_PaintElement.cpp in Sources */, + 84F177270A271C2F00908B2F /* jucer_PaintElementPath.cpp in Sources */, + 84F43CC30A2B5EF500284072 /* jucer_FillType.cpp in Sources */, + 84F43CC40A2B5EF500284072 /* jucer_StrokeType.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0867D6ABFE840B52C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C0E91AC608A95435008D54AB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Jucer; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C0E91AC708A95435008D54AB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Jucer; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C0E91ACA08A95435008D54AB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 846929130A49DB9C00314975 /* juce.xcconfig */; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LIBRARY_SEARCH_PATHS = ../../../bin; + PREBINDING = NO; + }; + name = Debug; + }; + C0E91ACB08A95435008D54AB /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 846929130A49DB9C00314975 /* juce.xcconfig */; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LIBRARY_SEARCH_PATHS = ../../../bin; + PREBINDING = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C0E91AC508A95435008D54AB /* Build configuration list for PBXNativeTarget "Jucer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C0E91AC608A95435008D54AB /* Debug */, + C0E91AC708A95435008D54AB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "Jucer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C0E91ACA08A95435008D54AB /* Debug */, + C0E91ACB08A95435008D54AB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 20286C28FDCF999611CA2CEA /* Project object */; +} diff --git a/extras/the jucer/build/mac/jucer_icon.icns b/extras/the jucer/build/mac/jucer_icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..1a996aa2814adfe159cc5af8fc511d59e9c9e8c0 GIT binary patch literal 44212 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 M{nr>TIPU}h9}AasUjP6A literal 0 HcmV?d00001 diff --git a/extras/the jucer/build/mac/version.plist b/extras/the jucer/build/mac/version.plist new file mode 100644 index 0000000000..df8c3dc7d1 --- /dev/null +++ b/extras/the jucer/build/mac/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 92 + CFBundleVersion + 1.0 + ProductBuildVersion + 7K571 + ProjectName + NibPBTemplates + SourceVersion + 1200000 + + diff --git a/extras/the jucer/build/vc6/Jucer.dsp b/extras/the jucer/build/vc6/Jucer.dsp new file mode 100644 index 0000000000..59c3d0771c --- /dev/null +++ b/extras/the jucer/build/vc6/Jucer.dsp @@ -0,0 +1,549 @@ +# Microsoft Developer Studio Project File - Name="Jucer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=Jucer - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Jucer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Jucer.mak" CFG="Jucer - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Jucer - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "Jucer - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Jucer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "Jucer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Jucer - Win32 Release" +# Name "Jucer - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Group "model" + +# PROP Default_Filter "" +# Begin Group "components" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ButtonHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ComboBoxHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ComponentNameProperty.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ComponentTypeHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ComponentTypeHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ComponentUndoableAction.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_GenericComponentHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_GroupComponentHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_HyperlinkButtonHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_JucerComponentHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_LabelHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_SliderHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_TabbedComponentHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_TextButtonHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_TextEditorHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ToggleButtonHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_TreeViewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\components\jucer_ViewportHandler.h +# End Source File +# End Group +# Begin Group "paintelements" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_ColouredElement.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_ColouredElement.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_ElementSiblingComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_FillType.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_FillType.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_GradientPointComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_ImageResourceProperty.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElement.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElement.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementEllipse.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementImage.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementPath.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementPath.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementRectangle.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementRoundedRectangle.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementText.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PaintElementUndoableAction.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_PointComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_StrokeType.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\paintelements\jucer_StrokeType.h +# End Source File +# End Group +# Begin Group "documents" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\model\documents\jucer_ButtonDocument.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\documents\jucer_ButtonDocument.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\documents\jucer_ComponentDocument.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\documents\jucer_ComponentDocument.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\src\model\jucer_BinaryResources.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_BinaryResources.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_ComponentLayout.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_ComponentLayout.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_GeneratedCode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_GeneratedCode.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_JucerDocument.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_JucerDocument.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_ObjectTypes.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_ObjectTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_PaintRoutine.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\model\jucer_PaintRoutine.h +# End Source File +# End Group +# Begin Group "properties" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\properties\jucer_ColourPropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_ComponentChoiceProperty.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_ComponentColourProperty.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_ComponentTextProperty.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_FilePropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_FilePropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_FontPropertyComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_FontPropertyComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_JustificationProperty.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\properties\jucer_PositionPropertyBase.h +# End Source File +# End Group +# Begin Group "templates" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\templates\jucer_ComponentTemplate.h +# End Source File +# End Group +# Begin Group "ui" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\ui\jucer_CommandIDs.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ComponentLayoutEditor.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ComponentLayoutEditor.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ComponentLayoutPanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ComponentLayoutPanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ComponentOverlayComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ComponentOverlayComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_EditingPanelBase.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_EditingPanelBase.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_JucerDocumentHolder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_JucerDocumentHolder.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_MainWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_MainWindow.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_PaintRoutineEditor.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_PaintRoutineEditor.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_PaintRoutinePanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_PaintRoutinePanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_PrefsPanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_PrefsPanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ResourceEditorPanel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_ResourceEditorPanel.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_SnapGridPainter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_SnapGridPainter.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_TestComponent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\ui\jucer_TestComponent.h +# End Source File +# End Group +# Begin Group "utility" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\src\utility\jucer_ColourEditorComponent.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\utility\jucer_Colours.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\utility\jucer_StoredSettings.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\utility\jucer_StoredSettings.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\utility\jucer_UtilityFunctions.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\utility\jucer_UtilityFunctions.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\src\BinaryData.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\src\BinaryData.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\jucer_Headers.h +# End Source File +# Begin Source File + +SOURCE=..\..\src\jucer_Main.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\jucer.rc +# End Source File +# Begin Source File + +SOURCE=.\jucer_icon.ico +# End Source File +# End Group +# Begin Source File + +SOURCE="..\..\Jucer To Do list.txt" +# End Source File +# End Target +# End Project diff --git a/extras/the jucer/build/vc6/Jucer.dsw b/extras/the jucer/build/vc6/Jucer.dsw new file mode 100644 index 0000000000..dba6b48ec9 --- /dev/null +++ b/extras/the jucer/build/vc6/Jucer.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "JUCE"=..\..\..\build\win32\vc6\JUCE.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Jucer"=.\Jucer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name JUCE + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/extras/the jucer/build/vc6/jucer.rc b/extras/the jucer/build/vc6/jucer.rc new file mode 100644 index 0000000000..7f84778535 --- /dev/null +++ b/extras/the jucer/build/vc6/jucer.rc @@ -0,0 +1,2 @@ + +IDI_ICON1 ICON DISCARDABLE "jucer_icon.ico" diff --git a/extras/the jucer/build/vc6/jucer_icon.ico b/extras/the jucer/build/vc6/jucer_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..29d7270f446aabe19612c0bb46b9b8a013c9d8bb GIT binary patch literal 15086 zcmeHO2UJy8y1vFF_85BuK|pCr7rSCbRP2C)h@yxED_~d9SWyu>i9IHvJ!hZ&_qsPaT{&HO-P>>LFk0%y zzOK`G>U26w%aY%F@O&Gdxwt(2-BhRRQAekC7wNX=q26I~!Pdy-1vQP=n7TOs?bh#HJ2vFFB0XY6s(I_BdUw5y+@(sy z2@#tBy)+o8NS~!5fhSez5O?GAd8>=+YHRdaTD-333BB~3r;4tVUMlt0i>`}a`pi>g z>;^pRtd|Ns_3|3Vwv$!qe?*aPi?8kE_pzIb+c!)6^}&F%B3?5U!}nGD=;aOI;5Jqf z-#Lnu@1d7!cvh*GUMhCfOW^w=F1sE+iFxmOj{!@s#Zccrp?V2fu1e4nMVbWZ zr7?cDov27f64oDpdnzBNZZXn=Q=0cNewn^oEPu_~RW zD)J`Yy^gi3`Re6O%;}#1*>3(h+hxJElYXGxWrQL%`sxj^X5hQ-(-pBFsfZ`=b_i7@ z;2l-0gG=P{2ILU1S)|>{n_mU3ES}|dP%p!<#huefT!S5f;|TccHYc9>Jbo!ma3=w-xdkuJD=afKd&-XGRWhs3)@ZsFOJG5?KH-#+{4 z6_Q@peN1+keN^E`4)d>{bBw+5Q}Y=`d!53v#=8$qZTM{B)0?~1b-FX zygXs^uFxsFosXo+k~?A*mYeAsls2nhL}vYe1&@9cGJBZ~&rY*k|EqYzXD_@Yvi71# z%uldU!i4^{JOZC}7&-}G9`HXRec;1ffm_q}9*X&>yn+tH(*yq*96W>4W;Tw#_Q?Gc zRpy)*Spj&y@NrJV6$x6XNc^`VtpTUSL6K2_x%#iF#D1X4k|U}t1s-AF!S{S3VmAAR zbR3--2OP?@jnepq#^x_ITYOhKeo3C>;(g=zU!?7*%$zo*9) zw6>Uj?V%HRy#ze>n_m(mHMqtjX`QxBl_P*(cK~ogoG^aRd*ajC zwZBO|8qdDGUF16ghBKHSmLUmxiz5&;$Hg z@S}*sK~-$W=I12rxb_EsH)?*~uqMlY7Ei$TI4ZK?dlBm)h!Kbvrq<>2c9Xzg*d60z zS@4+~kdF1x$u`IXtk*w~A+z$LHM*aU<=aITeCABMM$B)vUt}m`HW&I_9&{SZUc-el zc0mkWzDG6W6;;3!?Va(+xZiS&UY39!7uc#R)_034N;&-LovIoRaqnKSwu-#^$Q^R; z2!9d@c}@OC_H(TAqt6Cc8^3i=Ze`)DT)$R}FizR8>$ z5*=6ANrOK$I%kaa%6rlp@8Tf$kxLcnhkR%j;`%qKu&@1y{je$KP8y#H-*$vv7Q7GJ z1a8`M!eyStxZDP|bKs0BN3li>)*X$@6|%KUd?;RFna|?1TS&%s+xMTyXwW<+9&p-~ z=ofXo&OqR?Rh463i}=Iu5H59(BXhBN+f@T>%82hto#&N z3SZ?9xjODukb~r$*64Q_oqN^}G{!(jy)mEoYrG~L+EKF*MdpJa3DDubb4zl^+E{nt zQ~LRhH*%8MTU42}UNz*X#FIEt2k9R?M(br2e77@rU=^O9uE9s%k>&tj9`ghIIC47b zvj$%qsqe(Y8M)Ic;2O6V`SxVRK%?h`l5r;TJK{+>m9`trXRSew)d{|>$>gE}4ZiJ! zf-FbGkhy?QAJ2SJgIjteZp`J|1NN7QMFrQzfDdy*Ek`Z=4S!QVs(=qmkYD$N44NQr zKZ75hm((2eN5Vz|AY<~))Ed+&(&jiyky!A3!dg`hBK9mrUBkSZG?%7ZTgRZEgpXL! z!i^5cG4z%HR83en*|sbRZr+Vk2m1h5Wg3pkC%f|El{cGG;a6 z-%eGUg8#HT%^o!PC88Zb#@2>w?aaB|J3d1$EGDuwK?8ZaeSQOY`8&JsSKW zQQ1CL$ZcHVf2QL-eM%3kF?2E3LtS?<2eI&wDmKASV7=gL8&rbp zI?!POyr~m}O?tfGua_l>n8)3dev`ApHTXLZ-l%3brLfQ)`GOmKE(bqkSO1;muZ z9#gT6`ZsM8`U#LfWvs!~M(TTY$bAlMr9ERh*0kOFNV-hSIShCvbHUw5Z&i03mzU(U zUy=6U|9Zs1&hRsuzt`60NSHfMsWKD())bGZAC2Ij7oc`!e(r|2Ydg8HXyb?18f)~L z8e`WMxmt$jUvYxIcR;?d0{)sdRulC#@t`hK_64Q-DrH_{m?nNJxswY{j6xz=L_=+S8~B0JjD7ly&e%_~7BoR0&T|B_48H0=T{L%xcpEu^gU#p=)S* zTW#G}8H1v;-*Op}y38i(>J__p9~kVi9pH6=4|PKfZ3(_Ir|R}s225jBF%R^5~q*!hRYuJ)~M0U zW?xs$LvyoS0@D_E9hGkTDzv`j+)C|-rM7h#kP_iEByEe+u#B@UhGl&15|qBvu7AoD zw?WCBJC8_z>m}DROcVZ{DKDbaiK^4Z=ykeIzv*-qcXhhzxjJ2iGdf-Qr&qaH_^g+` zwC{4U1~0D1b-6y_NNhQgyA_0e3Kv`>a6Ri&G{ukq{{5E&|K-4+%7OMFX|rd_#;`m@+7>T0oNL_uMrVc8iCeN%rh?{aaU>wwGiTMbEZ z{8JHm#l<=fPqS+im^RI9P+CT<5xLSJs#qL0Ka`e;0j&|EOJB^PTt0dtO%~mjI^hLU zXK?z@&VDHg?E_Of1N3XJ2>zd*j<{#<+&_6q-NBi+En;tqE$U9@V4jGP?2R$cWB;!7 z<;iDw&wfBl(87D$gnQB;G*_|eb@>?h(d(Z^>g7Hx=hW}g#QOf3x2zW55eMXBEy3sI zsUpV z?s9Qg|A|@H5&LuhdX3Ahrp}8me5Ksb6upzN zci3}m<~~cX2^(Omu#&dYj{W*<}AnafLSd4rgJ^SX+C)>nd zrJhepcGQZ3MlXx6@w~ocGiI@;$Gr%LgQ%M>iA-3b%4^V<(tU{1cu}YNqIa@0TVyBn zyk5T&dP~pKesew6@@>ZJj{K*k489MZRlr%NkjWHAm0o`)jDxP-`03Vr6~9=d2l7Uw;eT8;F|04Z2i& zLXoueOWE-voVE7{Pu;1~)GzIl{q~0jTWz)vwutpM!(Lg7nW~#h<3#pst>zc0rMeO?|{~dV0Xs@PH zvwq1xI&A;V(6eFu;eJ?m*zXDGWOe8TdjMs@HhxZ8SME~{HTA3DUl}x1hYve|IMD-f z&W$pF9@PoXd9r3lajWO?K5ALMPyO&hVXmU#-W>kB$zGB1=o7t_M}#5(vZqh5rmxyH}vyLzFwwi5c|1l);7Yv5zE;TIV?GjHkh@b5o4d%1P|J!u7c zUBLIg(4ht3`=awAGqK+1x6zl~tx8?^a`vK(;g-H9{u9?KG9K5<;7=dKdEPk7aEh@2 zGH2`~{+`G++zu;Z6_}YDx3&1$SrlVhX2loPXcm~6?0P^k^cy>X<}>hr3%4rLAHHxd z#?LOR@))Ht``ax>0UqN3;FiXnzlr~tRlt8uiQSl*!)LU0;!V2^LBHhoLy_&sr=r2L zLCBRTf6_odUMD11e8SSl7~`$o2S;c3tR0Xgp76Wu!6aN32}VrOwJE`cy`buV7qm!` z0vHwAQjeDMqbG|rB6M>!>-)a13{NNfD;A48>{jslsCvraS-*8{kus&fx z9*xk?JBQpT_)Eky=#YKl1F`LA@I%I^8}2Q;UOZ_r|E4%0PndZQx_%COpunB-)nIF* zL091;c*bYs3PpCH7knIe3_|agxN_f!_;U|AlKvC-+BvD}=pj#pO($Z{g6D5~gZGSg z%$p2x1H97UaIJ}}6*&T4G8VWUQlvruwB$b^j|X+yUp#M{fF2g;Tmm^B{Stc)CiFsE zo1=l3kVPfH4@1xQYsi9l@jMdstsT!L!EU&BM_LCXzux^fRd)SVHJtY$k4^21XfWuj z&5+|Bynyph@F^{EH44tjF@=Alu9vdyQAZH}`LLZ+@V}Lw=8M{TWsRB*QYS)}>*eY# zk!?78l zdK{TMEymvBAmm^?Lt+u0UucZCcHg*5Qi|=``-U2J1nlKJd}qxU5=<}=I}rJ z;ZHgsm$5|O!?Dlhy~cQJ_t-zPwiudu#T_!{ex(m|=p*cl*bD&-SxyWwZ;@k zw-M>HHJnS2Zo@M6IBqM+of)$eQMdeaCyvCv?@H{4pGS}93Hbfqx;Pr*26z&Rdi34{k$E`F!F_Q08p>B&i#D|la@vXB63;@^4#<2o zC!vU211A55MrMbY<7^po4fbxBgN}d<7D1P0BPOp%6G^&@+z9q*9Spt!o(9VpKZD(Y zrj4*So~JF#XHuqo|Jx(13%;xZz0M;QsQ?*KCZ1u6oJIcN^BK+$p|8?rROWt@h(CQe zZCSomL%)n`ZpcAB*;4`y&aee*)R5hwCwmZs0_MXW!Sk|kA|0fOeIVu)+z%&Djp;MK zC(rxOR^)U#dSRepGxGF#(BVj&E!c$q1#=%q;9@cBx}cxp|2+Kpu4h`N)YNUt92tXDPV<$6T0u zfh|6KBn`cja})R8to0)N6L(*?H6NCJ-5vD;_x)Kv_J-{rM?G2@I{h;7nEG80=PG^x zK2BjT#-HPGApH}y^a9=PEY z^2_~g+H<3ZyMO9YYxK9C*NDRzR2h0F#pFa)RPuX0yDB4wmdM@|2z}B6gAm;^ijM~ zUsnW=%Zi`$dqGQ7x%n8r12K>}vc_jqBV(95&e@-WuW1XN<#|QwuX#k#WB;j{qyB-_ ztKCH`$m{x6x8&RI2lR%x%wCW`^1yFzz(=6BP!T?cF~%4t`p(yY|1$W_jmQDRd3FlF zjpu0h|Mnt^|3wr7hIQeAb(au z7RP@Cf05%eKGP3U9)@$ohkbG$x9{}cIKMbJo_AZ^5%K7cyLJZU82@0nDbk-}O$ z)8PTW*Fzm!&+Fm>U{n5&7`^(Ft|QX?8}>=bwt+qHyeiMaQWl}`&tJi3b1z^3^u!$X za(C!GV^KKX*`RN90D0_Y*d=Q;^4jo!A@DbC$LVE1_AX9e!TE6HX3gpA_C7(3%~I`s zk`jSs#aG9)>@V;?N9K0@lK0jHZ=A6Y#~AGd-^9N9B-r&b_@~74h|P%A{on&>^Ynr3 z@P0L9bpZ5iK`!tC`V0H9|FRbIc#eks0`8kNdFPhY2annXrgkeEi+}k|1-qU}E9&-6 z$!fOzj^62m$A(@V&r;bzuN>jG*>j@*rvKyRhI`5?1b!tR@nAma?DIM1;T!wi_`jL; z_r-j4-fi=4NhjI_rt;{+zvHh$=aFd>YjwVqQy+Vwj_^_JkFj=O+@@>{7k+E^to6ek(a8#b! zU{aAZioPb6vA4tud5Go0ThbW&AbehbWS%ti&$w$dF!iX1U&?sj30cjI*ZWW2`;5(~ z+9^2I+qM7Y+1B1kA6j&|_&00sOXnPVU;fIh^Ti`pJ(89=`d$w17?NfIJpXO`)&EJJ zya+bR5d7hgQki2c-jy6;>ckO;jjD6R!K3mV&p>H8#sU&Y0*rY&cGBr^CJCpLbUK_* zGK}~f3+Qye8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/the jucer/build/vc8/jucer_icon.ico b/extras/the jucer/build/vc8/jucer_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..29d7270f446aabe19612c0bb46b9b8a013c9d8bb GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/extras/the jucer/src/binarydata/prefs_misc.png b/extras/the jucer/src/binarydata/prefs_misc.png new file mode 100644 index 0000000000000000000000000000000000000000..3b55e9b520b68ea6d2d0e290bf945eed0c19689d GIT binary patch literal 6162 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 Y!LhQSZLf^1@b3X1uf3jC+Zd_;2UA0dtpET3 literal 0 HcmV?d00001 diff --git a/extras/the jucer/src/jucer_Headers.h b/extras/the jucer/src/jucer_Headers.h new file mode 100644 index 0000000000..2a24903f09 --- /dev/null +++ b/extras/the jucer/src/jucer_Headers.h @@ -0,0 +1,67 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADERS_JUCEHEADER__ +#define __JUCER_HEADERS_JUCEHEADER__ + +#ifdef _MSC_VER + #pragma warning (disable: 4100 4505) +#endif + +#define DONT_LIST_JUCE_AUTOLINKEDLIBS 1 + +//============================================================================== +// Normally you'd just include juce.h here, but I'm doing it this way instead +// so that I'm guaranteed to spot any bugs that might creep in when using the +// macro-free include method.. +#include "../../../src/juce_WithoutMacros.h" +#include "../../../src/juce_DefineMacros.h" + +//============================================================================== +#define JUCER_MAJOR_VERSION 1 +#define JUCER_MINOR_VERSION 10 + +//============================================================================== +#include "BinaryData.h" +#include "utility/jucer_StoredSettings.h" +#include "utility/jucer_UtilityFunctions.h" +#include "ui/jucer_CommandIDs.h" + +//============================================================================== +const int editorEdgeGap = 4; + +const int numSwatchColours = 24; + +extern ApplicationCommandManager* commandManager; + + + +#endif // __JUCER_HEADERS_JUCEHEADER__ diff --git a/extras/the jucer/src/jucer_Main.cpp b/extras/the jucer/src/jucer_Main.cpp new file mode 100644 index 0000000000..7638a65f10 --- /dev/null +++ b/extras/the jucer/src/jucer_Main.cpp @@ -0,0 +1,118 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "jucer_Headers.h" +#include "ui/jucer_MainWindow.h" + +ApplicationCommandManager* commandManager = 0; + + +//============================================================================== +class JucerApplication : public JUCEApplication +{ + MainWindow* theMainWindow; + +public: + //============================================================================== + JucerApplication() + : theMainWindow (0) + { + } + + ~JucerApplication() + { + } + + //============================================================================== + void initialise (const String& commandLine) + { + commandManager = new ApplicationCommandManager(); + + theMainWindow = new MainWindow(); + theMainWindow->setVisible (true); + + ImageCache::setCacheTimeout (30 * 1000); + + if (commandLine.trim().isNotEmpty() + && ! commandLine.trim().startsWithChar (T('-'))) + anotherInstanceStarted (commandLine); + } + + void shutdown() + { + delete theMainWindow; + theMainWindow = 0; + + deleteAndZero (commandManager); + } + + //============================================================================== + void systemRequestedQuit() + { + if (theMainWindow == 0 || theMainWindow->closeAllDocuments()) + { + deleteAndZero (theMainWindow); + + StoredSettings::deleteInstance(); + + quit (false); + } + } + + //============================================================================== + const String getApplicationName() + { + return T("The Jucer"); + } + + const String getApplicationVersion() + { + return String (JUCER_MAJOR_VERSION) + T(".") + String (JUCER_MINOR_VERSION); + } + + bool moreThanOneInstanceAllowed() + { +#ifndef JUCE_LINUX + return false; +#else + return true; //xxx should be false but doesn't work on linux.. +#endif + } + + void anotherInstanceStarted (const String& commandLine) + { + if (theMainWindow != 0) + theMainWindow->openFile (commandLine.unquoted()); + } +}; + + +START_JUCE_APPLICATION(JucerApplication) diff --git a/extras/the jucer/src/model/components/jucer_ButtonHandler.h b/extras/the jucer/src/model/components/jucer_ButtonHandler.h new file mode 100644 index 0000000000..8d2eebfd74 --- /dev/null +++ b/extras/the jucer/src/model/components/jucer_ButtonHandler.h @@ -0,0 +1,406 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified 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. + + JUCE 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 JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCER_BUTTONHANDLER_JUCEHEADER__ +#define __JUCER_BUTTONHANDLER_JUCEHEADER__ + +#include "../../properties/jucer_ComponentChoiceProperty.h" +#include "../../properties/jucer_ComponentTextProperty.h" +#include "../../properties/jucer_ComponentBooleanProperty.h" +#include "jucer_ComponentUndoableAction.h" + + +//============================================================================== +/** +*/ +class ButtonHandler : public ComponentTypeHandler +{ +public: + //============================================================================== + ButtonHandler (const String& typeDescription_, + const String& className_, + const std::type_info& componentClass, + const int defaultWidth_, + const int defaultHeight_) + : ComponentTypeHandler (typeDescription_, className_, componentClass, + defaultWidth_, defaultHeight_) + {} + + //============================================================================== + void getEditableProperties (Component* component, JucerDocument& document, Array & properties) + { + ComponentTypeHandler::getEditableProperties (component, document, properties); + + Button* const b = dynamic_cast (component); + + properties.add (new ButtonTextProperty (b, document)); + + properties.add (new ButtonCallbackProperty (b, document)); + + properties.add (new ButtonRadioGroupProperty (b, document)); + + properties.add (new ButtonConnectedEdgeProperty (T("connected left"), Button::ConnectedOnLeft, b, document)); + properties.add (new ButtonConnectedEdgeProperty (T("connected right"), Button::ConnectedOnRight, b, document)); + properties.add (new ButtonConnectedEdgeProperty (T("connected top"), Button::ConnectedOnTop, b, document)); + properties.add (new ButtonConnectedEdgeProperty (T("connected bottom"), Button::ConnectedOnBottom, b, document)); + } + + XmlElement* createXmlFor (Component* comp, const ComponentLayout* layout) + { + Button* const b = dynamic_cast (comp); + + XmlElement* e = ComponentTypeHandler::createXmlFor (comp, layout); + e->setAttribute (T("buttonText"), b->getButtonText()); + e->setAttribute (T("connectedEdges"), b->getConnectedEdgeFlags()); + e->setAttribute (T("needsCallback"), needsButtonListener (b)); + e->setAttribute (T("radioGroupId"), b->getRadioGroupId()); + + return e; + } + + bool restoreFromXml (const XmlElement& xml, Component* comp, const ComponentLayout* layout) + { + Button* const b = dynamic_cast (comp); + + if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout)) + return false; + + b->setButtonText (xml.getStringAttribute (T("buttonText"), b->getButtonText())); + b->setConnectedEdges (xml.getIntAttribute (T("connectedEdges"), 0)); + setNeedsButtonListener (b, xml.getBoolAttribute (T("needsCallback"), true)); + b->setRadioGroupId (xml.getIntAttribute (T("radioGroupId"), 0)); + + return true; + } + + const String getCreationParameters (Component* component) + { + return quotedString (component->getName()); + } + + void fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName) + { + ComponentTypeHandler::fillInCreationCode (code, component, memberVariableName); + + Button* const b = dynamic_cast (component); + + if (b->getButtonText() != b->getName()) + { + code.constructorCode + << memberVariableName << "->setButtonText (" + << quotedString (b->getButtonText()) << ");\n"; + } + + if (b->getConnectedEdgeFlags() != 0) + { + StringArray flags; + + if (b->isConnectedOnLeft()) + flags.add (T("Button::ConnectedOnLeft")); + + if (b->isConnectedOnRight()) + flags.add (T("Button::ConnectedOnRight")); + + if (b->isConnectedOnTop()) + flags.add (T("Button::ConnectedOnTop")); + + if (b->isConnectedOnBottom()) + flags.add (T("Button::ConnectedOnBottom")); + + String s; + s << memberVariableName << "->setConnectedEdges (" + << flags.joinIntoString (T(" | ")) << ");\n"; + + code.constructorCode += s; + } + + if (b->getRadioGroupId() != 0) + code.constructorCode << memberVariableName << "->setRadioGroupId (" + << b->getRadioGroupId() << ");\n"; + + if (needsButtonListener (component)) + code.constructorCode << memberVariableName << "->addButtonListener (this);\n"; + } + + void fillInGeneratedCode (Component* component, GeneratedCode& code) + { + ComponentTypeHandler::fillInGeneratedCode (component, code); + + if (needsButtonListener (component)) + { + String& callback = code.getCallbackCode (T("public ButtonListener"), + T("void"), + T("buttonClicked (Button* buttonThatWasClicked)"), + true); + + if (callback.isNotEmpty()) + callback << "else "; + + const String memberVariableName (code.document->getComponentLayout()->getComponentMemberVariableName (component)); + const String userCodeComment (T("UserButtonCode_") + memberVariableName); + + callback + << "if (buttonThatWasClicked == " << memberVariableName + << ")\n{\n //[" << userCodeComment << "] -- add your button handler code here..\n //[/" << userCodeComment << "]\n}\n"; + } + } + + static bool needsButtonListener (Component* button) + { + return button->getComponentPropertyBool (T("generateListenerCallback"), false, true); + } + + static void setNeedsButtonListener (Component* button, const bool shouldDoCallback) + { + button->setComponentProperty (T("generateListenerCallback"), shouldDoCallback); + } + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //============================================================================== + class ButtonTextProperty : public ComponentTextProperty