From 57ccf14952915bddbc22222c50a8a94500bc9fa1 Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Wed, 14 Aug 2019 13:33:49 -0400 Subject: [PATCH] FIx misc. source and comment typos Found via `codespell -q 3 -S ./3rdparty,./modules -L amin,ang,atleast,dof,endwhile,hist,uint` backporting of commit: 32aba5e64ba40b372f02b5fab18c9632f763bb75 --- apps/createsamples/utility.cpp | 4 ++-- cmake/FindCUDA/run_nvcc.cmake | 2 +- cmake/OpenCVCompilerOptimizations.cmake | 2 +- cmake/OpenCVDetectApacheAnt.cmake | 2 +- cmake/OpenCVDetectInferenceEngine.cmake | 2 +- cmake/OpenCVDetectPython.cmake | 2 +- cmake/OpenCVUtils.cmake | 2 +- cmake/android/android_ant_projects.cmake | 2 +- doc/js_tutorials/js_video/js_lucas_kanade/js_lucas_kanade.markdown | 2 +- doc/tutorials/calib3d/real_time_pose/real_time_pose.markdown | 4 ++-- .../features2d/feature_flann_matcher/feature_flann_matcher.markdown | 4 ++-- doc/tutorials/imgcodecs/raster-gdal/raster_io_gdal.markdown | 2 +- .../gausian_median_blur_bilateral_filter.markdown | 2 +- doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md | 2 +- doc/tutorials/introduction/transition_guide/transition_guide.markdown | 2 +- doc/tutorials/ios/video_processing/video_processing.markdown | 2 +- doc/tutorials/ml/non_linear_svms/non_linear_svms.markdown | 2 +- .../objdetect/cascade_classifier/cascade_classifier.markdown | 2 +- doc/tutorials/video/optical_flow/optical_flow.markdown | 2 +- samples/cpp/stitching_detailed.cpp | 2 +- samples/cpp/videocapture_gphoto2_autofocus.cpp | 2 +- samples/directx/d3d11_interop.cpp | 2 +- samples/dnn/face_detector/how_to_train_face_detector.txt | 2 +- samples/dnn/openpose.py | 2 +- samples/opencl/opencl-opencv-interop.cpp | 2 +- .../tutorial_code/imgProc/threshold_inRange/threshold_inRange.py | 2 +- .../objectDetection/cascade_classifier/objectDetection.py | 2 +- 27 files changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/createsamples/utility.cpp b/apps/createsamples/utility.cpp index ab1ca1c..919ad2d 100644 --- a/apps/createsamples/utility.cpp +++ b/apps/createsamples/utility.cpp @@ -895,7 +895,7 @@ void icvGetNextFromBackgroundData( CvBackgroundData* data, * #pragma omp parallel * { * ... - * icvGetBackgourndImage( cvbgdata, cvbgreader, img ); + * icvGetBackgroundImage( cvbgdata, cvbgreader, img ); * ... * } * ... @@ -990,7 +990,7 @@ static int icvInitBackgroundReaders( const char* filename, Size winsize ) /* * icvDestroyBackgroundReaders * - * Finish backgournd reading process + * Finish background reading process */ static void icvDestroyBackgroundReaders() diff --git a/cmake/FindCUDA/run_nvcc.cmake b/cmake/FindCUDA/run_nvcc.cmake index c372fe4..25527b6 100644 --- a/cmake/FindCUDA/run_nvcc.cmake +++ b/cmake/FindCUDA/run_nvcc.cmake @@ -136,7 +136,7 @@ macro(cuda_execute_process status command) # copy and paste a runnable command line. set(cuda_execute_process_string) foreach(arg ${ARGN}) - # If there are quotes, excape them, so they come through. + # If there are quotes, escape them, so they come through. string(REPLACE "\"" "\\\"" arg ${arg}) # Args with spaces need quotes around them to get them to be parsed as a single argument. if(arg MATCHES " ") diff --git a/cmake/OpenCVCompilerOptimizations.cmake b/cmake/OpenCVCompilerOptimizations.cmake index 9e46917..92cce39 100644 --- a/cmake/OpenCVCompilerOptimizations.cmake +++ b/cmake/OpenCVCompilerOptimizations.cmake @@ -854,7 +854,7 @@ macro(__ocv_add_dispatched_file filename target_src_var src_directory dst_direct if(";${CPU_DISPATCH_FINAL};" MATCHES "${OPT}" OR __CPU_DISPATCH_INCLUDE_ALL) if(EXISTS "${src_directory}/${filename}.${OPT_LOWER}.cpp") - message(STATUS "Using overrided ${OPT} source: ${src_directory}/${filename}.${OPT_LOWER}.cpp") + message(STATUS "Using overridden ${OPT} source: ${src_directory}/${filename}.${OPT_LOWER}.cpp") else() list(APPEND ${target_src_var} "${__file}") endif() diff --git a/cmake/OpenCVDetectApacheAnt.cmake b/cmake/OpenCVDetectApacheAnt.cmake index 2f82438..330ea9f 100644 --- a/cmake/OpenCVDetectApacheAnt.cmake +++ b/cmake/OpenCVDetectApacheAnt.cmake @@ -27,7 +27,7 @@ if(ANT_EXECUTABLE) unset(ANT_EXECUTABLE CACHE) else() string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" ANT_VERSION "${ANT_VERSION_FULL}") - set(ANT_VERSION "${ANT_VERSION}" CACHE INTERNAL "Detected ant vesion") + set(ANT_VERSION "${ANT_VERSION}" CACHE INTERNAL "Detected ant version") message(STATUS "Found apache ant: ${ANT_EXECUTABLE} (${ANT_VERSION})") endif() diff --git a/cmake/OpenCVDetectInferenceEngine.cmake b/cmake/OpenCVDetectInferenceEngine.cmake index 10901be..a4d0bbd 100644 --- a/cmake/OpenCVDetectInferenceEngine.cmake +++ b/cmake/OpenCVDetectInferenceEngine.cmake @@ -5,7 +5,7 @@ # # Detect parameters: # 1. Native cmake IE package: -# - enironment variable InferenceEngine_DIR is set to location of cmake module +# - environment variable InferenceEngine_DIR is set to location of cmake module # 2. Custom location: # - INF_ENGINE_INCLUDE_DIRS - headers search location # - INF_ENGINE_LIB_DIRS - library search location diff --git a/cmake/OpenCVDetectPython.cmake b/cmake/OpenCVDetectPython.cmake index c3c4670..1b1fbf1 100644 --- a/cmake/OpenCVDetectPython.cmake +++ b/cmake/OpenCVDetectPython.cmake @@ -249,7 +249,7 @@ if(NOT ${found}) # Export return values set(${found} "${_found}" CACHE INTERNAL "") - set(${executable} "${_executable}" CACHE FILEPATH "Path to Python interpretor") + set(${executable} "${_executable}" CACHE FILEPATH "Path to Python interpreter") set(${version_string} "${_version_string}" CACHE INTERNAL "") set(${version_major} "${_version_major}" CACHE INTERNAL "") set(${version_minor} "${_version_minor}" CACHE INTERNAL "") diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index 5417714..7317398 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -782,7 +782,7 @@ macro(ocv_check_modules define) if(pkgcfg_lib_${define}_${_lib}) list(APPEND _libs "${pkgcfg_lib_${define}_${_lib}}") else() - message(WARNING "ocv_check_modules(${define}): can't find library '${_lib}'. Specify 'pkgcfg_lib_${define}_${_lib}' manualy") + message(WARNING "ocv_check_modules(${define}): can't find library '${_lib}'. Specify 'pkgcfg_lib_${define}_${_lib}' manually") list(APPEND _libs "${_lib}") endif() else() diff --git a/cmake/android/android_ant_projects.cmake b/cmake/android/android_ant_projects.cmake index ed9ce43..f80a81a 100644 --- a/cmake/android/android_ant_projects.cmake +++ b/cmake/android/android_ant_projects.cmake @@ -49,7 +49,7 @@ macro(android_get_compatible_target VAR) list(GET ANDROID_SDK_TARGETS 0 __lvl) string(REGEX MATCH "[0-9]+$" __lvl "${__lvl}") - #find minimal level mathing to all provided levels + #find minimal level matching to all provided levels foreach(lvl ${ARGN}) string(REGEX MATCH "[0-9]+$" __level "${lvl}") if(__level GREATER __lvl) diff --git a/doc/js_tutorials/js_video/js_lucas_kanade/js_lucas_kanade.markdown b/doc/js_tutorials/js_video/js_lucas_kanade/js_lucas_kanade.markdown index 1d8fa29..a86bf11 100644 --- a/doc/js_tutorials/js_video/js_lucas_kanade/js_lucas_kanade.markdown +++ b/doc/js_tutorials/js_video/js_lucas_kanade/js_lucas_kanade.markdown @@ -13,7 +13,7 @@ Optical Flow ------------ Optical flow is the pattern of apparent motion of image objects between two consecutive frames -caused by the movemement of object or camera. It is 2D vector field where each vector is a +caused by the movement of object or camera. It is 2D vector field where each vector is a displacement vector showing the movement of points from first frame to second. Consider the image below (Image Courtesy: [Wikipedia article on Optical Flow](http://en.wikipedia.org/wiki/Optical_flow)). diff --git a/doc/tutorials/calib3d/real_time_pose/real_time_pose.markdown b/doc/tutorials/calib3d/real_time_pose/real_time_pose.markdown index 4347d11..e05e6e1 100644 --- a/doc/tutorials/calib3d/real_time_pose/real_time_pose.markdown +++ b/doc/tutorials/calib3d/real_time_pose/real_time_pose.markdown @@ -253,8 +253,8 @@ Here is explained in detail the code for the real time application: @code{.cpp} RobustMatcher rmatcher; // instantiate RobustMatcher - cv::FeatureDetector * detector = new cv::OrbFeatureDetector(numKeyPoints); // instatiate ORB feature detector - cv::DescriptorExtractor * extractor = new cv::OrbDescriptorExtractor(); // instatiate ORB descriptor extractor + cv::FeatureDetector * detector = new cv::OrbFeatureDetector(numKeyPoints); // instantiate ORB feature detector + cv::DescriptorExtractor * extractor = new cv::OrbDescriptorExtractor(); // instantiate ORB descriptor extractor rmatcher.setFeatureDetector(detector); // set feature detector rmatcher.setDescriptorExtractor(extractor); // set descriptor extractor diff --git a/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.markdown b/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.markdown index de04f63..4b3f3da 100644 --- a/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.markdown +++ b/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.markdown @@ -29,8 +29,8 @@ This distance is equivalent to count the number of different elements for binary To filter the matches, Lowe proposed in @cite Lowe:2004:DIF:993451.996342 to use a distance ratio test to try to eliminate false matches. The distance ratio between the two nearest matches of a considered keypoint is computed and it is a good match when this value is below -a thresold. Indeed, this ratio allows helping to discriminate between ambiguous matches (distance ratio between the two nearest neighbors is -close to one) and well discriminated matches. The figure below from the SIFT paper illustrates the probability that a match is correct +a threshold. Indeed, this ratio allows helping to discriminate between ambiguous matches (distance ratio between the two nearest neighbors +is close to one) and well discriminated matches. The figure below from the SIFT paper illustrates the probability that a match is correct based on the nearest-neighbor distance ratio test. ![](images/Feature_FlannMatcher_Lowe_ratio_test.png) diff --git a/doc/tutorials/imgcodecs/raster-gdal/raster_io_gdal.markdown b/doc/tutorials/imgcodecs/raster-gdal/raster_io_gdal.markdown index 2193d26..432caa6 100644 --- a/doc/tutorials/imgcodecs/raster-gdal/raster_io_gdal.markdown +++ b/doc/tutorials/imgcodecs/raster-gdal/raster_io_gdal.markdown @@ -15,7 +15,7 @@ The primary objectives for this tutorial: - How to use OpenCV [imread](@ref imread) to load satellite imagery. - How to use OpenCV [imread](@ref imread) to load SRTM Digital Elevation Models -- Given the corner coordinates of both the image and DEM, correllate the elevation data to the +- Given the corner coordinates of both the image and DEM, correlate the elevation data to the image to find elevations for each pixel. - Show a basic, easy-to-implement example of a terrain heat map. - Show a basic use of DEM data coupled with ortho-rectified imagery. diff --git a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown index 92dd1d5..2cab30b 100644 --- a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown +++ b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown @@ -157,7 +157,7 @@ already known by now. - *src*: Source image - *dst*: Destination image - *Size(w, h)*: The size of the kernel to be used (the neighbors to be considered). \f$w\f$ and - \f$h\f$ have to be odd and positive numbers otherwise thi size will be calculated using the + \f$h\f$ have to be odd and positive numbers otherwise the size will be calculated using the \f$\sigma_{x}\f$ and \f$\sigma_{y}\f$ arguments. - \f$\sigma_{x}\f$: The standard deviation in x. Writing \f$0\f$ implies that \f$\sigma_{x}\f$ is calculated using kernel size. diff --git a/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md b/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md index cf0e797..ccce362 100644 --- a/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md +++ b/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md @@ -30,7 +30,7 @@ Two of the most basic morphological operations are dilation and erosion. Dilatio ![Dilation on a Grayscale Image](images/morph6.gif) -- __Erosion__: The vise versa applies for the erosion operation. The value of the output pixel is the minimum value of all the pixels that fall within the structuring element's size and shape. Look the at the example figures below: +- __Erosion__: The vice versa applies for the erosion operation. The value of the output pixel is the minimum value of all the pixels that fall within the structuring element's size and shape. Look the at the example figures below: ![Erosion on a Binary Image](images/morph211.png) diff --git a/doc/tutorials/introduction/transition_guide/transition_guide.markdown b/doc/tutorials/introduction/transition_guide/transition_guide.markdown index a1df271..c5c4320 100644 --- a/doc/tutorials/introduction/transition_guide/transition_guide.markdown +++ b/doc/tutorials/introduction/transition_guide/transition_guide.markdown @@ -191,7 +191,7 @@ brief->compute(gray, query_kpts, query_desc); //Compute brief descriptors at eac OpenCL {#tutorial_transition_hints_opencl} ------ -All specialized `ocl` implemetations has been hidden behind general C++ algorithm interface. Now the function execution path can be selected dynamically at runtime: CPU or OpenCL; this mechanism is also called "Transparent API". +All specialized `ocl` implementations has been hidden behind general C++ algorithm interface. Now the function execution path can be selected dynamically at runtime: CPU or OpenCL; this mechanism is also called "Transparent API". New class cv::UMat is intended to hide data exchange with OpenCL device in a convenient way. diff --git a/doc/tutorials/ios/video_processing/video_processing.markdown b/doc/tutorials/ios/video_processing/video_processing.markdown index 2776219..43b0b96 100644 --- a/doc/tutorials/ios/video_processing/video_processing.markdown +++ b/doc/tutorials/ios/video_processing/video_processing.markdown @@ -101,7 +101,7 @@ using namespace cv; } @endcode In this case, we initialize the camera and provide the imageView as a target for rendering each -frame. CvVideoCamera is basically a wrapper around AVFoundation, so we provie as properties some of +frame. CvVideoCamera is basically a wrapper around AVFoundation, so we provide as properties some of the AVFoundation camera options. For example we want to use the front camera, set the video size to 352x288 and a video orientation (the video camera normally outputs in landscape mode, which results in transposed data when you design a portrait application). diff --git a/doc/tutorials/ml/non_linear_svms/non_linear_svms.markdown b/doc/tutorials/ml/non_linear_svms/non_linear_svms.markdown index d193e3a..74a1559 100644 --- a/doc/tutorials/ml/non_linear_svms/non_linear_svms.markdown +++ b/doc/tutorials/ml/non_linear_svms/non_linear_svms.markdown @@ -13,7 +13,7 @@ In this tutorial you will learn how to: Motivation ---------- -Why is it interesting to extend the SVM optimation problem in order to handle non-linearly separable +Why is it interesting to extend the SVM optimization problem in order to handle non-linearly separable training data? Most of the applications in which SVMs are used in computer vision require a more powerful tool than a simple linear classifier. This stems from the fact that in these tasks __the training data can be rarely separated using an hyperplane__. diff --git a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown index 27a506f..936b6c3 100644 --- a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown +++ b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown @@ -113,7 +113,7 @@ This tutorial code's is shown lines below. You can also download it from Result ------ --# Here is the result of running the code above and using as input the video stream of a build-in +-# Here is the result of running the code above and using as input the video stream of a built-in webcam: ![](images/Cascade_Classifier_Tutorial_Result_Haar.jpg) diff --git a/doc/tutorials/video/optical_flow/optical_flow.markdown b/doc/tutorials/video/optical_flow/optical_flow.markdown index b32bf5e..a3e3245 100644 --- a/doc/tutorials/video/optical_flow/optical_flow.markdown +++ b/doc/tutorials/video/optical_flow/optical_flow.markdown @@ -15,7 +15,7 @@ Optical Flow ------------ Optical flow is the pattern of apparent motion of image objects between two consecutive frames -caused by the movemement of object or camera. It is 2D vector field where each vector is a +caused by the movement of object or camera. It is 2D vector field where each vector is a displacement vector showing the movement of points from first frame to second. Consider the image below (Image Courtesy: [Wikipedia article on Optical Flow](http://en.wikipedia.org/wiki/Optical_flow)). diff --git a/samples/cpp/stitching_detailed.cpp b/samples/cpp/stitching_detailed.cpp index f7f87d3..dee3ce5 100644 --- a/samples/cpp/stitching_detailed.cpp +++ b/samples/cpp/stitching_detailed.cpp @@ -581,7 +581,7 @@ int main(int argc, char* argv[]) vector sizes(num_images); vector masks(num_images); - // Preapre images masks + // Prepare images masks for (int i = 0; i < num_images; ++i) { masks[i].create(images[i].size(), CV_8U); diff --git a/samples/cpp/videocapture_gphoto2_autofocus.cpp b/samples/cpp/videocapture_gphoto2_autofocus.cpp index d0baa31..6e635ee 100644 --- a/samples/cpp/videocapture_gphoto2_autofocus.cpp +++ b/samples/cpp/videocapture_gphoto2_autofocus.cpp @@ -41,7 +41,7 @@ const int MAX_FOCUS_STEP = 32767; const int FOCUS_DIRECTION_INFTY = 1; const int DEFAULT_BREAK_LIMIT = 5; const int DEFAULT_OUTPUT_FPS = 20; -const double epsylon = 0.0005; // compression, noice, etc. +const double epsylon = 0.0005; // compression, noise, etc. struct Args_t { diff --git a/samples/directx/d3d11_interop.cpp b/samples/directx/d3d11_interop.cpp index d00f7cf..df40dd3 100644 --- a/samples/directx/d3d11_interop.cpp +++ b/samples/directx/d3d11_interop.cpp @@ -83,7 +83,7 @@ public: r = m_pD3D11SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&m_pBackBuffer); if (FAILED(r)) { - throw std::runtime_error("GetBufer() failed!"); + throw std::runtime_error("GetBuffer() failed!"); } r = m_pD3D11Dev->CreateRenderTargetView(m_pBackBuffer, NULL, &m_pRenderTarget); diff --git a/samples/dnn/face_detector/how_to_train_face_detector.txt b/samples/dnn/face_detector/how_to_train_face_detector.txt index 1160229..3f6b1ba 100644 --- a/samples/dnn/face_detector/how_to_train_face_detector.txt +++ b/samples/dnn/face_detector/how_to_train_face_detector.txt @@ -67,7 +67,7 @@ You need to prepare 2 LMDB databases: one for training images, one for validatio 3. Train your detector For training you need to have 3 files: train.prototxt, test.prototxt and solver.prototxt. You can find these files in the same directory as for this readme. -Also you need to edit train.prototxt and test.prototxt to replace paths for your LMDB databases to actual databases you've crated in step 2. +Also you need to edit train.prototxt and test.prototxt to replace paths for your LMDB databases to actual databases you've created in step 2. Now all is done for launch training process. Execute next lines in Terminal: diff --git a/samples/dnn/openpose.py b/samples/dnn/openpose.py index e6bb1ba..b79ccd5 100644 --- a/samples/dnn/openpose.py +++ b/samples/dnn/openpose.py @@ -88,7 +88,7 @@ while cv.waitKey(1) < 0: points = [] for i in range(len(BODY_PARTS)): - # Slice heatmap of corresponging body's part. + # Slice heatmap of corresponding body's part. heatMap = out[0, i, :, :] # Originally, we try to find all the local maximums. To simplify a sample diff --git a/samples/opencl/opencl-opencv-interop.cpp b/samples/opencl/opencl-opencv-interop.cpp index d3b1566..f648f78 100644 --- a/samples/opencl/opencl-opencv-interop.cpp +++ b/samples/opencl/opencl-opencv-interop.cpp @@ -703,7 +703,7 @@ int App::process_frame_with_open_cl(cv::Mat& frame, bool use_buffer, cl_mem* mem if (0 == mem || 0 == m_img_src) { // allocate/delete cl memory objects every frame for the simplicity. - // in real applicaton more efficient pipeline can be built. + // in real application more efficient pipeline can be built. if (use_buffer) { diff --git a/samples/python/tutorial_code/imgProc/threshold_inRange/threshold_inRange.py b/samples/python/tutorial_code/imgProc/threshold_inRange/threshold_inRange.py index d54d93c..4905a2e 100644 --- a/samples/python/tutorial_code/imgProc/threshold_inRange/threshold_inRange.py +++ b/samples/python/tutorial_code/imgProc/threshold_inRange/threshold_inRange.py @@ -66,7 +66,7 @@ def on_high_V_thresh_trackbar(val): cv.setTrackbarPos(high_V_name, window_detection_name, high_V) parser = argparse.ArgumentParser(description='Code for Thresholding Operations using inRange tutorial.') -parser.add_argument('--camera', help='Camera devide number.', default=0, type=int) +parser.add_argument('--camera', help='Camera divide number.', default=0, type=int) args = parser.parse_args() ## [cap] diff --git a/samples/python/tutorial_code/objectDetection/cascade_classifier/objectDetection.py b/samples/python/tutorial_code/objectDetection/cascade_classifier/objectDetection.py index 5ac5575..d9fb460 100644 --- a/samples/python/tutorial_code/objectDetection/cascade_classifier/objectDetection.py +++ b/samples/python/tutorial_code/objectDetection/cascade_classifier/objectDetection.py @@ -25,7 +25,7 @@ def detectAndDisplay(frame): parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.') parser.add_argument('--face_cascade', help='Path to face cascade.', default='data/haarcascades/haarcascade_frontalface_alt.xml') parser.add_argument('--eyes_cascade', help='Path to eyes cascade.', default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml') -parser.add_argument('--camera', help='Camera devide number.', type=int, default=0) +parser.add_argument('--camera', help='Camera divide number.', type=int, default=0) args = parser.parse_args() face_cascade_name = args.face_cascade -- 2.7.4