Android.mk revision 1db9113bcc12368e405583804ceb8aa7c80cc0cd
17940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# Copyright (C) 2011 The Android Open Source Project
2011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang#
3011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# Licensed under the Apache License, Version 2.0 (the "License");
4011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# you may not use this file except in compliance with the License.
5011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# You may obtain a copy of the License at
6011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang#
7011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang#      http://www.apache.org/licenses/LICENSE-2.0
8011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang#
9011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# Unless required by applicable law or agreed to in writing, software
10011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# distributed under the License is distributed on an "AS IS" BASIS,
11011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# See the License for the specific language governing permissions and
13011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# limitations under the License.
14011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang#
15011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
16011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangLOCAL_PATH := $(call my-dir)
17011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
187940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrominclude art/build/Android.common.mk
197940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
207940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom########################################################################
217940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
227940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# subdirectories which are used as inputs for gtests
237940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromTEST_DEX_DIRECTORIES := \
247940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	AbstractMethod \
257940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	AllFields \
267940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	CreateMethodSignature \
277940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ExceptionHandle \
287940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	Interfaces \
297940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	Main \
307940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	MyClass \
317940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	MyClassNatives \
327940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	Nested \
337940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	NonStaticLeafMethods \
347940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ProtoCompare \
357940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ProtoCompare2 \
367940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	StaticLeafMethods \
377940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	Statics \
387940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	StaticsFromCode \
397940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	XandY
407940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
417940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# subdirectories of which are used with test-art-target-oat
427940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# Declare the simplest tests (Main, HelloWorld) first, the rest are alphabetical
437940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromTEST_OAT_DIRECTORIES := \
447940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	Main \
457940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	HelloWorld \
467940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	\
471db9113bcc12368e405583804ceb8aa7c80cc0cdBrian Carlstrom	NativeAllocations \
487940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ParallelGC \
497940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ReferenceMap \
507940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	StackWalk \
517940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ThreadStress
527940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
537940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# TODO: Enable when the StackWalk2 tests are passing
547940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#	StackWalk2 \
557940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
567940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_TARGET_DEX_FILES :=
577940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_HOST_DEX_FILES :=
587940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
597940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# $(1): module prefix
607940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# $(2): input test directory
617940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# $(3): target output module path (default module path is used on host)
627940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromdefine build-art-test-dex
637940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom  ifeq ($(ART_BUILD_TARGET),true)
647940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    include $(CLEAR_VARS)
657940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_MODULE := $(1)-$(2)
667940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_MODULE_TAGS := tests
677940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_SRC_FILES := $(call all-java-files-under, $(2))
687940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_JAVA_LIBRARIES := $(TARGET_CORE_JARS)
697940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_NO_STANDARD_LIBRARIES := true
707940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_MODULE_PATH := $(3)
717940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_DEX_PREOPT_IMAGE := $(TARGET_CORE_IMG_OUT)
727940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_DEX_PREOPT := false
737940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common.mk
747940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
757940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    include $(BUILD_JAVA_LIBRARY)
767940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    ART_TEST_TARGET_DEX_FILES += $(3)/$$(LOCAL_MODULE).jar
777940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom  endif
787940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
797940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom  ifeq ($(ART_BUILD_HOST),true)
807940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    include $(CLEAR_VARS)
817940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_MODULE := $(1)-$(2)
827940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_SRC_FILES := $(call all-java-files-under, $(2))
837940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_JAVA_LIBRARIES := $(HOST_CORE_JARS)
847940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_NO_STANDARD_LIBRARIES := true
857940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_DEX_PREOPT_IMAGE := $(HOST_CORE_IMG_OUT)
867940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_BUILD_HOST_DEX := true
877940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common.mk
887940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
897940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    include $(BUILD_HOST_JAVA_LIBRARY)
907940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom    ART_TEST_HOST_DEX_FILES += $$(LOCAL_MODULE_PATH)/$$(LOCAL_MODULE).jar
917940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom  endif
927940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromendef
937940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom$(foreach dir,$(TEST_DEX_DIRECTORIES), $(eval $(call build-art-test-dex,art-test-dex,$(dir),$(ART_NATIVETEST_OUT))))
947940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom$(foreach dir,$(TEST_OAT_DIRECTORIES), $(eval $(call build-art-test-dex,oat-test-dex,$(dir),$(ART_TEST_OUT))))
957940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
967940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom########################################################################
977940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
987940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_TARGET_OAT_TARGETS :=
997940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_HOST_OAT_TARGETS :=
1007940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_HOST_INTERPRETER_OAT_TARGETS :=
1017940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1027940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# $(1): directory
1037940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom# $(2): arguments
1047940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromdefine declare-test-art-oat-targets
1057940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom.PHONY: test-art-target-oat-$(1)
1067940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromtest-art-target-oat-$(1): $(ART_TEST_OUT)/oat-test-dex-$(1).jar test-art-target-sync
1077940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	adb shell touch $(ART_TEST_DIR)/test-art-target-oat-$(1)
1087940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	adb shell rm $(ART_TEST_DIR)/test-art-target-oat-$(1)
1097940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	adb shell sh -c "dalvikvm -XXlib:libartd.so -Ximage:$(ART_TEST_DIR)/core.art -classpath $(ART_TEST_DIR)/oat-test-dex-$(1).jar -Djava.library.path=$(ART_TEST_DIR) $(1) $(2) && touch $(ART_TEST_DIR)/test-art-target-oat-$(1)"
1107940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	$(hide) (adb pull $(ART_TEST_DIR)/test-art-target-oat-$(1) /tmp/ && echo test-art-target-oat-$(1) PASSED) || (echo test-art-target-oat-$(1) FAILED && exit 1)
1117940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	$(hide) rm /tmp/test-art-target-oat-$(1)
1127940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1137940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom$(HOST_OUT_JAVA_LIBRARIES)/oat-test-dex-$(1).odex: $(HOST_OUT_JAVA_LIBRARIES)/oat-test-dex-$(1).jar $(HOST_CORE_IMG_OUT) | $(DEX2OAT)
1147940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	$(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m --boot-image=$(HOST_CORE_IMG_OUT) --dex-file=$$< --oat-file=$$@ --instruction-set=$(HOST_ARCH) --host --host-prefix="" --android-root=$(HOST_OUT)
1157940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1167940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom.PHONY: test-art-host-oat-$(1)
1177940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromtest-art-host-oat-$(1): $(HOST_OUT_JAVA_LIBRARIES)/oat-test-dex-$(1).odex test-art-host-dependencies
1187940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	mkdir -p /tmp/android-data/test-art-host-oat-$(1)
1197940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ANDROID_DATA=/tmp/android-data/test-art-host-oat-$(1) \
1207940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	  ANDROID_ROOT=$(HOST_OUT) \
1217940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	  LD_LIBRARY_PATH=$(HOST_OUT_SHARED_LIBRARIES) \
1227940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	  dalvikvm -XXlib:libartd.so -Ximage:$(shell pwd)/$(HOST_CORE_IMG_OUT) -classpath $(HOST_OUT_JAVA_LIBRARIES)/oat-test-dex-$(1).jar -Djava.library.path=$(HOST_OUT_SHARED_LIBRARIES) $(1) $(2) \
1237940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom          && echo test-art-host-oat-$(1) PASSED || (echo test-art-host-oat-$(1) FAILED && exit 1)
1247940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	$(hide) rm -r /tmp/android-data/test-art-host-oat-$(1)
1257940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1267940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom.PHONY: test-art-host-interpreter-oat-$(1)
1277940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromtest-art-host-interpreter-oat-$(1): $(HOST_OUT_JAVA_LIBRARIES)/oat-test-dex-$(1).odex test-art-host-dependencies
1287940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	mkdir -p /tmp/android-data/test-art-host-interpreter-oat-$(1)
1297940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	ANDROID_DATA=/tmp/android-data/test-art-host-interpreter-oat-$(1) \
1307940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	  ANDROID_ROOT=$(HOST_OUT) \
1317940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	  LD_LIBRARY_PATH=$(HOST_OUT_SHARED_LIBRARIES) \
1327940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	  dalvikvm -XXlib:libartd.so -Ximage:$(shell pwd)/$(HOST_CORE_IMG_OUT) -Xint -classpath $(HOST_OUT_JAVA_LIBRARIES)/oat-test-dex-$(1).jar -Djava.library.path=$(HOST_OUT_SHARED_LIBRARIES) $(1) $(2) \
1337940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom          && echo test-art-host-interpreter-oat-$(1) PASSED || (echo test-art-host-interpreter-oat-$(1) FAILED && exit 1)
1347940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom	$(hide) rm -r /tmp/android-data/test-art-host-interpreter-oat-$(1)
1357940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1367940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_TARGET_OAT_TARGETS += test-art-target-oat-$(1)
1377940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_HOST_OAT_TARGETS += test-art-host-oat-$(1)
1387940e44f4517de5e2634a7e07d58d0fb26160513Brian CarlstromART_TEST_HOST_INTERPRETER_OAT_TARGETS += test-art-host-interpreter-oat-$(1)
1397940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstromendef
1407940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom$(foreach dir,$(TEST_OAT_DIRECTORIES), $(eval $(call declare-test-art-oat-targets,$(dir))))
1417940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1427940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom########################################################################
1437940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
144011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangTEST_ART_RUN_TEST_MAKE_TARGETS :=
145011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
146011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# Helper to create individual build targets for tests.
147011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# Must be called with $(eval)
148011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# $(1): the test number
149011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuangdefine declare-make-art-run-test
150011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuangdmart_target := $(TARGET_OUT_DATA)/art-run-tests/$(1)/touch
1516674f8ae6bb390e61cfdccb6e5825ac952584f2dTsu Chiang Chuang$$(dmart_target): $(DX) $(HOST_OUT_EXECUTABLES)/jasmin
152011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang	$(hide) rm -rf $$(dir $$@) && mkdir -p $$(dir $$@)
1536674f8ae6bb390e61cfdccb6e5825ac952584f2dTsu Chiang Chuang	$(hide) DX=$(abspath $(DX)) JASMIN=$(abspath $(HOST_OUT_EXECUTABLES)/jasmin) $(LOCAL_PATH)/run-test --build-only --output-path $$(abspath $$(dir $$@)) $(1)
154011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang	$(hide) touch $$@
155011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
1567940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
157011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangTEST_ART_RUN_TEST_MAKE_TARGETS += $$(dmart_target)
158011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuangdmart_target :=
159011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuangendef
160011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
161011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# Expand all tests.
1627940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom$(foreach test, $(wildcard $(LOCAL_PATH)/[0-9]*), $(eval $(call declare-make-art-run-test,$(notdir $(test)))))
163011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
164011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuanginclude $(CLEAR_VARS)
165011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangLOCAL_MODULE_TAGS := tests
166011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangLOCAL_MODULE := art-run-tests
167011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangLOCAL_ADDITIONAL_DEPENDENCIES := $(TEST_ART_RUN_TEST_MAKE_TARGETS)
168011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuanginclude $(BUILD_PHONY_PACKAGE)
169011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang
170011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuang# clear temp vars
171011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang ChuangTEST_ART_RUN_TEST_MAKE_TARGETS :=
172011fade82899fe3607789ca061e3a6c7fa4c71f4Tsu Chiang Chuangdeclare-make-art-run-test :=
1737940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom
1747940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom########################################################################
175