////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package
{
 	internal class AutomationCoreClasses
	{
        import UnitTest.ExtendedClasses.VellumTestCase; VellumTestCase;
        import UnitTest.Validation.BoundsChecker; BoundsChecker;
        import UnitTest.Validation.CompositionResults; CompositionResults;
        import UnitTest.Validation.SelectionEventValidator; SelectionEventValidator;
        import UnitTest.Validation.DamageEventValidator; DamageEventValidator;
        import UnitTest.Validation.StatusChangeEventValidator; StatusChangeEventValidator;
        import UnitTest.Validation.FlowOperationEventValidator; FlowOperationEventValidator;
        import UnitTest.Validation.CompositionCompleteEventValidator; CompositionCompleteEventValidator;
        import UnitTest.Validation.FlowElementMouseEventValidator; FlowElementMouseEventValidator;
        import UnitTest.Validation.EventValidator; EventValidator;
        import UnitTest.Validation.UpdateCompleteEventValidator; UpdateCompleteEventValidator;
        import UnitTest.Fixtures.TestEditManager; TestEditManager;
        import UnitTest.Fixtures.MeasureConstants; MeasureConstants;

		/*import UnitTest.ExtendedClasses.TestDescriptor; TestDescriptor;
		import UnitTest.ExtendedClasses.TestSuiteExtended; TestSuiteExtended;
		import UnitTest.ExtendedClasses.VellumPerformanceCase; VellumPerformanceCase;

		import UnitTest.Fixtures.FileRepository; FileRepository;
		import UnitTest.Fixtures.TestApp; TestApp;
		import UnitTest.Fixtures.TestConfig; TestConfig;
		import UnitTest.Fixtures.TestEditManager; TestEditManager;


		import UnitTest.Validation.LineSnapshot; LineSnapshot;

		import UnitTest.Validation.XMLSnapshot; XMLSnapshot;     */
		// Alphabetical list of classes to be included as part of vellum.swc.
		// This should mirror what's in the .flexLibProperties
	}
}

